ZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwODYyOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIyBNYXBsZSBBUEkgQ0xJCisjCitpZmVxICgkKEVOQUJMRV9DTEkpLCB5KQorICAgIE1PRF9OQU1FID0gYXBpX2NsaQorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSBjb21tb25fYXBpIG1vZGVsIGRldmljZV9zZWxlY3RvcgorICAgIAorICAgIHNyY3MgPSBiY21fYXBpX2NsaS5jIGJjbV9hcGlfY2xpX2R1bXAuYyBiY21fYXBpX2NsaV9oYW5kbGVycy5jIGJjbV9hcGlfY2xpX2hlbHBlcnMuYyAKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTI2NjZmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGkuYwpAQCAtMCwwICsxLDEyMTEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb3NfdHlwZXMuaD4KKworI2luY2x1ZGUgImJjbV9hcGlfY2xpLmgiCisjaW5jbHVkZSAiYmNtX2FwaV9jbGlfaGVscGVycy5oIgorI2luY2x1ZGUgImJjbV9hcGlfY2xpX2hhbmRsZXJzLmgiCisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwLCB0eXBlKSAgICAgICAodHlwZSkoKGxvbmcpKHApKQorCisvKiBib29sIGVudW0gdGFibGUgKi8KK3N0YXRpYyBiY21jbGlfZW51bV92YWwgYm9vbF9lbnVtW10gPQoreworICAgIHsgLm5hbWUgPSAieWVzIiwgLnZhbCA9IDEgfSwKKyAgICB7IC5uYW1lID0gIm5vIiwgLnZhbCA9IDAgfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgYm9vbF90eXBlX2Rlc2NyID0geworICAgIC5uYW1lID0gImJvb2wiLAorICAgIC5kZXNjciA9ICJCb29sZWFuIiwKKyAgICAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLAorICAgIC5zaXplID0gc2l6ZW9mKGJjbW9zX2Jvb2wpLAorICAgIC54ID0gey5lID0gYm9vbF9lbnVtfQorfTsKKworLyogcGFyYW1ldGVyIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnByb3A7ICAgICAgLyogcHJvcGVydHkgKi8KKyAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZpZWxkOyAgICAvKiBmaWVsZCBvciBOVUxMICovCisgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICphcnJheV9mZDsgLyogYXJyYXkgZmllbGQgZGVzY3JpcHRvciBvciBOVUxMICovCisgICAgdWludDE2X3Qgb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvcGVydHkgKi8KKyAgICB1aW50MTZfdCBhcnJheV9mZF9vZmZzZXQ7ICAgICAgICAgICAvKiBvZmZzZXQgb2YgYXJyYXlfZmQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9wZXJ0eSAqLworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7ICAgICAgICAgICAgIC8qIG1hbmFnZW1lbnQgZ3JvdXAgKi8KK30gYXBpY2xpX3Bhcm1fZGF0YTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQVBJX0NMSV9GTEFHU19OT05FID0gMCwKKyAgICBBUElfQ0xJX0ZMQUdTX0lHTk9SRV9GSUVMRFMgPSAxIDw8IDAsCisgICAgQVBJX0NMSV9GTEFHU19NVUxUSSA9IDEgPDwgMQorfSBhcGlfY2xpX2ZsYWdzOworCisvKiBPcGVyYXRpb246IHNldCwgZ2V0LCBtb2RpZnkgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEFQSV9DTElfT1BFUl9TRVQsCisgICAgQVBJX0NMSV9PUEVSX0dFVCwKKyAgICBBUElfQ0xJX09QRVJfTU9ESUZZLAorfSBhcGlfY2xpX29wZXI7CisKKy8qIEN1cnJlbnQgc2Vzc2lvbiAqLworc3RhdGljIGJjbWNsaV9zZXNzaW9uICpjdXJyZW50X3Nlc3Npb247CisKKy8qIEN1cnJlbnQgc3lzdGVtIG1vZGUgKi8KK3N0YXRpYyBiY21vbHRfc3lzdGVtX21vZGUgY3VycmVudF9zeXN0ZW1fbW9kZTsKKworLyogUGFyZW50IGRpcmVjdG9yeSAqLworc3RhdGljIGJjbWNsaV9lbnRyeSAqYXBpX3BhcmVudF9kaXI7CisKKy8qCisgKiBoZWxwZXJzCisgKi8KKworLyogY2FsY3VsYXRlIG51bWJlciBvZiBmaWVsZHMgaW4gdHlwZSAqLworc3RhdGljIHVpbnQzMl90IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUoY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkKQoreworICAgIHVpbnQxNl90IGY7CisgICAgdWludDMyX3QgbmYgPSAwOworCisKKyAgICBzd2l0Y2ggKHRkLT5iYXNlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNUOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXRkLT54LnMubnVtX2ZpZWxkcykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIEJVR19PTighdGQtPngucy5maWVsZHMpOworICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnMubnVtX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5mICs9ICBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKHRkLT54LnMuZmllbGRzW2ZdLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT046CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVuaW9uLiBDb3VudCBvbmx5IGNvbW1vbiBmaWVsZHMgKi8KKyAgICAgICAgICAgIG5mID0gdGQtPngudS5udW1fY29tbW9uX2ZpZWxkczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRDoKKyAgICAgICAgeworICAgICAgICAgICAgbmYgPSBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKHRkLT54LmFycl9maXhlZC5lbGVtX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTjoKKyAgICAgICAgeworICAgICAgICAgICAgbmYgPSBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKHRkLT54LmFycl9keW4uZWxlbV90eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgbmYgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmY7Cit9CisKKy8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgcHJvcGVydHkgZmllbGRzIGZvciBnaXZlbiBvYmplY3QrZ3JvdXArc3ViZ3JvdXArYWNjZXNzLiBzaW1wbGUgcHJvcGVydHk9c2luZ2xlIGZpZWxkICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fZ3JvdXAoYmNtb2x0X29ial9pZCBvLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwKKyAgICBiY21vbHRfcHJvcF9hY2Nlc3NfaWQgYWNjZXNzX2xldmVsLCB1aW50MzJfdCAqbmZpZWxkcykKK3sKKyAgICB1aW50MzJfdCBuZiA9IDA7CisgICAgaW50IGk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgZm9yIChpID0gMDsgcmMgIT0gQkNNX0VSUl9SQU5HRTsgaSsrKQorICAgIHsKKyAgICAgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworICAgICAgICByYyA9IGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG8sIGdyb3VwLCBzdWJncm91cCwgaSwgJnBkKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0sgJiYgKHBkLT5hY2Nlc3MgJiBhY2Nlc3NfbGV2ZWwpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGZpZWxkcyBpZiB3cml0ZSBhY2Nlc3MuIENvdW50IG9ubHkgcHJvcGVydGllcyBmb3IgcmVhZCBhY2Nlc3MgKi8KKyAgICAgICAgICAgIGlmICgoYWNjZXNzX2xldmVsICYgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1cpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQlVHX09OKCFwZC0+dHlwZSk7CisgICAgICAgICAgICAgICAgbmYgKz0gX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fdHlwZShwZC0+dHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytuZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqbmZpZWxkcyA9IG5mOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qCisgKiBDb21tYW5kIGhhbmRsZXJzCisgKi8KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfb2JqZWN0c19oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgaW50IHJjOworICAgIGJjbW9sdF9vYmpfaWQgbzsKKyAgICBjb25zdCBjaGFyICpuYW1lLCAqZGVzY3I7CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlN5c3RlbSBPYmplY3QgVHlwZXM6XG4iKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJJZCAgIE5hbWUgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiIpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBmb3IgKG8gPSAwOyBvIDwgQkNNT0xUX09CSl9JRF9fTlVNX09GOyBvKyspCisgICAgeworCisgICAgICAgIGlmIChjdXJyZW50X3N5c3RlbV9tb2RlIDwgQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0YgJiYgIWJjbW9sdF9vYmplY3RfaXNfc3VwcG9ydGVkKGN1cnJlbnRfc3lzdGVtX21vZGUsIG8pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcmMgPSBhcGlfY2xpX29iamVjdF9uYW1lKG8sICZuYW1lLCAmZGVzY3IpOworICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLjRkICUtMjJzICVzXG4iLCBvLCBuYW1lLCBkZXNjcik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3NldF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfU0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZ2V0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIEJDTU9MVF9NU0dfVFlQRV9HRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9jbGVhcl9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9zdGF0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCBCQ01PTFRfTVNHX1RZUEVfR0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfb3Blcl9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX01TR19UWVBFX1NFVCwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3NlbmRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfTVNHX1RZUEVfU0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfc3RhdF9jZmdfc2V0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgQkNNT0xUX01TR19UWVBFX1NFVCwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3N0YXRfY2ZnX2dldF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIEJDTU9MVF9NU0dfVFlQRV9HRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9hdXRvX2NmZ19zZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfU0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfYXV0b19jZmdfZ2V0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgQkNNT0xUX01TR19UWVBFX0dFVCwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2F1dG9fY2ZnX2dldF9tdWx0aV9oYW5kbGVyKAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSSwgc2Vzc2lvbik7Cit9CisKKy8qCisgKiBJbml0LXRpbWUgaGVscGVycworICovCisKKy8qIG1hcCB0byBDTEkgdHlwZSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGlfY2xpX21hcF90eXBlKGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKmFycmF5X3RkLCBiY21jbGlfY21kX3Bhcm0gKmNtZF9wYXJtKQoreworICAgIGFwaWNsaV9wYXJtX2RhdGEgKnBhcm1fZGF0YSA9IGNtZF9wYXJtLT51c2VyX2RhdGE7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogTWFwIHR5cGUgKi8KKyAgICBzd2l0Y2godGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU06CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fTlVNQkVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTToKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9VTlVNQkVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVg6CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fSEVYOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQk9PTDoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgICAgICBjbWRfcGFybS0+ZW51bV90YWJsZSA9IGJvb2xfZW51bTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0ZMT0FUOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IHRkLT5zaXplID09IHNpemVvZihkb3VibGUpID8gQkNNQ0xJX1BBUk1fRE9VQkxFIDogQkNNQ0xJX1BBUk1fRkxPQVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJJTkc6CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fU1RSSU5HOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfSVBWNDoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9JUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX01BQzoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9NQUM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgICAgIGNtZF9wYXJtLT5lbnVtX3RhYmxlID0gdGQtPnguZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSzoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNX01BU0s7CisgICAgICAgIGNtZF9wYXJtLT5lbnVtX3RhYmxlID0gdGQtPnguZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3ByaW50KGN1cnJlbnRfc2Vzc2lvbiwgIioqKiBjYW4ndCBtYXAgdHlwZSAlcyAoJWQpXG4iLCB0ZC0+bmFtZSwgKGludCl0ZC0+YmFzZV90eXBlKTsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIE1hcCB1aW50OF90IGFycmF5IHRvIGJ1ZmZlciBpZiBpdCBpcyBpbmRlcGVuZGVudCAobm90IHN0cnVjdHVyZSBmaWVsZCkgKi8KKyAgICBpZiAoYXJyYXlfdGQgJiYKKyAgICAgICAgdGQtPnNpemUgPT0gMSAmJgorICAgICAgICAodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0gfHwgdGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYKSAmJgorICAgICAgICAocGFybV9kYXRhLT5hcnJheV9mZCA9PSBwYXJtX2RhdGEtPmZpZWxkIHx8ICFwYXJtX2RhdGEtPmZpZWxkKSkKKyAgICB7CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fQlVGRkVSOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyogYWxsb2NhdGUgbWVtb3J5IGZvciBuYW1lIGFuZCBkZXNjcmlwdGlvbiBhbmQgY29weSB0byB0byBwYXJtICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaV9jbGlfY29weV9wYXJtX25hbWUoYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZXNjcikKK3sKKyAgICBwYXJtLT5uYW1lID0gYmNtb3NfYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisgICAgcGFybS0+ZGVzY3JpcHRpb24gPSBiY21vc19hbGxvYyhzdHJsZW4oZGVzY3IpICsgMSk7CisgICAgaWYgKChwYXJtLT5uYW1lID09IE5VTEwpIHx8IChwYXJtLT5kZXNjcmlwdGlvbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIC8qIFN1Y2Nlc3NmdWwgYWxsb2NhdGlvbiBpZiBhbnkgd2lsbCBiZSByZWxlYXNlZCBieSBjb21tb24gY2xlYW51cAorICAgICAgICAgKiBhbG9uZyB3aXRoIHRoZSByZXN0IG9mIGR5bmFtaWMgcGFyYW1ldGVyIGZpZWxkcyAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgc3RyY3B5KEFQSUNMSV9DQVNUX0RJU0NBUkRfQ09OU1QocGFybS0+bmFtZSwgdm9pZCAqKSwgbmFtZSk7CisgICAgc3RyY3B5KEFQSUNMSV9DQVNUX0RJU0NBUkRfQ09OU1QocGFybS0+ZGVzY3JpcHRpb24sIHZvaWQgKiksIGRlc2NyKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogcG9wdWxhdGUgc2luZ2xlIHBhcmFtZXRlciAqLworc3RhdGljIGludCBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtMShjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmQsIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmFycmF5X2ZkLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGFycmF5X2ZkX29mZnNldCwKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNtZF9wYXJtLCB1aW50MzJfdCBjbWRfZmxhZ3MsIGNoYXIgKm5hbWUsIGNoYXIgKmhlbHApCit7CisgICAgYXBpY2xpX3Bhcm1fZGF0YSAqcGFybV9kYXRhID0gY21kX3Bhcm0tPnVzZXJfZGF0YTsKKyAgICBpbnQgcmM7CisKKyAgICBwYXJtX2RhdGEtPnByb3AgPSBwZDsKKyAgICBwYXJtX2RhdGEtPmZpZWxkID0gZmQ7CisgICAgcGFybV9kYXRhLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgcGFybV9kYXRhLT5hcnJheV9mZCA9IGFycmF5X2ZkOworICAgIHBhcm1fZGF0YS0+YXJyYXlfZmRfb2Zmc2V0ID0gYXJyYXlfZmRfb2Zmc2V0OworCisgICAgcmMgPSBfYXBpX2NsaV9jb3B5X3Bhcm1fbmFtZShjbWRfcGFybSwgbmFtZSwgaGVscCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBjbWRfcGFybS0+ZmxhZ3MgPSBjbWRfZmxhZ3M7CisgICAgaWYgKHRkLT5taW5fdmFsICE9IHRkLT5tYXhfdmFsIHx8IHRkLT5taW5fdmFsKQorICAgIHsKKyAgICAgICAgY21kX3Bhcm0tPmZsYWdzIHw9IEJDTUNMSV9QQVJNX0ZMQUdfUkFOR0U7CisgICAgICAgIGNtZF9wYXJtLT5sb3dfdmFsID0gdGQtPm1pbl92YWw7CisgICAgICAgIGNtZF9wYXJtLT5oaV92YWwgPSB0ZC0+bWF4X3ZhbDsKKyAgICB9CisgICAgcmMgPSBfYXBpX2NsaV9tYXBfdHlwZSh0ZCwgYXJyYXlfZmQgPyBhcnJheV9mZC0+dHlwZSA6IE5VTEwsIGNtZF9wYXJtKTsKKyAgICBpZiAocmMgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIEFycmF5cyByZXF1aXJlIG1vcmUgd29yay4KKyAgICAgKiAtIENhbGN1bGF0ZSBzaXplLiBLbm93biBmb3IgZml4ZWQgYXJyYXlzLCBoYXJkLWNvZGVkIG1heCBmb3IgZHluYW1pYworICAgICAqIC0gQWxsb2NhdGUgZWl0aGVyIGJ1ZmZlciBvciBhcnJheSBvZiB2YWx1ZXMgYmFzZWQgb24gQ0xJIHBhcmFtZXRlciB0eXBlCisgICAgICogLSBDYWxjdWxhdGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBlbnRyeQorICAgICAqLworICAgIGlmIChhcnJheV9mZCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGFycmF5X3NpemU7CisKKyAgICAgICAgaWYgKGFycmF5X2ZkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5X3NpemUgPSBhcnJheV9mZC0+dHlwZS0+eC5hcnJfZml4ZWQuc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5X3NpemUgPSBhcnJheV9mZC0+dHlwZS0+eC5hcnJfZHluLm1heF9zaXplOworICAgICAgICB9CisgICAgICAgIGlmICghYXJyYXlfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KGN1cnJlbnRfc2Vzc2lvbiwgIioqKiBFcnJvciBpbiAlcyBhcnJheSBkZXNjcmlwdG9yLiBTaXplIGlzIG5vdCBzZXQuXG4iLCBhcnJheV9mZC0+bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21kX3Bhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IGJjbW9sdF9idWZfYWxsb2MoJmNtZF9wYXJtLT52YWx1ZS5idWZmZXIsIGFycmF5X3NpemUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjbWRfcGFybS0+dmFsdWVzID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfcGFybV92YWx1ZSkgKiBhcnJheV9zaXplKTsKKyAgICAgICAgICAgIGlmICghY21kX3Bhcm0tPnZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZF9wYXJtLT5tYXhfYXJyYXlfc2l6ZSA9IGFycmF5X3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKiBwb3B1bGF0ZSBuYW1lIGJ1ZiBhbmQgaGVscCBidWYgKi8KK3N0YXRpYyB2b2lkIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZsZCwgY2hhciAqbmFtZV9idWYwLCBjaGFyICpoZWxwX2J1ZjAsCisgICAgY2hhciAqbmFtZV9idWYsIGNoYXIgKmhlbHBfYnVmKQoreworICAgIG5hbWVfYnVmWzBdID0gMDsKKyAgICBoZWxwX2J1ZlswXSA9IDA7CisgICAgYmNtY2xpX3N0cm5jcHkobmFtZV9idWYsIG5hbWVfYnVmMCwgQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIKTsKKyAgICBpZiAoc3RybGVuKG5hbWVfYnVmKSkKKyAgICAgICAgYmNtY2xpX3N0cm5jYXQobmFtZV9idWYsICIuIiwgQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIKTsKKyAgICBiY21jbGlfc3RybmNhdChuYW1lX2J1ZiwgZmxkLT5jbGlfbmFtZSA/IGZsZC0+Y2xpX25hbWUgOiBmbGQtPm5hbWUsIEFQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSCk7CisgICAgYmNtY2xpX3N0cm5jcHkoaGVscF9idWYsIGhlbHBfYnVmMCwgQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIKTsKKyAgICBiY21jbGlfc3RybmNhdChoZWxwX2J1ZiwgIiAtICIsIEFQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSCk7CisgICAgYmNtY2xpX3N0cm5jYXQoaGVscF9idWYsIGZsZC0+ZGVzY3IgPyBmbGQtPmRlc2NyIDogZmxkLT5uYW1lLCBBUElDTElfTUFYX1BBUk1fSEVMUF9MRU5HVEgpOworfQorCisvKiBBbGxvY2F0ZSBDTEkgcGFyYW1ldGVyIGFycmF5LiBTZXQgdXAgcGFybS0+ZGF0YSAqLworc3RhdGljIGJjbWNsaV9jbWRfcGFybSAqX2FwaV9jbGlfcGFybV9hbGxvYyhpbnQgbnBhcm1zKQoreworICAgIHVpbnQzMl90IHNpemU7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtczsKKyAgICBhcGljbGlfcGFybV9kYXRhICpwYXJtX2RhdGE7CisgICAgaW50IGk7CisKKyAgICAvKiBBbGxvY2F0ZSBwYXJhbWV0ZXIgdGFibGUgYW5kIHBvcHVsYXRlIGl0ICovCisgICAgc2l6ZSA9IChzaXplb2YoYmNtY2xpX2NtZF9wYXJtKSArIHNpemVvZihhcGljbGlfcGFybV9kYXRhKSkgKiAobnBhcm1zICsgMSk7CisgICAgcGFybXMgPSBiY21vc19jYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFwYXJtcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBBc3NvY2lhdGUgcGFyYW1ldGVyX2RhdGEgc3RydWN0cyB3aXRoIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJtX2RhdGEgPSAoYXBpY2xpX3Bhcm1fZGF0YSAqKShwYXJtcyArIG5wYXJtcyArIDEpOworICAgIGZvciAoaSA9IDA7IGkgPCBucGFybXM7IGkrKykKKyAgICB7CisgICAgICAgIHBhcm1zW2ldLnVzZXJfZGF0YSA9ICZwYXJtX2RhdGFbaV07CisgICAgfQorICAgIHJldHVybiBwYXJtczsKK30KKworLyogY2xvbmUgZW51bSB0YWJsZSAqLworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCAqX2FwaV9jbGlfY2xvbmVfZW51bV90YWJsZShiY21jbGlfY21kX3Bhcm0gKnBhcm0pCit7CisgICAgYmNtY2xpX2VudW1fdmFsICpvcmdfdGFibGUgPSBwYXJtLT5lbnVtX3RhYmxlOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFsID0gb3JnX3RhYmxlOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqY2xvbmVfdGFibGUgPSBvcmdfdGFibGU7CisgICAgaW50IGksIG47CisKKyAgICBCVUdfT04ocGFybS0+dHlwZSAhPSBCQ01DTElfUEFSTV9FTlVNKTsKKyAgICB3aGlsZSAodmFsICYmIHZhbC0+bmFtZSkKKyAgICB7CisgICAgICAgICsrdmFsOworICAgIH0KKyAgICBuID0gdmFsIC0gb3JnX3RhYmxlOworCisgICAgY2xvbmVfdGFibGUgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkgKiAobiArIDEpKTsKKyAgICBpZiAoIWNsb25lX3RhYmxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICBjbG9uZV90YWJsZVtpXS5uYW1lID0gb3JnX3RhYmxlW2ldLm5hbWU7CisgICAgICAgIGNsb25lX3RhYmxlW2ldLnZhbCA9IG9yZ190YWJsZVtpXS52YWw7CisgICAgfQorICAgIHJldHVybiBjbG9uZV90YWJsZTsKK30KKworCisvKiBwb3B1bGF0ZSBDTEkgcGFyYW1ldGVyKHMpIGZyb20gYSBzaW5nbGUgcHJvcGVydHkuIENhbiBiZSBtdWx0aXBsZSBwYXJhbWV0ZXJzCisgKiBpZiBwcm9wZXJ0eSBjb250YWlucyBtdWx0aXBsZSBmaWVsZHMuCisgKiBSZXR1cm5zIG51bWJlciBvZiBwYXJhbWV0ZXJzIHBvcHVsYXRlZCA+PSAwIG9yIGVycm9yIDwgMAorICovCitzdGF0aWMgaW50IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkoY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZkLAorICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqYXJyYXlfZmQsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgYXJyYXlfZmRfb2Zmc2V0LCBiY21jbGlfY21kX3Bhcm0gKnBhcm1zLAorICAgIGJjbW9sdF9wcm9wX2FjY2Vzc19pZCBhY2Nlc3NfbGV2ZWwsIHVpbnQzMl90IGNtZF9mbGFncywgY2hhciAqbmFtZV9idWYwLCBjaGFyICpoZWxwX2J1ZjApCit7CisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkID0gZmQgPyBmZC0+dHlwZSA6IHBkLT50eXBlOworICAgIHVpbnQzMl90IG5mID0gMDsKKyAgICBjaGFyIG5hbWVfYnVmW0FQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSF07CisgICAgY2hhciBoZWxwX2J1ZltBUElDTElfTUFYX1BBUk1fSEVMUF9MRU5HVEhdOworICAgIGludCByYyA9IDA7CisKKyAgICAvKiBBdCB0b3AgbGV2ZWwgdGFrZSBuYW1lIGZyb20gcHJvcGVydHkgKi8KKyAgICBpZiAodGQgPT0gcGQtPnR5cGUpCisgICAgeworICAgICAgICAvKiBJbiBjYXNlIHRoZXJlJ3MgYSBnbG9iYWwgcHJlZml4ICovCisgICAgICAgIGNoYXIgKnRvcF9uYW1lX2J1ZiA9IG5hbWVfYnVmMDsKKyAgICAgICAgdWludDMyX3QgdG9wX25hbWVfYnVmX2xlbiA9IEFQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSDsKKyAgICAgICAgdWludDMyX3QgcHJlZml4X2xlbiA9IHN0cmxlbihuYW1lX2J1ZjApOworICAgICAgICBpZiAocHJlZml4X2xlbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvcF9uYW1lX2J1ZiArPSBwcmVmaXhfbGVuOworICAgICAgICAgICAgdG9wX25hbWVfYnVmX2xlbiAtPSBwcmVmaXhfbGVuOworICAgICAgICB9CisKKyAgICAgICAgYmNtY2xpX3N0cm5jcHkodG9wX25hbWVfYnVmLCBwZC0+Y2xpX25hbWUgPyBwZC0+Y2xpX25hbWUgOiBwZC0+bmFtZSwgdG9wX25hbWVfYnVmX2xlbik7CisgICAgICAgIGJjbWNsaV9zdHJuY3B5KGhlbHBfYnVmMCwgcGQtPmRlc2NyID8gcGQtPmRlc2NyIDogcGQtPm5hbWUsIEFQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSCk7CisgICAgfQorCisgICAgLyogRm9yIHJlYWQgYWNjZXNzIHdlIG9ubHkgbWFyayB3aGV0aGVyIHJlYWQgcHJvcGVydHkgb3Igbm90LiBJdCBpcyBub3QgZmllbGQtYnktZmllbGQgb3BlcmF0aW9uICovCisgICAgaWYgKGFjY2Vzc19sZXZlbCA9PSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUikKKyAgICB7CisgICAgICAgIHRkID0gJmJvb2xfdHlwZV9kZXNjcjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIGFycmF5cyB3ZSBzaG91bGQKKyAgICAgKiAtIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gYXJyYXkgaW4gYXJyYXkuIEl0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAtIHN0b3JlIGFycmF5IHR5cGUgZGVzY3JpcHRvciBGRlUgYW5kIHJlcGxhY2UgdGhlICJjdXJyZW50IiB0eXBlIGRlc2NyaXB0b3Igd2l0aCBlbGVtZW50IHR5cGUKKyAgICAgKiAtIHJlc2V0IG9mZnNldCBiZWNhdXNlIGZvciBhcnJheSBmaWVsZHMgaXQgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSBhcnJheSBiYXNlIHJhdGhlciB0aGFuIHByb3BlcnR5CisgICAgICovCisgICAgaWYgKHRkLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOIHx8IHRkLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQpCisgICAgeworICAgICAgICBpZiAoYXJyYXlfZmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChjdXJyZW50X3Nlc3Npb24sICIqKiogJXMgaW4gJXM6IGFycmF5cy1pbi1hcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIsIHBkLT5uYW1lLCBhcnJheV9mZC0+bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIC8qIHN0b3JlIGFycmF5IHR5cGUgYW5kIGZldGNoIGVsZW1lbnQgdHlwZSAqLworICAgICAgICBhcnJheV9mZCA9IGZkID8gZmQgOiAoY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICopcGQ7CisgICAgICAgIGlmICh0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTikKKyAgICAgICAgeworICAgICAgICAgICAgdGQgPSB0ZC0+eC5hcnJfZHluLmVsZW1fdHlwZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRkID0gdGQtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZTsKKyAgICAgICAgfQorICAgICAgICBhcnJheV9mZF9vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKHRkLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QpCisgICAgeworICAgICAgICB1aW50MTZfdCBmOworICAgICAgICBpZiAoIXRkLT54LnMubnVtX2ZpZWxkcykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBCVUdfT04oIXRkLT54LnMuZmllbGRzKTsKKyAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnMubnVtX2ZpZWxkczsgZisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZsZCA9ICZ0ZC0+eC5zLmZpZWxkc1tmXTsKKyAgICAgICAgICAgIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtc19mcm9tX3Byb3BlcnR5KHBkLCBmbGQsIGFycmF5X2ZkLCBvZmZzZXQrZmxkLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgYXJyYXlfZmRfb2Zmc2V0LCAmcGFybXNbbmZdLCBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgbmYgKz0gIHJjOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHRkLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTikKKyAgICB7CisgICAgICAgIC8qIFVuaW9uICovCisgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkOworICAgICAgICBiY21jbGlfY21kX3Bhcm0gKnNlbF9wYXJtOworICAgICAgICBhcGljbGlfcGFybV9kYXRhICpzZWxfZGF0YTsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICplOworCisgICAgICAgIGlmICghdGQtPngudS5udW1fY29tbW9uX2ZpZWxkcykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBCVUdfT04oIXRkLT54LnUuY29tbW9uX2ZpZWxkcyk7CisKKyAgICAgICAgLyogUG9wdWxhdGUgcGFyYW1ldGVycyBwcmVjZWRpbmcgdGhlIHVuaW9uIHNlbGVjdG9yICovCisgICAgICAgIGZvciAoZiA9IDA7IGYgPCB0ZC0+eC51LmNsYXNzaWZpZXJfaWR4OyBmKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl07CisgICAgICAgICAgICBfYXBpX2NsaV9wb3B1bGF0ZV9uYW1lX2hlbHAoZmxkLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCwgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIHJjID0gIF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkocGQsIGZsZCwgYXJyYXlfZmQsCisgICAgICAgICAgICAgICAgb2Zmc2V0K2ZsZC0+b2Zmc2V0LCBhcnJheV9mZF9vZmZzZXQsICZwYXJtc1tuZl0sIGFjY2Vzc19sZXZlbCwgY21kX2ZsYWdzLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgICAgICBuZiArPSByYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyBwb3B1bGF0ZSBwYXJhbWV0ZXIgZm9yIHNlbGVjdG9yICovCisgICAgICAgIHNlbF9wYXJtID0gJnBhcm1zW25mXTsKKyAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgX2FwaV9jbGlfcG9wdWxhdGVfbmFtZV9oZWxwKGZsZCwgbmFtZV9idWYwLCBoZWxwX2J1ZjAsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwKKyAgICAgICAgICAgIG9mZnNldCtmbGQtPm9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LCBzZWxfcGFybSwgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICBuZiArPSByYzsKKyAgICAgICAgLyogQ2xvbmUgZW51bSB0YWJsZSBpbiBvcmRlciB0byBhbGxvdyBtb2RpZnlpbmcgaXQgKi8KKyAgICAgICAgaWYgKHJjID49IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbF9wYXJtLT5lbnVtX3RhYmxlID0gX2FwaV9jbGlfY2xvbmVfZW51bV90YWJsZShzZWxfcGFybSk7CisgICAgICAgICAgICBpZiAoIXNlbF9wYXJtLT5lbnVtX3RhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyBzZXQtdXAgc2VsZWN0b3IgKi8KKyAgICAgICAgc2VsX3Bhcm0tPmZsYWdzIHw9IEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1I7CisgICAgICAgIHNlbF9kYXRhID0gc2VsX3Bhcm0tPnVzZXJfZGF0YTsKKyAgICAgICAgZSA9IHNlbF9wYXJtLT5lbnVtX3RhYmxlOworICAgICAgICB3aGlsZSAoZSAmJiBlLT5uYW1lICYmIHJjID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LnVuaW9uX2ZpZWxkc1tlIC0gc2VsX3Bhcm0tPmVudW1fdGFibGVdOworICAgICAgICAgICAgaWYgKGZsZC0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbnAgPSBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKGZsZC0+dHlwZSk7CisgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICBlLT5wYXJtcyA9IF9hcGlfY2xpX3Bhcm1fYWxsb2MobnApOworICAgICAgICAgICAgICAgIGlmICghZS0+cGFybXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnA7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wYXJtX2RhdGEgKmRhdGEgPSBlLT5wYXJtc1tpXS51c2VyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIGRhdGEtPmdyb3VwID0gc2VsX2RhdGEtPmdyb3VwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBDb2xsYXBzZSBzdWJzdHJ1Y3R1cmUgbmFtZSAqLworICAgICAgICAgICAgICAgIGlmIChmbGQtPnR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCB8fAorICAgICAgICAgICAgICAgICAgICBmbGQtPnR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkobmFtZV9idWYsIG5hbWVfYnVmMCwgc2l6ZW9mKG5hbWVfYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGhlbHBfYnVmLCBoZWxwX2J1ZjAsIHNpemVvZihoZWxwX2J1ZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfYXBpX2NsaV9wb3B1bGF0ZV9uYW1lX2hlbHAoZmxkLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCwgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtc19mcm9tX3Byb3BlcnR5KHBkLCBmbGQsIGFycmF5X2ZkLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQrZmxkLT5vZmZzZXQsIGFycmF5X2ZkX29mZnNldCwgZS0+cGFybXMsIGFjY2Vzc19sZXZlbCwgY21kX2ZsYWdzLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytlOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluYWxseSBwb3B1bGF0ZSBwYXJhbWV0ZXJzIGZvbGxvd2luZyB0aGUgc2VsZWN0b3IgcGFyYW1ldGVyICovCisgICAgICAgIGZvciAoZiA9IHRkLT54LnUuY2xhc3NpZmllcl9pZHggKyAxOyBmIDwgdGQtPngudS5udW1fY29tbW9uX2ZpZWxkcyAmJiByYyA+PSAwOyBmKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl07CisgICAgICAgICAgICBfYXBpX2NsaV9wb3B1bGF0ZV9uYW1lX2hlbHAoZmxkLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCwgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwKKyAgICAgICAgICAgICAgICBvZmZzZXQrZmxkLT5vZmZzZXQsIGFycmF5X2ZkX29mZnNldCwgJnBhcm1zW25mXSwgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIG5mICs9IHJjOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEZpbmFsbHkhIFNpbXBsZSB0eXBlIHRoYXQgbWFwcyB0byBhIHNpbmdsZSBDTEkgcGFyYW1ldGVyICovCisgICAgICAgIG5mID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybTEocGQsIGZkLCB0ZCwgYXJyYXlfZmQsIG9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LAorICAgICAgICAgICAgJnBhcm1zWzBdLCBjbWRfZmxhZ3MsIG5hbWVfYnVmMCwgaGVscF9idWYwKTsKKyAgICB9CisgICAgcmV0dXJuIChyYyA+PSAwKSA/IG5mIDogcmM7Cit9CisKKy8qIHBvcHVsYXRlIENMSSBwYXJhbWV0ZXIgdGFibGUgKi8KK3N0YXRpYyBpbnQgX2FwaV9jbGlfcG9wdWxhdGVfcGFybXMoCisgICAgYmNtb2x0X29ial9pZCBvLAorICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsCisgICAgdWludDE2X3Qgc3ViZ3JvdXAsCisgICAgYmNtb2x0X3Byb3BfYWNjZXNzX2lkIGFjY2Vzc19sZXZlbCwKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zLAorICAgIHVpbnQzMl90IGNtZF9mbGFncywKKyAgICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgaW50IG5mID0gMDsKKyAgICBpbnQgaTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBmb3IgKGkgPSAwOyByYyAhPSBCQ01fRVJSX1JBTkdFOyBpKyspCisgICAgeworICAgICAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisgICAgICAgIGNoYXIgbmFtZV9idWZbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXSA9ICIiOworICAgICAgICBjaGFyIGhlbHBfYnVmW0FQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSF0gPSAiIjsKKworICAgICAgICBzdHJuY3B5KG5hbWVfYnVmLCBwcmVmaXgsIEFQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSC0xKTsKKyAgICAgICAgbmFtZV9idWZbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RILTFdID0gMDsKKworICAgICAgICByYyA9IGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG8sIGdyb3VwLCBzdWJncm91cCwgaSwgJnBkKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0sgJiYgKHBkLT5hY2Nlc3MgJiBhY2Nlc3NfbGV2ZWwpKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkocGQsIE5VTEwsIE5VTEwsIDAsIDAsICZwYXJtc1tuZl0sCisgICAgICAgICAgICAgICAgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIG5mICs9IHJjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZjsKK30KKworCisvKiBjb21wYWN0IHNlbGVjdG9yIHRhYmxlLiBzcXVlZXplIG91dCB2YWx1ZXMgdGhhdCBkb24ndCBoYXZlIHBhcmFtZXRlciB0YWJsZSBhdHRhY2hlZCAqLworc3RhdGljIHZvaWQgX2FwaV9jbGlfY29tcGFjdF9zZWxlY3RvcihiY21jbGlfZW51bV92YWwgKnNlbGVjdG9yLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXNlbGVjdG9yW2ldLnBhcm1zKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBqID0gaSArIDE7IGogPCBzaXplICYmICFzZWxlY3RvcltqXS5wYXJtczsgaiArKykKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBpZiAoaiA8IHNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZzZWxlY3RvcltpXSwgJnNlbGVjdG9yW2pdLCBzaXplb2YoYmNtY2xpX2VudW1fdmFsKSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZzZWxlY3RvcltqXSwgMCwgc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbXNldCgmc2VsZWN0b3JbaV0sIDAsIHNpemVvZihiY21jbGlfZW51bV92YWwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyogRnJlZSBDTEkgcGFyYW1ldGVycy4gYm90aCBuYW1lIGFuZCBkZXNjcmlwdGlvbiBhcmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5ICovCitzdGF0aWMgdm9pZCBfYXBpX2NsaV9mcmVlX3Bhcm1zKGJjbWNsaV9jbWRfcGFybSAqcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwID0gcGFybXM7CisKKyAgICB3aGlsZSAocC0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICgocC0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVtb3ZlIHNlbGVjdG9yIHRhYmxlICovCisgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnNlbCA9IHAtPmVudW1fdGFibGU7CisgICAgICAgICAgICBpZiAoc2VsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqZSA9IHNlbDsKKyAgICAgICAgICAgICAgICB3aGlsZShlLT5uYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUtPnBhcm1zKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfYXBpX2NsaV9mcmVlX3Bhcm1zKGUtPnBhcm1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2VsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocC0+ZGVzY3JpcHRpb24pCisgICAgICAgICAgICBiY21vc19mcmVlKEFQSUNMSV9DQVNUX0RJU0NBUkRfQ09OU1QocC0+ZGVzY3JpcHRpb24sIHZvaWQgKikpOworICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwLT5uYW1lLCB2b2lkICopKTsKKyAgICAgICAgaWYgKHAtPm1heF9hcnJheV9zaXplICYmIHAtPnZhbHVlcykKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUocC0+dmFsdWVzKTsKKyAgICAgICAgaWYgKHAtPnZhbHVlLmJ1ZmZlci5zdGFydCkKKyAgICAgICAgICAgIGJjbW9sdF9idWZfZnJlZSgmcC0+dmFsdWUuYnVmZmVyKTsKKworICAgICAgICArK3A7CisgICAgfQorICAgIGJjbW9zX2ZyZWUocGFybXMpOworfQorCitzdGF0aWMgdWludDhfdCBfYXBpY2xpX2dldF9udW1fY21kX3Bhcm1zKGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIGFwaV9jbGlfZmxhZ3MgZmxhZ3MpCit7CisgICAgaWYgKGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCkKKyAgICAgICAgcmV0dXJuIDI7IC8qIG9iamVjdCArIHN0YXQgSUQgKi8KKyAgICBlbHNlIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0NGRyAmJiAoZmxhZ3MgJiBBUElfQ0xJX0ZMQUdTX01VTFRJKSAhPSBBUElfQ0xJX0ZMQUdTX05PTkUpCisgICAgICAgIHJldHVybiAzOyAvKiBvYmplY3QgKyBtYXggbXNncyArIGludmVydCBmbGFnICovCisgICAgZWxzZQorICAgICAgICByZXR1cm4gMTsgLyogb2JqZWN0ICovCit9CisKKy8qIFJlYWQgZ2VuZXJhdGVkIGluZm8gYW5kIGFkZCBDTEkgY29tbWFuZCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGlfY2xpX2FkZChiY21jbGlfZW50cnkgKmRpciwgY29uc3QgY2hhciAqY21kX25hbWUsIGNvbnN0IGNoYXIgKmNtZF9kZXNjciwKKyAgICBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCBiY21vbHRfcHJvcF9hY2Nlc3NfaWQgYWNjZXNzX2xldmVsLCBiY21jbGlfY21kX2NiIGNtZF9oYW5kbGVyLCBhcGlfY2xpX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbWNsaV9jbWRfZXh0cmFfcGFybSBjbWRfZXh0cmFzID0geyAuZnJlZV9wYXJtcyA9IF9hcGlfY2xpX2ZyZWVfcGFybXMgfTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNtZF9wYXJtczsKKyAgICBiY21jbGlfZW51bV92YWwgKm9ial9zZWxlY3RvcjsKKyAgICBiY21vbHRfb2JqX2lkIG87CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IGNtZF9mbGFncyA9IDA7CisgICAgdWludDhfdCBudW1fY21kX3Bhcm1zID0gX2FwaWNsaV9nZXRfbnVtX2NtZF9wYXJtcyhncm91cCwgZmxhZ3MpOworICAgIGludCBuX29iajsKKyAgICBpbnQgaTsKKworICAgIC8qIENvbW1hbmQgZmxhZ3M6IHBhcmFtZXRlcnMgaW4gdGhlIGZvbGxvd2luZyBncm91cHMgYXJlIG9wdGlvbmFsICovCisgICAgaWYgKGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHIHx8IGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCB8fCBncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHKQorICAgICAgICBjbWRfZmxhZ3MgPSBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMOworCisgICAgLyogY29tbWFuZCBwYXJhbWV0ZXJzIGFyZToKKyAgICAgKiAtIG9iamVjdF9uYW1lIChzZWxlY3RvcikKKyAgICAgKiAtIG9iamVjdF9rZXlfZmllbGRzCisgICAgICogLSBvYmplY3RfcGVyX2dyb3VwX2ZpZWxkcyBmaWx0ZXJlZCBieSBhY2Nlc3MKKyAgICAgKiBUaGVyZWZvcmUsIHRoZXJlIGlzIDEgdG9wLWxldmVsIGVudW0gcGFyYW1ldGVyIChvYmplY3QgdHlwZSkgd2l0aCBwZXItdmFsdWUgcGFyYW1ldGVyIHRhYmxlcworICAgICAqIEluIHRoZSBjYXNlIG9mIG9wZXJhdGlvbnMgb3IgcHJveHkgbWVzc2FnZXMsIHRoZXJlIGlzIGFsc28gYSB0b3AtbGV2ZWwgZW51bSBwYXJhbWV0ZXIgZm9yIHRoZSBvcGVyL3Byb3h5IG5hbWUKKyAgICAgKi8KKworICAgIC8qIEFsbG9jYXRlIGVudW0gdGFibGUgYmFzZWQgb24gbWF4IG51bWJlciBvZiBvYmplY3RzLiBXaWxsIGJlIGNvbXBhY3RlZCBpbiB0aGUgZW5kICovCisgICAgY21kX3Bhcm1zID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfY21kX3Bhcm0pICogKG51bV9jbWRfcGFybXMgKyAxKSk7CisgICAgaWYgKCFjbWRfcGFybXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworCisgICAgLyogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhbGwgb2JqZWN0IGVudHJpZXMgYXMgd2VsbCBhcyBhIHRlcm1pbmF0b3IgZW50cnkgKHdoaWNoIGlzIGxlZnQgTlVMTCkgKi8KKyAgICBvYmpfc2VsZWN0b3IgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkgKiAoQkNNT0xUX09CSl9JRF9fTlVNX09GICsgMSkpOworICAgIGlmICghb2JqX3NlbGVjdG9yKQorICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisKKyAgICAvKiBBbGxvY2F0ZSBwYXJhbWV0ZXIgdGFibGUgKi8KKyAgICBuX29iaiA9IDA7CisgICAgZm9yIChvID0gMDsgbyA8IEJDTU9MVF9PQkpfSURfX05VTV9PRjsgbysrKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgbmtleWZpZWxkcyA9IDA7CisgICAgICAgIHVpbnQzMl90IG5maWVsZHMgPSAwOworICAgICAgICB1aW50MzJfdCBuZmlsdGVyZmllbGRzID0gMDsKKyAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgdWludDE2X3QgczsKKyAgICAgICAgdWludDE2X3Qgc3ViZ3JvdXBfY291bnQgPSBhcGlfY2xpX2dldF9zdWJncm91cF9jb3VudChvLCBncm91cCk7CisgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqc3ViX3NlbGVjdG9yOworCisgICAgICAgIGlmICghYmNtb2x0X29iamVjdF9pc19zdXBwb3J0ZWQoY3VycmVudF9zeXN0ZW1fbW9kZSwgbykgJiYgbyAhPSBCQ01PTFRfT0JKX0lEX0RFVklDRSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChzdWJncm91cF9jb3VudCA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS52YWwgPSBvOworICAgICAgICByYyA9IGFwaV9jbGlfb2JqZWN0X25hbWUobywgJm9ial9zZWxlY3RvcltuX29ial0ubmFtZSwgTlVMTCk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIEdldCBudW1iZXIgb2Yga2V5IGZpZWxkcyBhbmQgc2F2ZSBpdCAqLworICAgICAgICBpZiAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRykKKyAgICAgICAgeworICAgICAgICAgICAgbmtleWZpZWxkcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl9ncm91cChvLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csICZua2V5ZmllbGRzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFsbG9jYXRlIHN1Ymdyb3VwIGVudW0gdGFibGUgKi8KKyAgICAgICAgc3ViX3NlbGVjdG9yID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfZW51bV92YWwpICogKHN1Ymdyb3VwX2NvdW50ICsgMSkpOworICAgICAgICBpZiAoIXN1Yl9zZWxlY3RvcikKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKworICAgICAgICAvKiBBbGxvY2F0ZSBzaW5nbGUgc3ViZ3JvdXAgY29tbWFuZCBwYXJhbWV0ZXIgKi8KKyAgICAgICAgc2l6ZSA9IHNpemVvZihiY21jbGlfY21kX3Bhcm0pICogMjsKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtcyA9IGJjbW9zX2NhbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19mcmVlKHN1Yl9zZWxlY3Rvcik7CisgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXR1cCBzaW5nbGUgc3ViZ3JvdXAgY29tbWFuZCBwYXJhbWV0ZXIgKi8KKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtc1swXS50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtc1swXS5mbGFncyA9IEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1I7CisgICAgICAgIG9ial9zZWxlY3RvcltuX29ial0ucGFybXNbMF0uZW51bV90YWJsZSA9IHN1Yl9zZWxlY3RvcjsKKyAgICAgICAgcmMgPSBfYXBpX2NsaV9jb3B5X3Bhcm1fbmFtZSgmb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1Ymdyb3VwIChzcGVjaWZpYyBvcGVyYXRpb24gLyBwcm94eSBtc2cpIik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKworICAgICAgICBmb3IgKHMgPSAwOyBzIDwgc3ViZ3JvdXBfY291bnQ7ICsrcykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqc3ViX25hbWU7CisgICAgICAgICAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1fcHRyOworCisgICAgICAgICAgICAvKiBHZXQgbmFtZSBvZiBzcGVjaWZpYyBzdWJncm91cCAqLworICAgICAgICAgICAgcmMgPSBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG8sIGdyb3VwLCBzLCAmc3ViX25hbWUsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBTZXR1cCBlbnRyeSBpbiBzdWJncm91cCBlbnVtIHRhYmxlICovCisgICAgICAgICAgICBzdWJfc2VsZWN0b3Jbc10ubmFtZSA9IHN1Yl9uYW1lOworICAgICAgICAgICAgc3ViX3NlbGVjdG9yW3NdLnZhbCA9IHM7CisKKyAgICAgICAgICAgIC8qIEdldCBudW1iZXIgb2YgZ3JvdXAgZmllbGRzICovCisgICAgICAgICAgICByYyA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX2dyb3VwKG8sIGdyb3VwLCBzLCBhY2Nlc3NfbGV2ZWwsICZuZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLyogRm9yIG11bHRpLW9iamVjdCBHRVQgbWVzc2FnZXMsIHBvcHVsYXRlIHRoZSBmaWx0ZXIgZmllbGRzIGp1c3QgbGlrZSBhIFNFVCAoZXhjZXB0IHRoYXQgYWxsIHJlYWQtb25seQorICAgICAgICAgICAgICAgZmllbGRzIGFyZSBhbHNvIHNldHRhYmxlKSAqLworICAgICAgICAgICAgaWYgKChmbGFncyAmIEFQSV9DTElfRkxBR1NfTVVMVEkpICE9IEFQSV9DTElfRkxBR1NfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX2dyb3VwKG8sIGdyb3VwLCBzLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsICZuZmlsdGVyZmllbGRzKTsKKyAgICAgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBUElfQ0xJX0ZMQUdTX0lHTk9SRV9GSUVMRFMpICE9IEFQSV9DTElfRkxBR1NfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZmlsdGVyZmllbGRzID0gMDsKKyAgICAgICAgICAgICAgICBuZmllbGRzID0gMDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKiBBbGxvY2F0ZSBwYXJhbWV0ZXIgdGFibGUgYW5kIHBvcHVsYXRlIGl0ICovCisgICAgICAgICAgICBzdWJfc2VsZWN0b3Jbc10ucGFybXMgPSBfYXBpX2NsaV9wYXJtX2FsbG9jKG5maWVsZHMgKyBua2V5ZmllbGRzICsgbmZpbHRlcmZpZWxkcyk7CisgICAgICAgICAgICBpZiAoIXN1Yl9zZWxlY3RvcltzXS5wYXJtcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5rZXlmaWVsZHMgKyBuZmllbGRzICsgbmZpbHRlcmZpZWxkczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wYXJtX2RhdGEgKnBhcm1fZGF0YSA9IHN1Yl9zZWxlY3RvcltzXS5wYXJtc1tpXS51c2VyX2RhdGE7CisgICAgICAgICAgICAgICAgcGFybV9kYXRhLT5ncm91cCA9IChpIDwgbmtleWZpZWxkcykgPyBCQ01PTFRfTUdUX0dST1VQX0tFWSA6IGdyb3VwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJtX3B0ciA9IHN1Yl9zZWxlY3RvcltzXS5wYXJtczsKKyAgICAgICAgICAgIGlmIChua2V5ZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXMobywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBwYXJtX3B0ciwgMCwgIiIpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgICAgICAgICBwYXJtX3B0ciArPSByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZmlsdGVyZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXMobywgZ3JvdXAsIHMsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgcGFybV9wdHIsIGNtZF9mbGFncywgImZpbHRlci4iKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgICAgICAgICAgICAgcGFybV9wdHIgKz0gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmZpZWxkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zKG8sIGdyb3VwLCBzLCBhY2Nlc3NfbGV2ZWwsIHBhcm1fcHRyLCBjbWRfZmxhZ3MsICIiKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgICAgICAgICAgICAgcGFybV9wdHIgKz0gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYWN0IHN1Yl9zZWxlY3RvciBlbnVtLiBSZW1vdmVzIGhvbGVzICh2YWx1ZXMgd2l0aG91dCBwYXJhbWV0ZXIgdGFibGUpICovCisgICAgICAgIF9hcGlfY2xpX2NvbXBhY3Rfc2VsZWN0b3Ioc3ViX3NlbGVjdG9yLCBzdWJncm91cF9jb3VudCk7CisKKyAgICAgICAgLyogSWYgdGhlIGdyb3VwIHR5cGUgZG9lc24ndCBzdXBwb3J0IHN1Ymdyb3VwcywgcmVtb3ZlIHRoZSBzdWJncm91cCBwYXJhbSBlbnRyeSAqLworICAgICAgICBpZiAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcgfHwgZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUIHx8IGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIChzaW5nbGUpIHN1Ymdyb3VwIHBhcmFtICovCisgICAgICAgICAgICBiY21vc19mcmVlKEFQSUNMSV9DQVNUX0RJU0NBUkRfQ09OU1Qob2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtc1swXS5uYW1lLCB2b2lkICopKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLmRlc2NyaXB0aW9uLCB2b2lkICopKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUob2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtcyk7CisgICAgICAgICAgICAvKiBBc3NpZ24gdGhlIHN1Ymdyb3VwIHBhcmFtcyB0byB0aGUgcm9vdCBvYmplY3QgcGFyYW1zICovCisgICAgICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zID0gc3ViX3NlbGVjdG9yWzBdLnBhcm1zOworICAgICAgICAgICAgYmNtb3NfZnJlZShzdWJfc2VsZWN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgKytuX29iajsgLyogbnVtYmVyIG9mIGNvbmZpZ3VyZWQgb2JqZWN0cyAqLworICAgIH0KKworICAgIC8qIENvbXBhY3Qgb2JqX3NlbGVjdG9yIGVudW0uIFJlbW92ZXMgaG9sZXMgKHZhbHVlcyB3aXRob3V0IHBhcmFtZXRlciB0YWJsZSkgKi8KKyAgICBfYXBpX2NsaV9jb21wYWN0X3NlbGVjdG9yKG9ial9zZWxlY3RvciwgQkNNT0xUX09CSl9JRF9fTlVNX09GKTsKKworICAgIC8qIEFkZCBhICdjbGVhciBvbiByZWFkJyB0byBzdGF0cyBncm91cCAqLworICAgIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1NUQVQpCisgICAgeworICAgICAgICBjbWRfcGFybXNbMF0udHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgICAgIGNtZF9wYXJtc1swXS5lbnVtX3RhYmxlID0gYm9vbF9lbnVtOworICAgICAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKCZjbWRfcGFybXNbMF0sICJjbGVhciIsICJjbGVhciBvbiByZWFkIik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBBZGQgJ21heCBudW1iZXIgb2YgbWVzc2FnZXMgdG8gcmVhZCcgYW5kICdpbnZlcnQgZmlsdGVyJyB0byBjZmcgZ2V0X211bHRpIG1zZ3MgKi8KKyAgICBpZiAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcgJiYgKGZsYWdzICYgQVBJX0NMSV9GTEFHU19NVUxUSSkgIT0gQVBJX0NMSV9GTEFHU19OT05FKQorICAgIHsKKyAgICAgICAgY21kX3Bhcm1zWzBdLnR5cGUgPSBCQ01DTElfUEFSTV9VTlVNQkVSOworICAgICAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKCZjbWRfcGFybXNbMF0sICJtYXhfbXNncyIsICJtYXggbnVtYmVyIG9mIEFQSSBHRVQgbWVzc2FnZXMgdG8gcmVjZWl2ZSBwZXIgY2FsbCIpOworICAgICAgICBpZiAocmMpCisgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisKKyAgICAgICAgY21kX3Bhcm1zWzFdLnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgICAgICBjbWRfcGFybXNbMV0uZW51bV90YWJsZSA9IGJvb2xfZW51bTsKKyAgICAgICAgcmMgPSBfYXBpX2NsaV9jb3B5X3Bhcm1fbmFtZSgmY21kX3Bhcm1zWzFdLCAiZmlsdGVyX2ludmVydCIsICJpbnZlcnQgZmlsdGVyIChzZWxlY3Qgb2JqZWN0cyB0aGF0IGRvbid0IG1hdGNoKSIpOworICAgICAgICBpZiAocmMpCisgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgfQorCisgICAgLyogV2UgYXJlIHJlYWR5IHRvIGFkZCB0aGlzIGNvbW1hbmQgKi8KKyAgICBjbWRfcGFybXNbbnVtX2NtZF9wYXJtcyAtIDFdLnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgIGNtZF9wYXJtc1tudW1fY21kX3Bhcm1zIC0gMV0uZmxhZ3MgPSBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SOworICAgIGNtZF9wYXJtc1tudW1fY21kX3Bhcm1zIC0gMV0uZW51bV90YWJsZSA9IG9ial9zZWxlY3RvcjsKKyAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKCZjbWRfcGFybXNbbnVtX2NtZF9wYXJtcyAtIDFdLCAib2JqZWN0IiwgIk9iamVjdCBUeXBlIik7CisgICAgaWYgKHJjKQorICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgcmMgPSBiY21jbGlfY21kX2FkZChkaXIsIGNtZF9uYW1lLCBjbWRfaGFuZGxlciwgY21kX2Rlc2NyLAorICAgICAgICAoYWNjZXNzX2xldmVsID09IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XKSA/IEJDTUNMSV9BQ0NFU1NfQURNSU4gOiBCQ01DTElfQUNDRVNTX0dVRVNULAorICAgICAgICAmY21kX2V4dHJhcywgY21kX3Bhcm1zKTsKKyAgICBpZiAocmMpCisgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICByZXR1cm4gMDsKKworbm9tZW1fY2xlYW51cDoKKyAgICBpZiAob2JqX3NlbGVjdG9yKQorICAgIHsKKyAgICAgICAgZm9yIChvID0gMDsgbyA8IEJDTU9MVF9PQkpfSURfX05VTV9PRjsgbysrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob2JqX3NlbGVjdG9yW29dLnBhcm1zKQorICAgICAgICAgICAgICAgIF9hcGlfY2xpX2ZyZWVfcGFybXMob2JqX3NlbGVjdG9yW29dLnBhcm1zKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKG9ial9zZWxlY3Rvcik7CisgICAgfQorICAgIGJjbW9zX2ZyZWUoY21kX3Bhcm1zKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKworLyogQ3VycmVudCBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KK3N0YXRpYyB2b2lkIF9hcGlfY2xpX2RldmljZV9jaGFuZ2VfaW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgZGV2KQoreworICAgIGFwaV9jbGlfc2V0X2NvbW1hbmRzKHNlc3Npb24pOworfQorCisjaWZkZWYgTElOVVhfVVNFUl9TUEFDRQorCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKl9hcGljbGlfbG9nOworc3RhdGljIEZJTEUgKl9hcGljbGlfbG9nX2ZpbGU7CisKK3N0YXRpYyBpbnQgX2FwaWNsaV9sb2dfd3JpdGVfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpZiAoX2FwaWNsaV9sb2dfZmlsZSA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICBmd3JpdGUoYnVmLCAxLCBzaXplLCBfYXBpY2xpX2xvZ19maWxlKTsKKyAgICBmZmx1c2goX2FwaWNsaV9sb2dfZmlsZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEVuYWJsZS9kaXNhYmxlIEFQSSBsb2dnaW5nCisgKiAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJmaWxlIiwgIkxvZyBmaWxlLiBVc2UgXCItXCIgdG8gZGlzYWJsZSBsb2dnaW5nIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSk7CisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2xvZ19oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgY2hhciAqZm5hbWUgPSBwYXJtWzBdLnZhbHVlLnN0cmluZzsKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFyYW1zID0KKyAgICB7CisgICAgICAgIC53cml0ZSA9IF9hcGljbGlfbG9nX3dyaXRlX2NiLAorICAgICAgICAubmFtZSA9ICJhcGlfbG9nIgorICAgIH07CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdGltZV90IHN0YXJ0X3RpbWU7CisKKyAgICAvKiBDbG9zZSBleGlzdGluZyBsb2cgc2Vzc2lvbiBpZiBhbnkgKi8KKyAgICBpZiAoX2FwaWNsaV9sb2cpCisgICAgeworICAgICAgICBiY21jbGlfbG9nX3NldChCQ01DTElfTE9HX05PTkUsIE5VTEwpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShfYXBpY2xpX2xvZyk7CisgICAgICAgIGZjbG9zZShfYXBpY2xpX2xvZ19maWxlKTsKKyAgICAgICAgX2FwaWNsaV9sb2cgPSBOVUxMOworICAgICAgICBfYXBpY2xpX2xvZ19maWxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChmbmFtZSwgIi0iKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICAvKiBTdGFydGluZyBhIG5ldyBsb2cgc2Vzc2lvbiAqLworICAgIF9hcGljbGlfbG9nX2ZpbGUgPSBmb3BlbihmbmFtZSwgImEiKTsKKyAgICBpZiAoX2FwaWNsaV9sb2dfZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJDYW4ndCBvcGVuIGZpbGUgJXMgZm9yIGxvZ2dpbmdcbiIsIGZuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoJnNlc3Npb25fcGFyYW1zLCAmX2FwaWNsaV9sb2cpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGZjbG9zZShfYXBpY2xpX2xvZ19maWxlKTsKKyAgICAgICAgX2FwaWNsaV9sb2dfZmlsZSA9IE5VTEw7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiQ2FuJ3Qgb3BlbiBsb2cgc2Vzc2lvbi4gRXJyb3IgJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgdGltZSgmc3RhcnRfdGltZSk7CisgICAgYmNtY2xpX2xvZ19zZXQoQkNNQ0xJX0xPR19DX0NPTU1FTlQsIF9hcGljbGlfbG9nKTsKKyAgICBiY21jbGlfbG9nKCIvKiBBUEkgbG9nZ2luZyBzZXNzaW9uIHN0YXJ0ZWQuICVzICovXG4iLCBjdGltZSgmc3RhcnRfdGltZSkpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmIC8qICNpZmRlZiBMSU5VWF9VU0VSX1NQQUNFICovCisKKyNlbmRpZiAvKiAjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUICovCisKK3N0YXRpYyB2b2lkIGFwaV9jbGlfZmluZF9kZWxfY21kKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpjbWRfbmFtZSkKK3sKKyAgICBiY21jbGlfZW50cnkgKmNtZDsKKyAgICBjbWQgPSBiY21jbGlfY21kX2ZpbmQoZGlyLCBjbWRfbmFtZSk7CisgICAgaWYgKGNtZCkKKyAgICB7CisgICAgICAgIGJjbWNsaV90b2tlbl9kZXN0cm95KGNtZCk7CisgICAgfQorfQorCisvKiBVbnJlZ2lzdGVycyBjb21tYW5kcyBhbmQgZGlyZWN0b3JpZXMgKi8KK3N0YXRpYyB2b2lkIGFwaV9jbGlfZGVsX2NvbW1hbmRzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9lbnRyeSAqZGlyOworCisgICAgZGlyID0gYmNtY2xpX2Rpcl9maW5kKGFwaV9wYXJlbnRfZGlyLCAiYXBpIik7CisgICAgaWYgKCFkaXIpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgInNldCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgImdldCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgIm11bHRpZ2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAiY2xlYXIiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJtb2RpZnkiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJzdGF0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAib3BlciIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgInNlbmQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJzYXNldCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgInNhZ2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAiYWNzZXQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJhY2dldCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgIm9iamVjdHMiKTsKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJsb2ciKTsKKyNlbmRpZgorfQorCisvKiBSZWdpc3RlcnMgY29tbWFuZHMgYW5kIGRpcmVjdG9yaWVzICovCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpX2NsaV9hZGRfY29tbWFuZHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2VudHJ5ICphcGlfZGlyOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKChhcGlfZGlyID0gYmNtY2xpX2Rpcl9maW5kKGFwaV9wYXJlbnRfZGlyLCAiYXBpIikpID09IE5VTEwpCisgICAgeworICAgICAgICBhcGlfZGlyID0gYmNtY2xpX2Rpcl9hZGQoYXBpX3BhcmVudF9kaXIsICJhcGkiLCAiTWFwbGUgQVBJIiwgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7CisgICAgICAgIGlmIChhcGlfZGlyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJDYW4ndCBjcmVhdGUgYXBpIGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN1cnJlbnRfc2Vzc2lvbiA9IHNlc3Npb247CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldChjdXJyZW50X2RldmljZSwgJmN1cnJlbnRfc3lzdGVtX21vZGUpOworCisgICAgLyogTm93IGdlbmVyYXRlIGFuZCBhZGQgY29tbWFuZHMgKi8KKyAgICByYyA9IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAic2V0IiwgIlNldCBvYmplY3QgY29uZmlndXJhdGlvbiIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLAorICAgICAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVywgX2FwaWNsaV9zZXRfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19OT05FKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgImdldCIsICJHZXQgb2JqZWN0IGNvbmZpZ3VyYXRpb24iLCBCQ01PTFRfTUdUX0dST1VQX0NGRywKKyAgICAgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIF9hcGljbGlfZ2V0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJjbGVhciIsICJDbGVhciBvYmplY3QgY29uZmlndXJhdGlvbiIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLAorICAgICAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgX2FwaWNsaV9jbGVhcl9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX0lHTk9SRV9GSUVMRFMpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAic3RhdCIsICJHZXQgc3RhdGlzdGljcyIsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsCisgICAgICAgIF9hcGljbGlfc3RhdF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAib3BlciIsICJJbml0aWF0ZSBPcGVyYXRpb24iLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsCisgICAgICAgIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBfYXBpY2xpX29wZXJfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19OT05FKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgInNlbmQiLCAiU2VuZCBtZXNzYWdlIHRvIE9OVSIsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksCisgICAgICAgIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBfYXBpY2xpX3NlbmRfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19OT05FKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgInNhc2V0IiwgIlNldCBzdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbiIsCisgICAgICAgIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBfYXBpY2xpX3N0YXRfY2ZnX3NldF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAic2FnZXQiLCAiR2V0IHN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIF9hcGljbGlfc3RhdF9jZmdfZ2V0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfSUdOT1JFX0ZJRUxEUyk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJhY3NldCIsICJTZXQgYXV0b25vbW91cyBtZXNzYWdlIGNvbmZpZ3VyYXRpb24iLAorICAgICAgICBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVywgX2FwaWNsaV9hdXRvX2NmZ19zZXRfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19OT05FKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgImFjZ2V0IiwgIkdldCBhdXRvbm9tb3VzIG1lc3NhZ2UgY29uZmlndXJhdGlvbiIsCisgICAgICAgIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCBfYXBpY2xpX2F1dG9fY2ZnX2dldF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAibXVsdGlnZXQiLCAiR2V0IGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIG9iamVjdHMiLAorICAgICAgICBCQ01PTFRfTUdUX0dST1VQX0NGRywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIF9hcGljbGlfYXV0b19jZmdfZ2V0X211bHRpX2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTVVMVEkpOworCisgICAgLyogTGlzdCBhbGwgc3lzdGVtIG9iamVjdHMgKi8KKyAgICByYyA9IHJjID8gcmMgOiBiY21jbGlfY21kX2FkZChhcGlfZGlyLCAib2JqZWN0cyIsIF9hcGljbGlfb2JqZWN0c19oYW5kbGVyLAorICAgICAgICAiT2JqZWN0IFR5cGVzIiwgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCwgTlVMTCk7CisKKyNpZiBkZWZpbmVkKEJDTV9TVUJTWVNURU1fSE9TVCkgJiYgZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorICAgIEJDTUNMSV9NQUtFX0NNRChhcGlfZGlyLCAibG9nIiwgIkxvZyBBUEkgY2FsbHMiLCBfYXBpY2xpX2xvZ19oYW5kbGVyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJmaWxlIiwgIkxvZyBmaWxlLiBVc2UgXCItXCIgdG8gZGlzYWJsZSBsb2dnaW5nIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSk7CisjZW5kaWYKKworICAgIHJldHVybiByYzsKK30KKworLyogVXBkYXRlIEFQSSBDTEkgY29tbWFuZHMgZm9yIHRoZSBjdXJyZW50IGRldmljZSAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9zZXRfY29tbWFuZHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYXBpX2NsaV9kZWxfY29tbWFuZHMoc2Vzc2lvbik7CisgICAgcmMgPSBhcGlfY2xpX2FkZF9jb21tYW5kcyhzZXNzaW9uKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIEluaXQgQVBJIENMSSBjb21tYW5kcyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlICovCitiY21vc19lcnJubyBhcGlfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpwYXJlbnRfZGlyLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGFwaV9wYXJlbnRfZGlyID0gcGFyZW50X2RpcjsKKworICAgIHJjID0gYXBpX2NsaV9zZXRfY29tbWFuZHMoc2Vzc2lvbik7CisKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICAvKiBTdWJzY3JpYmUgZm9yIGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworICAgIHJjID0gcmMgPyByYyA6IGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihfYXBpX2NsaV9kZXZpY2VfY2hhbmdlX2luZCk7CisjZW5kaWYKKworICAgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOWRmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgTUFQTEVfQ0xJX0FQSV9IXworI2RlZmluZSBNQVBMRV9DTElfQVBJX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKworLyogSW5pdGlhbGl6ZSBBUEkgQ0xJICovCitiY21vc19lcnJubyBhcGlfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpwYXJlbnRfZGlyLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKy8qIFVwZGF0ZSBBUEkgQ0xJIGNvbW1hbmRzIGZvciB0aGUgY3VycmVudCBkZXZpY2UgKi8KK2JjbW9zX2Vycm5vIGFwaV9jbGlfc2V0X2NvbW1hbmRzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE1BUExFX0NMSV9BUElfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2R1bXAuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTZkYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfZHVtcC5jCkBAIC0wLDAgKzEsOTU0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCisjaW5jbHVkZSAiYmNtX2FwaV9jbGlfaGVscGVycy5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBBUElDTElfT1VUUFVUX1NUWUxFX1NURCwKKyAgICBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVAorfSBhcGljbGlfb3V0cHV0X3N0eWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0eXBlOworICAgIHZvaWQgKmRhdGE7CisgICAgdWludDhfdCBiaXQ7Cit9IGFwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm87CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2R1bXBfYXJyYXkoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIHZvaWQgKmRhdGEsCisgICAgdWludDMyX3Qgc2l6ZSwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGFwaWNsaV9vdXRwdXRfc3R5bGUgc3R5bGUsCisgICAgY29uc3QgYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyAqcHJlc2VuY2VfbWFzaywKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgY29uc3QgY2hhciAqc3VmZml4KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfcmVhZF9zbnVtKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIHZvaWQgKmRhdGEsIGludDY0X3QgKm4pCit7CisgICAgc3dpdGNoICh0ZC0+c2l6ZSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgIHsKKyAgICAgICAgaW50OF90IG4xID0gKihpbnQ4X3QgKilkYXRhOworICAgICAgICAqbiA9IG4xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOgorICAgIHsKKyAgICAgICAgaW50MTZfdCBuMiA9ICooaW50MTZfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDQ6CisgICAgeworICAgICAgICBpbnQzMl90IG40ID0gKihpbnQzMl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuNDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgODoKKyAgICB7CisgICAgICAgIG1lbWNweShuLCBkYXRhLCBzaXplb2YoKm4pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiKioqIG51bWJlciBzaXplICV1IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIHRkLT5zaXplKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3JlYWRfdW51bShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCB2b2lkICpkYXRhLCB1aW50NjRfdCAqbikKK3sKKyAgICBzd2l0Y2ggKHRkLT5zaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgeworICAgICAgICB1aW50OF90IG4xID0gKih1aW50OF90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjoKKyAgICB7CisgICAgICAgIHVpbnQxNl90IG4yID0gKih1aW50MTZfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDQ6CisgICAgeworICAgICAgICB1aW50MzJfdCBuNCA9ICoodWludDMyX3QgKilkYXRhOworICAgICAgICAqbiA9IG40OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OgorICAgIHsKKyAgICAgICAgbWVtY3B5KG4sIGRhdGEsIHNpemVvZigqbikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogbnVtYmVyIHNpemUgJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgdGQtPnNpemUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2FwaWNsaV9zdHJjYXRfdXBwZXIoY2hhciAqZGVzdCwgdWludDMyX3QgZGVzdF9sZW4sIGNvbnN0IGNoYXIgKnNyYywgdWludDMyX3Qgc3JjX2xlbikKK3sKKyAgICB1aW50MzJfdCBzcmNfaWR4OworICAgIHVpbnQzMl90IGRlc3RfaWR4OworCisgICAgZm9yIChkZXN0X2lkeCA9IDA7IGRlc3RfaWR4IDwgZGVzdF9sZW4gLSAxOyArK2Rlc3RfaWR4KQorICAgIHsKKyAgICAgICAgaWYgKGRlc3RbZGVzdF9pZHhdID09ICdcMCcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzcmNfaWR4ID0gMDsgc3JjX2lkeCA8IHNyY19sZW4gJiYgZGVzdF9pZHggPCBkZXN0X2xlbiAtIDE7ICsrc3JjX2lkeCwgKytkZXN0X2lkeCkKKyAgICB7CisgICAgICAgIGRlc3RbZGVzdF9pZHhdID0gc3JjW3NyY19pZHhdOworICAgICAgICBpZiAoZGVzdFtkZXN0X2lkeF0gPj0gJ2EnICYmIGRlc3RbZGVzdF9pZHhdIDw9ICd6JykKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdFtkZXN0X2lkeF0gPSAnQScgKyAoZGVzdFtkZXN0X2lkeF0gLSAnYScpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVzdFtkZXN0X2lkeF0gPSAnXDAnOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2FwaWNsaV9nZXRfY19lbnVtX2lkKGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdGF0aWMgY2hhciBmdWxsX25hbWVfYnVmWzI1Nl07CisgICAgZnVsbF9uYW1lX2J1ZlswXSA9ICdcMCc7CisgICAgX2FwaWNsaV9zdHJjYXRfdXBwZXIoZnVsbF9uYW1lX2J1Ziwgc2l6ZW9mKGZ1bGxfbmFtZV9idWYpLCB0ZC0+bmFtZSwgc3RybGVuKHRkLT5uYW1lKSk7CisgICAgX2FwaWNsaV9zdHJjYXRfdXBwZXIoZnVsbF9uYW1lX2J1Ziwgc2l6ZW9mKGZ1bGxfbmFtZV9idWYpLCAiXyIsIDEpOworICAgIF9hcGljbGlfc3RyY2F0X3VwcGVyKGZ1bGxfbmFtZV9idWYsIHNpemVvZihmdWxsX25hbWVfYnVmKSwgbmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICByZXR1cm4gZnVsbF9uYW1lX2J1ZjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9zaW1wbGVfZGF0YV90eXBlKAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYXBpY2xpX291dHB1dF9zdHlsZSBzdHlsZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBzd2l0Y2ggKHRkLT5iYXNlX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TTlVNOiAgICAgICAvKiBzaWduZWQgbnVtYmVyICovCisgICAgeworICAgICAgICBpbnQ2NF90IG4gPSAwOworICAgICAgICByYyA9IF9hcGljbGlfcmVhZF9zbnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJWxsZCIsIChsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNOiAgICAgICAvKiB1bnNpZ25lZCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICByYyA9IF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWDogICAvKiB1bnNpZ25lZCBudW1iZXIgcHJpbnRlZCBpbiBoZXggKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICByYyA9IF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0ZMT0FUOiAgICAgIC8qIGZsb2F0aW5nLXBvaW50IG51bWJlciAqLworICAgIHsKKyAgICAgICAgaWYgKHRkLT5zaXplID09IHNpemVvZihmbG9hdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJWYiLCAqKGZsb2F0ICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGQtPnNpemUgPT0gc2l6ZW9mKGRvdWJsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJWYiLCAqKGRvdWJsZSAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9mIHdpZHRoICV1IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIHRkLT5zaXplKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9CT09MOgorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqbm9fc3RyID0gc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgPyAiQkNNT1NfRkFMU0UiIDogIm5vIjsKKyAgICAgICAgY29uc3QgY2hhciAqeWVzX3N0ciA9IHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUID8gIkJDTU9TX1RSVUUiIDogInllcyI7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICByYyA9IF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBuID09IDAgPyBub19zdHIgOiB5ZXNfc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORzogICAgIC8qIHN0cmluZyAqLworICAgIHsKKyAgICAgICAgaWYgKHRkLT5zaXplID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiXCIlc1wiIiwgKGNoYXIgKilkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGtub3cgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJcIiUuKnNcIiIsIHRkLT5zaXplLCAoY2hhciAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9JUFY0OiAgICAgICAvKiBJUHY0IGFkZHJlc3MgKi8KKyAgICB7CisgICAgICAgIHVpbnQzMl90IGlwOworICAgICAgICBtZW1jcHkoJmlwLCBkYXRhLCBzaXplb2YoaXApKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KAorICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgIHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUID8gInsgJWQsJWQsJWQsJWQgfSIgOiAiJWQuJWQuJWQuJWQiLAorICAgICAgICAgICAgKGlwID4+IDI0KSAmIDB4ZmYsIChpcCA+PiAxNikgJiAweGZmLCAoaXAgPj4gOCkgJiAweGZmLCBpcCAmIDB4ZmYpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfTUFDOiAgICAgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsKKyAgICAgICAgbWVtY3B5KG1hYy51OCwgZGF0YSwgc2l6ZW9mKG1hYy51OCkpOworICAgICAgICBiY21jbGlfcHJpbnQoCisgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgPworICAgICAgICAgICAgICAgICJ7eyAweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCB9fSIgOgorICAgICAgICAgICAgICAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisgICAgICAgICAgICBtYWMudThbMF0sIG1hYy51OFsxXSwgbWFjLnU4WzJdLCBtYWMudThbM10sIG1hYy51OFs0XSwgbWFjLnU4WzVdKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU06ICAgICAgIC8qIGVudW0gKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICByYyA9IF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIEJVR19PTih0ZC0+eC5lID09IE5VTEwpOworICAgICAgICBzID0gYmNtY2xpX2VudW1fc3RyaW5ndmFsKHRkLT54LmUsIChsb25nKW4pOworICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHMgPSBfYXBpY2xpX2dldF9jX2VudW1faWQodGQsIHMpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSzoKKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICBjb25zdCBjaGFyICpub25lID0gTlVMTDsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZSA9IHRkLT54LmU7CisgICAgICAgIGJjbW9zX2Jvb2wgZmlyc3QgPSBCQ01PU19UUlVFOworICAgICAgICBCVUdfT04odmFsdWUgPT0gTlVMTCk7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgd2hpbGUgKHZhbHVlLT5uYW1lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS0+dmFsID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9uZSA9IHZhbHVlLT5uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh2YWx1ZS0+dmFsICYgbikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gdmFsdWUtPm5hbWU7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IF9hcGljbGlfZ2V0X2NfZW51bV9pZCh0ZCwgcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMlcyIsIGZpcnN0ID8gIiIgOiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgPyAifCIgOiBCQ01DTElfRU5VTV9NQVNLX0RFTF9TVFIpLCBzKTsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIG4gLT0gdmFsdWUtPnZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVzIiwgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKSB8fCAoTlVMTCA9PSBub25lKSA/ICIwIiA6IG5vbmUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiKioqIHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgKGludCl0ZC0+YmFzZV90eXBlKTsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKworLyogY2FsY3VsYXRlIG51bWJlciBvZiBlbnVtIHZhbHVlcyAqLworc3RhdGljIGludCBfYXBpX2NsaV9nZXRfbnVtX2VudW1fdmFscyhjb25zdCBiY21jbGlfZW51bV92YWwgKnZhbHMpCit7CisgICAgY29uc3QgYmNtY2xpX2VudW1fdmFsICp2ID0gdmFsczsKKyAgICB3aGlsZSAodiAmJiB2LT5uYW1lKQorICAgIHsKKyAgICAgICAgKyt2OworICAgIH0KKyAgICByZXR1cm4gKHYgLSB2YWxzKTsKK30KKworLyogaGVscGVyIGZ1bmN0aW9uIHRvIHNraXAgdGhlICJ1LiIgaW4gZnJvbnQgb2YgdW5pb24gZmllbGQgbmFtZXMgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqX2FwaWNsaV9za2lwX3VuaW9uX3ByZWZpeChjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmIChuYW1lWzBdID09ICd1JyAmJiBuYW1lWzFdID09ICcuJykKKyAgICB7CisgICAgICAgIG5hbWUgKz0gMjsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9hcGljbGlfaXNfdmFsdWVfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvICpwcmVzZW5jZV9tYXNrKQoreworICAgIHVpbnQ2NF90IHBtX3ZhbHVlX251bSA9IDA7CisgICAgaWYgKCFwcmVzZW5jZV9tYXNrIHx8ICFwcmVzZW5jZV9tYXNrLT50eXBlKQorICAgIHsKKyAgICAgICAgLyogbm8gcHJlc2VuY2UgbWFzayAtIGFsbCB2YWx1ZXMgYXJlIGltcGxpY2l0bHkgc2V0ICovCisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICBfYXBpY2xpX3JlYWRfdW51bShzZXNzaW9uLCBwcmVzZW5jZV9tYXNrLT50eXBlLCBwcmVzZW5jZV9tYXNrLT5kYXRhLCAmcG1fdmFsdWVfbnVtKTsKKyAgICByZXR1cm4gKChwbV92YWx1ZV9udW0gPj4gcHJlc2VuY2VfbWFzay0+Yml0KSAmIDEpICE9IDA7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2Fycl9keW5fbGVuX2dldChjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIHZvaWQgKmRhdGEsIHVpbnQzMl90ICphcnJheV9zaXplKQoreworICAgIHN3aXRjaCAodGQtPnguYXJyX2R5bi5sZW5fc2l6ZSkKKyAgICB7CisgICAgY2FzZSAxOiAqYXJyYXlfc2l6ZSA9ICoodWludDhfdCAqKWRhdGE7IGJyZWFrOworICAgIGNhc2UgMjogKmFycmF5X3NpemUgPSAqKHVpbnQxNl90ICopZGF0YTsgYnJlYWs7CisgICAgY2FzZSA0OiAqYXJyYXlfc2l6ZSA9ICoodWludDMyX3QgKilkYXRhOyBicmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCAqX2FwaWNsaV9hcnJfZHluX2RhdGFfZ2V0KGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgdm9pZCAqZGF0YSkKK3sKKyAgICByZXR1cm4gKih2b2lkKiopQkNNT1NfUk9VTkRfVVAoKGxvbmcpZGF0YSArIHRkLT54LmFycl9keW4ubGVuX3NpemUsIHNpemVvZih2b2lkICopKTsKK30KKworLyogRHVtcCBkYXRhIHR5cGUgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2R1bXBfZGF0YV90eXBlKAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgdWludDMyX3QgbnVtX2VudHJpZXMsCisgICAgdWludDMyX3QgZW50cnlfc2l6ZSwKKyAgICBhcGljbGlfb3V0cHV0X3N0eWxlIHN0eWxlLAorICAgIGNvbnN0IGFwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm8gKnByZXNlbmNlX21hc2ssCisgICAgY29uc3QgY2hhciAqcHJlZml4LAorICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBzd2l0Y2ggKHRkLT5iYXNlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNUOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBmOworICAgICAgICAgICAgY2hhciBmdWxsX25hbWVbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICAgICAgICAgIGlmICghdGQtPngucy5udW1fZmllbGRzKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgQlVHX09OKCF0ZC0+eC5zLmZpZWxkcyk7CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnMubnVtX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkID0gJnRkLT54LnMuZmllbGRzW2ZdOworICAgICAgICAgICAgICAgIHZvaWQgKmZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvIGZpZWxkX3BtID0ge307CisgICAgICAgICAgICAgICAgaWYgKCgodGQtPngucy5maWVsZHNbMF0uZmxhZ3MgJiBCQ01DTElfRklFTERfREVTQ1JfRkxBR1NfUFJFU0VOQ0VfTUFTSykgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgIT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgc3RydWN0IGhhcyBhIHByZXNlbmNlIG1hc2ssIHNraXAgdGhlIHByZXNlbmNlIG1hc2sgZmllbGQgaXRzZWxmLCB0aGVuIHJlY29yZCB0aGUgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHByZXNlbmNlIG1hc2sgc28gd2UgY2FuIGNoZWNrIGl0IGxhdGVyIGZvciBlYWNoIGVudHJ5LiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpZWxkX3BtLnR5cGUgPSB0ZC0+eC5zLmZpZWxkc1swXS50eXBlOworICAgICAgICAgICAgICAgICAgICBmaWVsZF9wbS5kYXRhID0gKHVpbnQ4X3QgKilkYXRhICsgdGQtPngucy5maWVsZHNbMF0ub2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBmaWVsZF9wbS5iaXQgPSAodWludDhfdCkoZiAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgJiYgZiA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgIi4iLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSwgc3R5bGUsICZmaWVsZF9wbSwgcHJlZml4LCBzdWZmaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiIH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBQcmludCBmaWVsZHMgdXAgdG8gc2VsZWN0b3IsIHRoZW4gc2VsZWN0b3IsIHRoZW4gc2VsZWN0ZWQgc3ViLXN0cnVjdHVyZSAqLworICAgICAgICAgICAgdWludDE2X3QgZjsKKyAgICAgICAgICAgIGNoYXIgZnVsbF9uYW1lW0FQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSF07CisgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZsZDsKKyAgICAgICAgICAgIHZvaWQgKmZkYXRhOworICAgICAgICAgICAgaW50NjRfdCBzZWxlY3Rvcl92YWwgPSAwOworICAgICAgICAgICAgaW50IG51bV91bmlvbl92YWxzOworCisgICAgICAgICAgICBpZiAoIXRkLT54LnUubnVtX2NvbW1vbl9maWVsZHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBCVUdfT04oIXRkLT54LnUuY29tbW9uX2ZpZWxkcyk7CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQ29tbW9uIGZpZWxkcywgaW5jbHVkaW5nIHNlbGVjdG9yICovCisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDw9IHRkLT54LnUuY2xhc3NpZmllcl9pZHggJiYgIXJjOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICBmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxkLT5uYW1lICYmIHN0cmxlbihmbGQtPm5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIGZsZC0+dHlwZSwgZmRhdGEsIGZ1bGxfbmFtZSwgbnVtX2VudHJpZXMsIGVudHJ5X3NpemUsIHN0eWxlLCBwcmVzZW5jZV9tYXNrLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgPyByYyA6IF9hcGljbGlfcmVhZF9zbnVtKHNlc3Npb24sIGZsZC0+dHlwZSwgZmRhdGEsICZzZWxlY3Rvcl92YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiKioqaW50ZXJuYWwgZXJyb3Igd2hlbiBkdW1waW5nIGZpZWxkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl0ubmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1fdW5pb25fdmFscyA9IF9hcGlfY2xpX2dldF9udW1fZW51bV92YWxzKHRkLT54LnUuY29tbW9uX2ZpZWxkc1t0ZC0+eC51LmNsYXNzaWZpZXJfaWR4XS50eXBlLT54LmUpOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClzZWxlY3Rvcl92YWwgPj0gbnVtX3VuaW9uX3ZhbHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKippbnZhbGlkIHVuaW9uIHNlbGVjdG9yIHZhbHVlICVsbGRcbiIsIChsb25nIGxvbmcpc2VsZWN0b3JfdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29tbW9uIGZpZWxkcyBmb2xsb3dpbmcgc2VsZWN0b3IgKi8KKyAgICAgICAgICAgIGZvciAoOyBmIDwgdGQtPngudS5udW1fY29tbW9uX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl07CisgICAgICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxkLT5uYW1lICYmIHN0cmxlbihmbGQtPm5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIGZsZC0+dHlwZSwgZmRhdGEsIGZ1bGxfbmFtZSwgbnVtX2VudHJpZXMsIGVudHJ5X3NpemUsIHN0eWxlLCBwcmVzZW5jZV9tYXNrLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNlbGVjdGVkIGZpZWxkICovCisgICAgICAgICAgICBmbGQgPSAmdGQtPngudS51bmlvbl9maWVsZHNbc2VsZWN0b3JfdmFsXTsKKyAgICAgICAgICAgIGlmIChmbGQtPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7IC4lcyA9ICIsIF9hcGljbGlfc2tpcF91bmlvbl9wcmVmaXgoZmxkLT5uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgJiYgc3RybGVuKGZsZC0+bmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiB9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiIH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRDogLyogZml4ZWQgYXJyYXkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfYXJyYXkoc2Vzc2lvbiwgdGQtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZSwgZGF0YSwgdGQtPnguYXJyX2ZpeGVkLnNpemUsIG5hbWUsIHN0eWxlLCBwcmVzZW5jZV9tYXNrLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOOiAgIC8qIGR5bmFtaWMgYXJyYXkgdGhhdCBzaG91bGQgYmUgcHJpbnRlZCBhcyBidWZmZXIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVhZCBsZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGFycmF5X3NpemU7CisKKyAgICAgICAgICAgIHJjID0gX2FwaWNsaV9hcnJfZHluX2xlbl9nZXQodGQsIGRhdGEsICZhcnJheV9zaXplKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiAlczogZHluIGFycmF5IGxlbl9zaXplICV1IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIG5hbWUsIHRkLT54LmFycl9keW4ubGVuX3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkX25hbWUgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkX25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK2ZpZWxkX25hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAieyAldSwgJXMgfSIsIGFycmF5X3NpemUsIGZpZWxkX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgZGF0YSA9IF9hcGljbGlfYXJyX2R5bl9kYXRhX2dldCh0ZCwgZGF0YSk7CisgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9hcnJheShzZXNzaW9uLCB0ZC0+eC5hcnJfZHluLmVsZW1fdHlwZSwgZGF0YSwgYXJyYXlfc2l6ZSwgbmFtZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmluYWxseSEgU2ltcGxlIHR5cGUgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIENMSSBwYXJhbWV0ZXIgKi8KKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyBsb2NhbF9wbTsKKworICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHNpbmdsZSB2YWx1ZSBhbmQgdGhhdCB2YWx1ZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHByZXNlbmNlIG1hc2ssIGp1c3Qgc2tpcCBpdCBlbnRpcmVseSAqLworICAgICAgICAgICAgaWYgKG51bV9lbnRyaWVzID09IDEgJiYgIV9hcGljbGlfaXNfdmFsdWVfc2V0KHNlc3Npb24sIHByZXNlbmNlX21hc2spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3R5bGUgIT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVzJXM9IiwgcHJlZml4LCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFudW1fZW50cmllcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCBCQ01DTElfQVJSQVlfRU1QVFkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRHVtcCBzaW1wbGUgdmFsdWUgb3IgYXJyYXkgb2Ygc2ltcGxlIHZhbHVlcyAqLworICAgICAgICAgICAgbG9jYWxfcG0gPSBwcmVzZW5jZV9tYXNrID8gKnByZXNlbmNlX21hc2sgOiAoYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyl7fTsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBudW1fZW50cmllczsgbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIsIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHByZXNlbmNlIG1hc2ssIG1ha2Ugc3VyZSB0byBwcmludCBhIHNwZWNpYWwgdG9rZW4gaWYgdGhlIHZhbHVlIGlzIHVuc2V0ICovCisgICAgICAgICAgICAgICAgaWYgKF9hcGljbGlfaXNfdmFsdWVfc2V0KHNlc3Npb24sICZsb2NhbF9wbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9zaW1wbGVfZGF0YV90eXBlKHNlc3Npb24sIHRkLCBkYXRhLCBuYW1lLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCBCQ01DTElfUEFSTV9OT19WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgICAgICBsb2NhbF9wbS5kYXRhID0gKHZvaWQgKikoKGxvbmcpbG9jYWxfcG0uZGF0YSArIGVudHJ5X3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIHN1ZmZpeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIER1bXAgYXJyYXkgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2R1bXBfYXJyYXkoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIHZvaWQgKmRhdGEsCisgICAgdWludDMyX3Qgc2l6ZSwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGFwaWNsaV9vdXRwdXRfc3R5bGUgc3R5bGUsCisgICAgY29uc3QgYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyAqcHJlc2VuY2VfbWFzaywKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgY29uc3QgY2hhciAqc3VmZml4KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFByaW50IGFzIGJ1ZmZlciBvciBlbGVtZW50IGJ5IGVsZW1lbnQgPyAqLworICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAieyAiKTsKKyAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIHRkLCBkYXRhLCBuYW1lLCBzaXplLCB0ZC0+c2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgfSIpOworICAgIH0KKyAgICBlbHNlIGlmICgodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0gfHwgdGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYKSAmJiB0ZC0+c2l6ZSA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKF9hcGljbGlfaXNfdmFsdWVfc2V0KHNlc3Npb24sIHByZXNlbmNlX21hc2spKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBpOworCisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVzJXM9IiwgcHJlZml4LCBuYW1lKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlMDJ4IiwgKCh1aW50OF90KilkYXRhKVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVzIiwgc3VmZml4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgdGQsIGRhdGEsIG5hbWUsIHNpemUsIHRkLT5zaXplLCBzdHlsZSwgcHJlc2VuY2VfbWFzaywgcHJlZml4LCBzdWZmaXgpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIER1bXAgcHJvcGVydHkgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX3Byb3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhKQoreworICAgIHJldHVybiBfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIHBkLT50eXBlLCBwcm9wX2RhdGEsIHBkLT5uYW1lLCAxLCAwLCBBUElDTElfT1VUUFVUX1NUWUxFX1NURCwgTlVMTCwgIiAgICIsICJcbiIpOworfQorCisvKiBEdW1wIGEgc2luZ2xlIHByb3BlcnR5IHZhbHVlIGluIEMgaW5pdGlhbGl6ZXIgZm9ybWF0ICovCitiY21vc19lcnJubyBhcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIHZvaWQgKnByb3BfZGF0YSkKK3sKKyAgICByZXR1cm4gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBwZC0+dHlwZSwgcHJvcF9kYXRhLCBwZC0+bmFtZSwgMSwgMCwgQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQsIE5VTEwsICIiLCAiIik7Cit9CisKK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX2R5bl9hcnJheSgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IGFycmF5X3NpemU7CisKKyAgICByYyA9IF9hcGljbGlfYXJyX2R5bl9sZW5fZ2V0KHRkLCBkYXRhLCAmYXJyYXlfc2l6ZSk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICByZXR1cm4gX2FwaWNsaV9kdW1wX2FycmF5KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICB0ZC0+eC5hcnJfZHluLmVsZW1fdHlwZSwKKyAgICAgICAgX2FwaWNsaV9hcnJfZHluX2RhdGFfZ2V0KHRkLCBkYXRhKSwKKyAgICAgICAgYXJyYXlfc2l6ZSwKKyAgICAgICAgbmFtZSwKKyAgICAgICAgQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQsCisgICAgICAgIE5VTEwsCisgICAgICAgICIiLAorICAgICAgICAiIik7Cit9CisKKy8qIER1bXAgcHJvcGVydHkgYXMgQ0xJIHBhcmFtZXRlcnMgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX3Byb3BfcGFyYW0oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgcmV0dXJuIF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgcGQtPnR5cGUsIHByb3BfZGF0YSwgcGQtPm5hbWUsIDEsIDAsIEFQSUNMSV9PVVRQVVRfU1RZTEVfU1RELCBOVUxMLCBwcmVmaXgsICIiKTsKK30KKworLyogQ2FsY3VsYXRlIHByb3BlcnR5IHBvaW50ZXIgZ2l2ZW4gdGhlIGdyb3VwIGRhdGEgcG9pbnRlciBhbmQgcHJvcGVydHkgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqX2FwaWNsaV9wcm9wX2RhdGFfcHRyKHZvaWQgKmdyb3VwX3B0ciwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkKQoreworICAgIHJldHVybiAodm9pZCAqKSgobG9uZylncm91cF9wdHIgKyBwZC0+b2Zmc2V0KTsKK30KKworLyogRHVtcCBvYmplY3QgZGF0YSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9kYXRhKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfbXNnICptc2csIHZvaWQgKmRhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCBwcm9wOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgImRhdGE6XG4iKTsKKyAgICBmb3IgKHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgdm9pZCAqcHJvcF9kYXRhID0gX2FwaWNsaV9wcm9wX2RhdGFfcHRyKGRhdGEsIHBkKTsKKyAgICAgICAgaWYgKCEobXNnLT5wcmVzZW5jZV9tYXNrICYgKDFMTCA8PCBwcm9wKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCFwcm9wX2RhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEJVR19PTihwZC0+b2Zmc2V0ID4gZGF0YV9zaXplKTsKKyAgICAgICAgcmMgPSBhcGljbGlfZHVtcF9wcm9wKHNlc3Npb24sIHBkLCBwcm9wX2RhdGEpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiBEdW1wIG9iamVjdCBrZXkgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2R1bXBfa2V5KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfbXNnICptc2csIHZvaWQgKmtleSwgdWludDMyX3Qga2V5X3NpemUpCit7CisgICAgdWludDE2X3QgcHJvcDsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJrZXk6XG4iKTsKKyAgICBmb3IgKHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHByb3AsICZwZCkgPT0gQkNNX0VSUl9PSzsKKyAgICAgICAgICsrcHJvcCkKKyAgICB7CisgICAgICAgIHZvaWQgKnByb3BfZGF0YSA9IF9hcGljbGlfcHJvcF9kYXRhX3B0cihrZXksIHBkKTsKKyAgICAgICAgaWYgKCFwcm9wX2RhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEJVR19PTihwZC0+b2Zmc2V0ID4ga2V5X3NpemUpOworICAgICAgICByYyA9IGFwaWNsaV9kdW1wX3Byb3Aoc2Vzc2lvbiwgcGQsIHByb3BfZGF0YSk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK2NvbnN0IGNoYXIgKmFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXApCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cl90YWJsZVtCQ01PTFRfTUdUX0dST1VQX19OVU1fT0ZdID0KKyAgICB7CisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX0tFWV0gICAgICA9ICJrZXkiLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9DRkddICAgICAgPSAiY2ZnIiwKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfU1RBVF0gICAgID0gInN0YXQiLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGR10gPSAic3RhdF9jZmciLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9BVVRPXSAgICAgPSAiYXV0byIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHXSA9ICJhdXRvX2NmZyIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX09QRVJdICAgICA9ICJvcGVyIiwKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfUFJPWFldICAgID0gInByb3h5IiwKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlhdID0gInByb3h5X3J4IgorICAgIH07CisgICAgcmV0dXJuIChncm91cCA+PSBCQ01PTFRfTUdUX0dST1VQX19OVU1fT0YpID8gIjx1bmtub3duPiIgOiBzdHJfdGFibGVbZ3JvdXBdOworfQorCisvKiBEdW1wIG1lc3NhZ2Ugc2V0IHJldHVybmVkIGJ5IG11bHRpLW9iamVjdCBHRVQgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2R1bXBfbXNnc2V0KAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGJjbW9sdF9tc2cgKm1zZywKKyAgICB1aW50MzJfdCBrZXlfc2l6ZSwKKyAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQpCit7CisgICAgdWludDE2X3QgaW5zdDsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB2b2lkICprZXkgPSBOVUxMOworICAgIHZvaWQgKmRhdGEgPSBOVUxMOworCisgICAgaWYgKG1zZy0+bXNnX3NldCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTlVMTDsKKyAgICB9CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIm1vcmU6ICVzXG4iLCBtc2ctPm1zZ19zZXQtPm1vcmUgPyAieWVzIiA6ICJubyIpOworICAgIGlmIChtc2ctPm1zZ19zZXQtPm1vcmUpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIm5leHQgIik7CisgICAgICAgIF9hcGljbGlfZHVtcF9rZXkoc2Vzc2lvbiwgbXNnLCBtc2ctPm1zZ19zZXQtPm5leHRfa2V5LCBrZXlfc2l6ZSk7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJudW1iZXIgb2Ygb2JqZWN0cyByZXR1cm5lZDogJWRcbiIsIG1zZy0+bXNnX3NldC0+bnVtX2luc3RhbmNlcyk7CisgICAgZm9yIChpbnN0ID0gMDsgaW5zdCA8IG1zZy0+bXNnX3NldC0+bnVtX2luc3RhbmNlczsgaW5zdCsrKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJvYmplY3QgJWQ6XG4iLCBpbnN0KTsKKworICAgICAgICBrZXkgPSAodm9pZCAqKSgobG9uZyltc2ctPm1zZ19zZXQtPm1zZ1tpbnN0XSArIHNpemVvZihiY21vbHRfbXNnKSk7CisgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2tleShzZXNzaW9uLCBtc2ctPm1zZ19zZXQtPm1zZ1tpbnN0XSwga2V5LCBrZXlfc2l6ZSk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAgICBkYXRhID0gKHZvaWQgKikoKGxvbmcpbXNnLT5tc2dfc2V0LT5tc2dbaW5zdF0gKyBkYXRhX29mZnNldCk7CisgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGEoc2Vzc2lvbiwgbXNnLT5tc2dfc2V0LT5tc2dbaW5zdF0sIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIER1bXAgbWVzc2FnZSAqLworYmNtb3NfZXJybm8gYXBpY2xpX21zZ19kdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgY29uc3QgY2hhciAqbmFtZSwgKmRlc2NyOworICAgIHVpbnQzMl90IGtleV9zaXplOworICAgIHVpbnQzMl90IGtleV9vZmZzZXQ7CisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IGRhdGFfb2Zmc2V0OworICAgIHZvaWQgKmtleSA9IE5VTEw7CisgICAgdm9pZCAqZGF0YSA9IE5VTEw7CisKKyAgICByYyA9IGFwaV9jbGlfb2JqZWN0X25hbWUobXNnLT5vYmpfdHlwZSwgJm5hbWUsICZkZXNjcik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgZ290byBkdW1wX2Vycm9yOworICAgIH0KKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAib2JqZWN0OiAiKTsKKyAgICBpZiAobmFtZSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBuYW1lKTsKKyAgICB9CisgICAgaWYgKGRlc2NyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgLSAlcyIsIGRlc2NyKTsKKyAgICB9CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJcbiIpOworICAgIHJjID0gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoCisgICAgICAgIG1zZy0+b2JqX3R5cGUsCisgICAgICAgIG1zZy0+Z3JvdXAsCisgICAgICAgIG1zZy0+c3ViZ3JvdXAsCisgICAgICAgICZrZXlfc2l6ZSwKKyAgICAgICAgJmtleV9vZmZzZXQsCisgICAgICAgICZkYXRhX3NpemUsCisgICAgICAgICZkYXRhX29mZnNldCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgZ290byBkdW1wX2Vycm9yOworICAgIH0KKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkgIT0gMCA/ICJnZXQiIDogInNldCIpOworICAgIGlmICgobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0NMRUFSKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIsY2xlYXIiKTsKKyAgICB9CisgICAgaWYgKChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfTVVMVEkpICE9IDApCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIixtdWx0aSIpOworICAgIH0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiAlcyAiLCBhcGljbGlfbWd0X2dyb3VwX3RvX3N0cihtc2ctPmdyb3VwKSk7CisKKyAgICBpZiAobXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX0NGRyAmJiBtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCAmJgorICAgICAgICBtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcgJiYgbXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqc3ViX25hbWUsICpzdWJfZGVzY3I7CisgICAgICAgIC8qIEdldCBuYW1lIG9mIHNwZWNpZmljIHN1Ymdyb3VwICovCisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmc3ViX25hbWUsICZzdWJfZGVzY3IpOworICAgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZHVtcF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInN1Ymdyb3VwOiAlcy0lcyAiLCBzdWJfbmFtZSA/IHN1Yl9uYW1lIDogIj8iLCBzdWJfZGVzY3IgPyBzdWJfZGVzY3IgOiAiIik7CisgICAgfQorICAgIGlmIChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJyZXF1ZXN0XG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJyZXNwb25zZTogJXMgJXNcbiIsIGJjbW9zX3N0cmVycm9yKG1zZy0+ZXJyKSwgbXNnLT5lcnJfdGV4dCk7CisgICAgfQorCisgICAgaWYgKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFICYmIChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfTVVMVEkpICE9IDApCisgICAgeworICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9tc2dzZXQoc2Vzc2lvbiwgbXNnLCBrZXlfc2l6ZSwgZGF0YV9zaXplLCBkYXRhX29mZnNldCk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkdW1wX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgobXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHKSAmJiBrZXlfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAga2V5ID0gKHZvaWQgKikoKGxvbmcpbXNnICsga2V5X29mZnNldCk7CisgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9rZXkoc2Vzc2lvbiwgbXNnLCBrZXksIGtleV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGFfc2l6ZSAmJgorICAgICAgICAgICAgICggICgobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVRVUVTVCkgJiYgKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpKSAgfHwKKyAgICAgICAgICAgICAgICAoKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFKSAmJiAobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkpIHx8CisgICAgICAgICAgICAgICAgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgIChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgpCisgICAgICAgICAgICAgKQorICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgobG9uZyltc2cgKyBkYXRhX29mZnNldCk7CisgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhKHNlc3Npb24sIG1zZywgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKK2R1bXBfZXJyb3I6CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogT2JqZWN0IGR1bXAgZXJyb3IgJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oYW5kbGVycy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGFuZGxlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDliZmVmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGFuZGxlcnMuYwpAQCAtMCwwICsxLDY3NzMxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpX2hlbHBlcnMuaD4KKyNpbmNsdWRlICJiY21fYXBpX2NsaV9oYW5kbGVycy5oIgorCitiY21jbGlfc2Vzc2lvbiAqYXBpY2xpX2NsaV9sb2dfc2Vzc2lvbiA9IE5VTEw7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDMyX3QgdXNlZDsKKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldDsgICAgLyogdXNlZCBmb3IgbXVsdGktb2JqZWN0IGdldCBtZXNzYWdlcyAqLworfSBhcGljbGlfYnl0ZV9wb29sOworCisvKiBvbmx5IHN0b3JlIDEgbWVzc2FnZSBzZXQgYXQgYSB0aW1lIHNvIGl0J3MgZWFzeSB0byBjbGVhbiB1cCBhZnRlciAqLworc3RhdGljIGJjbW9zX2Vycm5vIGFwaWNsaV9ieXRlX3Bvb2xfY3JlYXRlKGFwaWNsaV9ieXRlX3Bvb2wgKmJ1ZikKK3sKKyAgICBidWYtPnVzZWQgPSAwOworICAgIGJ1Zi0+c3RhcnQgPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYnVmLT5tc2dfc2V0ID0gTlVMTDsKKyAgICByZXR1cm4gKGJ1Zi0+c3RhcnQgPT0gTlVMTCkgPyBCQ01fRVJSX05PTUVNIDogQkNNX0VSUl9PSzsKK30KKworc3RhdGljIHZvaWQgYXBpY2xpX2J5dGVfcG9vbF9kZXN0cm95KGFwaWNsaV9ieXRlX3Bvb2wgKmJ1ZikKK3sKKyAgICBpZiAoYnVmLT5tc2dfc2V0ICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX3NldF9mcmVlKGJ1Zi0+bXNnX3NldCk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShidWYtPnN0YXJ0KTsKK30KKworc3RhdGljIHZvaWQgKmFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGFwaWNsaV9ieXRlX3Bvb2wgKmJ1ZiwgdWludDMyX3QgbnVtX2J5dGVzKQoreworICAgIHZvaWQgKnJldDsKKyAgICBpZiAoYnVmLT51c2VkICsgbnVtX2J5dGVzID4gQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldCA9IGJ1Zi0+c3RhcnQgKyBidWYtPnVzZWQ7CisgICAgYnVmLT51c2VkICs9IG51bV9ieXRlczsKKyAgICBtZW1zZXQocmV0LCAwLCBudW1fYnl0ZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGljbGlfbXNnX3NldF9hbGxvYyhhcGljbGlfYnl0ZV9wb29sICpidWYsIGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MzJfdCBtYXhfaW5zdGFuY2VzLCBiY21vbHRfbXNnX3NldCAqKm1zZ19zZXQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGlmIChidWYtPm1zZ19zZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOyAgIC8qIG9ubHkgb25lIGF0IGEgdGltZSAqLworICAgIH0KKworICAgIGVyciA9IGJjbW9sdF9tc2dfc2V0X2FsbG9jKG9iaiwgZ3JvdXAsIG1heF9pbnN0YW5jZXMsICZidWYtPm1zZ19zZXQpOworICAgICptc2dfc2V0ID0gYnVmLT5tc2dfc2V0OworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBTdGFydC9lbmQgYmFubmVycyAtIHRoZXNlIGFyZSBzcGVjaWFsbHkgZm9ybWF0dGVkIHNvIGxpc3RlbmluZyBhcHBzIGNhbiBlYXNpbHkgdGVsbCB3aGVyZSBBUEkgaGFuZGxpbmcgc3RhcnRzL2VuZHMuCisgKi8KK3N0YXRpYyB2b2lkIGFwaWNsaV9wcmludF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYXBpX25hbWUpCit7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJbLS0gQVBJIFN0YXJ0OiAlcyAtLV1cbiIsIGFwaV9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJbLS0gQVBJIE1lc3NhZ2UgRGF0YSAtLV1cbiIpOworfQorCitzdGF0aWMgdm9pZCBhcGljbGlfcHJpbnRfY29tcGxldGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9zX2Vycm5vIGVyciwgY29uc3QgY2hhciAqZXJyX3RleHQpCit7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LICYmIGVycl90ZXh0ICE9IE5VTEwgJiYgZXJyX3RleHRbMF0gIT0gJ1wwJykKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiRVJST1I6ICVzIiwgZXJyX3RleHQpOworICAgIH0KKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiWy0tIEFQSSBDb21wbGV0ZTogJWQgKCVzKSAtLV1cbiIsIGVyciwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7Cit9CisKK3N0YXRpYyBpbnQgYXBpY2xpX2NsaV9zZXNzaW9uX3dyaXRlX2NiKGJjbWNsaV9zZXNzaW9uICpjbGlfc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbWNsaV9sb2coYnVmLCAiJS4qcyIsIHNpemUsIGJ1Zik7CisgICAgcmV0dXJuIChpbnQpc2l6ZTsKK30KKworLyogTG9ncyBhIHByb3BlcnR5IHZhbHVlIHRvIHRoZSBDTEkgbG9nIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBpcyBhIHZhbGlkIFJIUyBpbiBhbiBpbml0aWFsaXplci4gIEZvciBhIHByaW1pdHZlLCB0aGlzCisgKiB3aWxsIGp1c3QgcHJpbnQgdGhlIHZhbHVlIChlLmcuICI0MiIpLiAgRm9yIGEgc3RydWN0LCBpdCB3aWxsIGVtaXQgYWxsIG1lbWJlcnMgaW4gYmV0d2VlbiBjdXJseSBicmFjZXMuICovCitzdGF0aWMgdm9pZCBhcGljbGlfbG9nX3Byb3BfdmFsKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgdWludDE2X3QgcHJvcCwgdm9pZCAqdmFsdWUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwcm9wX2Rlc2NyOworCisgICAgaWYgKGFwaWNsaV9jbGlfbG9nX3Nlc3Npb24gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFyYW1zID0geyAud3JpdGUgPSBhcGljbGlfY2xpX3Nlc3Npb25fd3JpdGVfY2IgfTsKKworICAgICAgICBlcnIgPSBiY21jbGlfc2Vzc2lvbl9vcGVuKCZzZXNzaW9uX3BhcmFtcywgJmFwaWNsaV9jbGlfbG9nX3Nlc3Npb24pOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3Igb3BlbmluZyBzZXNzaW9uOiAlcyIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkob2JqLCBncm91cCwgc3ViZ3JvdXAsIHByb3AsICZwcm9wX2Rlc2NyKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yIGdldHRpbmcgaW5mbyBmb3IgcHJvcGVydHk6ICVzIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlcnIgPSBhcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKGFwaWNsaV9jbGlfbG9nX3Nlc3Npb24sIHByb3BfZGVzY3IsIHZhbHVlKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yIHByaW50aW5nIHByb3BlcnR5OiAlcyIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2lwdjRfYWRkcmVzcyBhcGljbGlfdW51bWJlcl90b19pcHY0KHVpbnQzMl90IG51bSkKK3sKKyAgICBiY21vc19pcHY0X2FkZHJlc3MgaXA7CisgICAgaXAudTMyID0gbnVtOworICAgIHJldHVybiBpcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX25pX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX25pX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfbmlfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaV9lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIGFlX25pX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIGFlX25pX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdHVfMTBnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgbXR1XzEwZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGFlX25pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgYWVfbmksIGFlX25pX2VuKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhZV9uaSwgbXR1XzEwZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfbmlfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfbmlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFlX25pID0gKGJjbW9sdF9hZV9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhZV9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWVfbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgYWVfbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdHVfMTBnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmJzX2NoZWNrZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IChiY21vbHRfcHJic19jaGVja2VyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19jaGVja2VyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX25pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfbmlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgYWVfbmksIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9uaV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX25pX2NmZyBjZmc7ICAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgYWVfbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBtYWNfYWRkcmVzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hZV9uaV9lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FlX25pX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBhZV9uaV9lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgYWVfbmlfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmlfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgYWVfbmlfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIGFlX25pX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgbXR1XzEwZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgbXR1XzEwZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgbXR1XzEwZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgbXR1XzEwZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IChiY21vbHRfcHJic19jaGVja2VyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9ja19zdGF0ZSA9IChiY21vbHRfcHJic19sb2NrX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfY291bnRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgYWVfbmksIG1hY19hZGRyZXNzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgYWVfbmksIGFlX25pX2VuKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgYWVfbmksIG10dV8xMGcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgcHJic19nZW5lcmF0b3IpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgYWVfbmksIHByYnNfc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX25pX29wZXJfc2V0X2FlX25pX2VuX3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlIG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGFlX25pLCBzZXRfYWVfbmlfZW5fc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgYWVfbmksIHNldF9hZV9uaV9lbl9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZXdfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYWVfbmlfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGFlX25pLCBzZXRfYWVfbmlfZW5fc3RhdGUsIG5ld19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGFlX25pLCBzZXRfYWVfbmlfZW5fc3RhdGUsIG5ld19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfQUVfTklfT1BFUl9JRF9TRVRfQUVfTklfRU5fU1RBVEUsIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0IHN0YXQ7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgYWVfcGF0aF9kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBhZV9wYXRoX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGJ5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzY0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEyOF8yNTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEwMjRfMTUxOCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzQwOTZfOTIxNiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCB1bmljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGFib3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMjhfMjU1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGJyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZGF0YV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBtdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGFib3J0X2ZyYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfZHNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFlX25pID0gKGJjbW9sdF9hZV9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhZV9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWVfbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9BRV9QQVRIX0RTX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF91c19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0IHN0YXQ7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgYWVfcGF0aF91cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBhZV9wYXRoX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGJ5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzY0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEyOF8yNTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEwMjRfMTUxOCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzQwOTZfOTIxNiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCB1bmljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGFib3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmY3NfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZmNzX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm92ZXJzaXplX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBvdmVyc2l6ZV9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnVudF9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBydW50X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBydW50X2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMjhfMjU1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGJyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZGF0YV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBtdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGFib3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgb3ZlcnNpemVfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgcnVudF9lcnJvcikpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfdXNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFlX25pID0gKGJjbW9sdF9hZV9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhZV9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWVfbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GQ1NfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZjc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZmNzX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgcnVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF91c19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgYWVfcGF0aF91cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgYWVfcGF0aF91cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9jaGFubmVsX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9jaGFubmVsX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jaGFubmVsX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIG9wZXJhdGlvbl9jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgdG9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgdG9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGNoYW5uZWwsIHRvbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9jaGFubmVsX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9jaGFubmVsX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jaGFubmVsX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbC5yZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wucmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbC5vZG5fY2xhc3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vZG5fY2xhc3MgPSAoYmNtb2x0X29kbl9jbGFzcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLm9kbl9jbGFzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLmRzX2ZlY19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHNfZmVjX21vZGUgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5kc19mZWNfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnByb3RvY29sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJvdG9jb2wgPSAoYmNtb2x0X3RjX3Byb3RvY29sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wucHJvdG9jb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbC5kc19saW5rX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kc19saW5rX3R5cGUgPSAoYmNtb2x0X2xpbmtfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLmRzX2xpbmtfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbC5wb25faWQuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnBvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbC5wb25faWQuZHdsY2hfaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5wb25faWQuZHdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmR3bGNoX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wuYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5jIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgdG9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIHRvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUubmdfMl9zeXNfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5uZ18yX3N5c19pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN5c3RlbV9wcm9maWxlLm5nXzJfc3lzX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUudmVyc2lvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZlcnNpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS52ZXJzaW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUuY2hhbm5lbF9zcGFjaW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2hhbm5lbF9zcGFjaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUuY2hhbm5lbF9zcGFjaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUudXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyA9IChiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlLnVzX21zZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzX21zZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN5c3RlbV9wcm9maWxlLnVzX21zZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlLmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgPSAoYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN5c3RlbV9wcm9maWxlLmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUuZnNyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZnNyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUuZnNyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUudHdkbV9jaGFubmVsX2NvdW50Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHdkbV9jaGFubmVsX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUudHdkbV9jaGFubmVsX2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3lzdGVtX3Byb2ZpbGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGNoYW5uZWxfcHJvZmlsZS5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci52ZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnZlcnNpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9pbmRleCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX2luZGV4IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmNoYW5uZWxfaW5kZXggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQuc2lnbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZHNfZnJlcXVlbmN5X29mZnNldC5zaWduID0gKGJjbW9sdF9zaWduKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQudmFsdWUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZHNfZnJlcXVlbmN5X29mZnNldC52YWx1ZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9wYXJ0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9wYXJ0aXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uY2hhbm5lbF9wYXJ0aXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnV3bGNoX2lkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnV3bGNoX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnV3bGNoX2lkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19mcmVxdWVuY3kiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXNfZnJlcXVlbmN5IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnVzX2ZyZXF1ZW5jeSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXNfcmF0ZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19yYXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnVzX3JhdGUgPSAoYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRlZmF1bHRfb251X2F0dGVudWF0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRlZmF1bHRfb251X2F0dGVudWF0aW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmRlZmF1bHRfb251X2F0dGVudWF0aW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5yZXNwb25zZV90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIucmVzcG9uc2VfdGhyZXNob2xkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnJlc3BvbnNlX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXNfbGlua190eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnVzX2xpbmtfdHlwZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS51c19saW5rX3R5cGUgPSAoYmNtb2x0X2xpbmtfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuaXNfdmFsaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIuaXNfdmFsaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfdmFsaWQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBjaGFubmVsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBjaGFubmVsLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5yZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5vZG5fY2xhc3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vZG5fY2xhc3MgPSAoYmNtb2x0X29kbl9jbGFzcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5vZG5fY2xhc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wuZHNfZmVjX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kc19mZWNfbW9kZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5kc19mZWNfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5wcm90b2NvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByb3RvY29sID0gKGJjbW9sdF90Y19wcm90b2NvbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5wcm90b2NvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5kc19saW5rX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kc19saW5rX3R5cGUgPSAoYmNtb2x0X2xpbmtfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5kc19saW5rX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnBvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC5kd2xjaF9pZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnBvbl9pZC5kd2xjaF9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmR3bGNoX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5jIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5jIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIG9wZXJhdGlvbl9jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIG9wZXJhdGlvbl9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudG9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIHRvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCB0b2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBjaGFubmVsLCB0b2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgdG9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N5c3RlbV9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUubmdfMl9zeXNfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5uZ18yX3N5c19pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5uZ18yX3N5c19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS52ZXJzaW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS52ZXJzaW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLmNoYW5uZWxfc3BhY2luZyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNoYW5uZWxfc3BhY2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5jaGFubmVsX3NwYWNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUudXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyA9IChiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUudXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUudXNfbXNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNfbXNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLnVzX21zZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kID0gKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUuZnNyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZnNyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLmZzciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50d2RtX2NoYW5uZWxfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUudHdkbV9jaGFubmVsX2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3lzdGVtX3Byb2ZpbGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIHN5c3RlbV9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIHN5c3RlbV9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudmVyc2lvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudmVyc2lvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS52ZXJzaW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9pbmRleCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9pbmRleCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5jaGFubmVsX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuZHNfZnJlcXVlbmN5X29mZnNldC5zaWduIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZHNfZnJlcXVlbmN5X29mZnNldC5zaWduID0gKGJjbW9sdF9zaWduKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuZHNfZnJlcXVlbmN5X29mZnNldC52YWx1ZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuZHNfZnJlcXVlbmN5X29mZnNldC52YWx1ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9wYXJ0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLmNoYW5uZWxfcGFydGl0aW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmNoYW5uZWxfcGFydGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudXdsY2hfaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLnV3bGNoX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnV3bGNoX2lkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudXNfZnJlcXVlbmN5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19mcmVxdWVuY3kgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXNfZnJlcXVlbmN5ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudXNfcmF0ZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudXNfcmF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS51c19yYXRlID0gKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLmRlZmF1bHRfb251X2F0dGVudWF0aW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmRlZmF1bHRfb251X2F0dGVudWF0aW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIucmVzcG9uc2VfdGhyZXNob2xkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5yZXNwb25zZV90aHJlc2hvbGQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucmVzcG9uc2VfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudXNfbGlua190eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19saW5rX3R5cGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXNfbGlua190eXBlID0gKGJjbW9sdF9saW5rX3R5cGUpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5pc192YWxpZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuaXNfdmFsaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfdmFsaWQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBjaGFubmVsLCB0b2wpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBjaGFubmVsLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGVidWdfb3Blcl9jbGlfaW5wdXRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfY2xpX2lucHV0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRlYnVnLCBjbGlfaW5wdXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIGNsaV9pbnB1dCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MzIgdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZWJ1ZywgY2xpX2lucHV0LCBkYXRhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFQlVHX09QRVJfSURfQ0xJX0lOUFVULCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRlYnVnLCBjbGlfaW5wdXQsIGRhdGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25zb2xlX3JlZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgY29uc29sZV9yZWRpcmVjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBpbmRpY2F0aW9uc19kcm9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX3VzZWRfcGVyY2VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGZpbGVfdXNlZF9wZXJjZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGZpbGVfdXNlZF9wZXJjZW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9jZmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9idWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGVidWcsIGZpbGVfdXNlZF9wZXJjZW50KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcikpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBkZWJ1ZywgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGRlYnVnLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25zb2xlX3JlZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2NmZy5idWZmZXJfc2l6ZV9ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1ZmZlcl9zaXplX2J5dGVzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVmZmVyX21vZGUgPSAoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2NmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5vZmZzZXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLnNpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2ZnIGNmZzsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29uc29sZV9yZWRpcmVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgY29uc29sZV9yZWRpcmVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgY29uc29sZV9yZWRpcmVjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnNvbGVfcmVkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgY29uc29sZV9yZWRpcmVjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgY29uc29sZV9yZWRpcmVjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmluZGljYXRpb25zX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGluZGljYXRpb25zX2Ryb3BwZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGluZGljYXRpb25zX2Ryb3BwZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGluZGljYXRpb25zX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGluZGljYXRpb25zX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5maWxlX3VzZWRfcGVyY2VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBmaWxlX3VzZWRfcGVyY2VudCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0ZJTEVfVVNFRF9QRVJDRU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV91c2VkX3BlcmNlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGZpbGVfdXNlZF9wZXJjZW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IChiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfc2l6ZV9ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1ZmZlcl9zaXplX2J5dGVzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfc2l6ZV9ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idWZmZXJfbW9kZSA9IChiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2NmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2NmZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLmJ1ZmZlcl91c2VkX2J5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVmZmVyX3VzZWRfYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3VzZWRfYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3dyYXBfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idWZmZXJfd3JhcF9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5idWZmZXJfd3JhcF9jb3VudCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfcmVjb3JkZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ldmVudHNfcmVjb3JkZWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuZXZlbnRzX3JlY29yZGVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLmV2ZW50c19kcm9wcGVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXZlbnRzX2Ryb3BwZWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuZXZlbnRzX2Ryb3BwZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMucmVhZGFibGVfYnl0ZXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZWFkYWJsZV9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9zdGF0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9TVEFUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9zdGF0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9zdGF0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2Zmc2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLm9mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9idWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMiB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9idWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGVidWcsIGluZGljYXRpb25zX2Ryb3BwZWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcikpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX3N0YXJ0X2FwaV9jYXB0dXJlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRlYnVnLCBzdGFydF9hcGlfY2FwdHVyZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZWJ1Zywgc3RhcnRfYXBpX2NhcHR1cmUsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGVidWdfb3Blcl9zdG9wX2FwaV9jYXB0dXJlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRlYnVnLCBzdG9wX2FwaV9jYXB0dXJlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRlYnVnLCBzdG9wX2FwaV9jYXB0dXJlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX29wZXJfcmVzZXRfYXBpX2NhcHR1cmVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHJlc2V0X2FwaV9jYXB0dXJlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRlYnVnLCByZXNldF9hcGlfY2FwdHVyZSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGRlYnVnLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGVidWcsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xpX291dHB1dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRlYnVnLCBjbGlfb3V0cHV0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRlYnVnLCBjbGlfb3V0cHV0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2FsbW9zdF9mdWxsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGZpbGVfYWxtb3N0X2Z1bGwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGZpbGVfYWxtb3N0X2Z1bGwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRlYnVnLCBjbGlfb3V0cHV0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGVidWcsIGZpbGVfYWxtb3N0X2Z1bGwpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGRlYnVnLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGVidWcsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xpX291dHB1dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRlYnVnLCBjbGlfb3V0cHV0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgY2xpX291dHB1dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2FsbW9zdF9mdWxsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGVidWcsIGZpbGVfYWxtb3N0X2Z1bGwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRlYnVnLCBmaWxlX2FsbW9zdF9mdWxsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfRklMRV9BTE1PU1RfRlVMTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtlZXBhbGl2ZV9pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX3RvbGVyYW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaXJtd2FyZV9zd192ZXJzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImhvc3Rfc3dfdmVyc2lvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hpcF9yZXZpc2lvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBjaGlwX3JldmlzaW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBjaGlwX3JldmlzaW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGRlYnVnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3NwZWVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgbm5pX3NwZWVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5kaWNhdGlvbl9zaGFwaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGlwX3RlbXBlcmF0dXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fODAyMV9hc190b2RfZm9ybWF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9zaGFwZXJfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbWJlZGRlZF9pbWFnZV9saXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoaXBfdm9sdGFnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdm9sdGFnZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl90b2Rfc3RyaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ4Z3Bvbl9udW1fb2Zfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZV9pcF9hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX3VkcF9wb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX3VkcF9wb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfdWFydF9iYXVkcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZGVidWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgbm5pX3NwZWVkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGRldmljZSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGRldmljZSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3lzdGVtX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N5c3RlbV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9JTlRFUlZBTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtlZXBhbGl2ZV90b2xlcmFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcuaG9zdF9kbWFfcnhfcXVldWVfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ob3N0X2RtYV90eF9xdWV1ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLmF2c19jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYXZzX2NvbnRyb2wgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLmF2c19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Zy51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcudXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJubmlfc3BlZWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3NwZWVkLmZpcnN0X2hhbGYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5maXJzdF9oYWxmID0gKGJjbW9sdF9ubmlfc3BlZWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJubmlfc3BlZWQuZmlyc3RfaGFsZiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zcGVlZC5zZWNvbmRfaGFsZiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNlY29uZF9oYWxmID0gKGJjbW9sdF9ubmlfc3BlZWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJubmlfc3BlZWQuc2Vjb25kX2hhbGYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfTk5JX1NQRUVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0X2lycSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXh0X2lycSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9TQU1QTEVfREVMQVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiaW5kaWNhdGlvbl9zaGFwaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5kaWNhdGlvbl9zaGFwaW5nLmVuYWJsZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lbmFibGVkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbmRpY2F0aW9uX3NoYXBpbmcuZW5hYmxlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGljYXRpb25fc2hhcGluZy5tYXhfcmF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yYXRlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5kaWNhdGlvbl9zaGFwaW5nLm1heF9yYXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5kaWNhdGlvbl9zaGFwaW5nLm1heF9idXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9idXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluZGljYXRpb25fc2hhcGluZy5tYXhfYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwaW9fcGluIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9HUElPX1BJTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzI1NiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuc3RyLCAyNTYsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fODAyMV9hc190b2RfZm9ybWF0LnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RyXzI1NiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fc2hhcGVyX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zaGFwZXJfbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc2hhcGVyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fU0hBUEVSX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZXBvbl90b2Rfc3RyaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0cl8yNTYgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fdG9kX3N0cmluZy5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDI1NiwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl90b2Rfc3RyaW5nLnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl8yNTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1RPRF9TVFJJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInhncG9uX251bV9vZl9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fbnVtX29mX29udXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX251bV9vZl9vbnVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX2lwX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGFwaWNsaV91bnVtYmVyX3RvX2lwdjQoY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXIpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZV91ZHBfcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfdWFydF9iYXVkcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3VhcnRfYmF1ZHJhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VhcnRfYmF1ZHJhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9TVFJJTkdfTEVOR1RILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3lzdGVtX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N5c3RlbV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHN5c3RlbV9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgc3lzdGVtX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZWVwYWxpdmVfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZWVwYWxpdmVfdG9sZXJhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtlZXBhbGl2ZV90b2xlcmFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubWFqb3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYWpvciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5maXJtd2FyZV9zd192ZXJzaW9uLm1ham9yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubWlub3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5vciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5maXJtd2FyZV9zd192ZXJzaW9uLm1pbm9yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ucmV2aXNpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXZpc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5maXJtd2FyZV9zd192ZXJzaW9uLnJldmlzaW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubW9kZWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5maXJtd2FyZV9zd192ZXJzaW9uLm1vZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24uYnVpbGRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLmJ1aWxkX3RpbWUsIDMyLCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5idWlsZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBmaXJtd2FyZV9zd192ZXJzaW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9GSVJNV0FSRV9TV19WRVJTSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBmaXJtd2FyZV9zd192ZXJzaW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlybXdhcmVfc3dfdmVyc2lvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5tYWpvciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1ham9yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5tYWpvciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24ubWlub3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5vciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24ubWlub3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLnJldmlzaW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV2aXNpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLnJldmlzaW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5tb2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5tb2RlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24uYnVpbGRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLmJ1aWxkX3RpbWUsIDMyLCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLmJ1aWxkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImhvc3Rfc3dfdmVyc2lvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hpcF9yZXZpc2lvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF9yZXZpc2lvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfcmV2aXNpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9SRVZJU0lPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoaXBfcmV2aXNpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBjaGlwX3JldmlzaW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2Vfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RldmljZV9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBzdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHN0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaG9zdF9kbWFfcnhfcXVldWVfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ob3N0X2RtYV90eF9xdWV1ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcuYXZzX2NvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdnNfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLmF2c19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLnVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRlYnVnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5ubmlfc3BlZWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9zcGVlZC5maXJzdF9oYWxmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZmlyc3RfaGFsZiA9IChiY21vbHRfbm5pX3NwZWVkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9zcGVlZC5maXJzdF9oYWxmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9zcGVlZC5zZWNvbmRfaGFsZiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNlY29uZF9oYWxmID0gKGJjbW9sdF9ubmlfc3BlZWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubm5pX3NwZWVkLnNlY29uZF9oYWxmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX25uaV9zcGVlZCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgbm5pX3NwZWVkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3NwZWVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBubmlfc3BlZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBubmlfc3BlZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0X2lycSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXh0X2lycSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5pbmRpY2F0aW9uX3NoYXBpbmcuZW5hYmxlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuYWJsZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5pbmRpY2F0aW9uX3NoYXBpbmcuZW5hYmxlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X3JhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfcmF0ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaW5kaWNhdGlvbl9zaGFwaW5nLm1heF9idXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9idXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X2J1cnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBpbmRpY2F0aW9uX3NoYXBpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfSU5ESUNBVElPTl9TSEFQSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBpbmRpY2F0aW9uX3NoYXBpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoaXBfdGVtcGVyYXR1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hpcF90ZW1wZXJhdHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ncG9uX3hncG9uX3RvZF9lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfRU5BQkxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwaW9fcGluIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9HUElPX1BJTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2dwaW9fcGluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3Bpbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fODAyMV9hc190b2RfZm9ybWF0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0cl8yNTYgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdC5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDI1NiwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fODAyMV9hc190b2RfZm9ybWF0LnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RyXzI1NiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fODAyMV9hc190b2RfZm9ybWF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9zaGFwZXJfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NoYXBlcl9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zaGFwZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fc2hhcGVyX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmltYWdlX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5pbWFnZV90eXBlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5pbWFnZV90eXBlID0gKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmltYWdlX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5pbWFnZV9zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5pbWFnZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuY3JjMzIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5jcmMzMiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uY3JjMzIgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5zdGF0dXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5zdGF0dXMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLnN0YXR1cyA9IChiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuaW1hZ2VfbmFtZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmltYWdlX25hbWUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKHZhbC52YWxbaTBdLmltYWdlX25hbWUsIDY0LCAiJXMiLCBjbGlfcGFybS0+dmFsdWVzW2kwXS5zdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbWJlZGRlZF9pbWFnZV9saXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlbWJlZGRlZF9pbWFnZV9saXN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNoaXBfdm9sdGFnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdm9sdGFnZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdm9sdGFnZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGlwX3ZvbHRhZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfdm9sdGFnZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfdm9sdGFnZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lcG9uX3RvZF9zdHJpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzI1NiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fdG9kX3N0cmluZy5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDI1NiwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fdG9kX3N0cmluZy5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdHJfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX3RvZF9zdHJpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX3RvZF9zdHJpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnhncG9uX251bV9vZl9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fbnVtX29mX29udXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX251bV9vZl9vbnVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAieGdwb25fbnVtX29mX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZXZpY2VfaXBfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gYXBpY2xpX3VudW1iZXJfdG9faXB2NChjbGlfcGFybS0+dmFsdWUudW51bWJlcik7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX2lwX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZXZpY2VfdWRwX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX3VkcF9wb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50b2RfdWFydF9iYXVkcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3VhcnRfYmF1ZHJhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VhcnRfYmF1ZHJhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfdWFydF9iYXVkcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBzeXN0ZW1fbW9kZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBmaXJtd2FyZV9zd192ZXJzaW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIHN0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBkZWJ1ZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgbm5pX3NwZWVkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBlbWJlZGRlZF9pbWFnZV9saXN0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfY29ubmVjdF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdCBvcGVyOyAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9jb25uZWN0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGNvbm5lY3QsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBjb25uZWN0LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9vcGVyX2Rpc2Nvbm5lY3Rfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Qgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBkaXNjb25uZWN0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgZGlzY29ubmVjdCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9yZXNldF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9yZXNldCBvcGVyOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX3Jlc2V0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIHJlc2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgcmVzZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCByZXNldCwgbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgcmVzZXQsIG1vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVCwgQkNNT0xUX0RFVklDRV9SRVNFVF9JRF9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfaG9zdF9rZWVwX2FsaXZlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcXVlbmNlX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBzZXF1ZW5jZV9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGhvc3Rfa2VlcF9hbGl2ZSwgc2VxdWVuY2VfbnVtYmVyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSE9TVF9LRUVQX0FMSVZFLCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0aW1lX3N0YW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIHRpbWVfc3RhbXAsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGhvc3Rfa2VlcF9hbGl2ZSwgdGltZV9zdGFtcCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0hPU1RfS0VFUF9BTElWRSwgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9vcGVyX3N3X3VwZ3JhZGVfYWN0aXZhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgc3dfdXBncmFkZV9hY3RpdmF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIHN3X3VwZ3JhZGVfYWN0aXZhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImltYWdlX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV90eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQsIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImltYWdlX3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9zaXplLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2Vfc2l6ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJULCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1NJWkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcmMzMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGNyYzMyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgY3JjMzIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9TVEFSVCwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJpbWFnZV9uYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0cl82NCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW1hZ2VfbmFtZS5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDY0LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbWFnZV9uYW1lLnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfbmFtZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdHJfNjQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJULCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX25hbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9pbWFnZV90cmFuc2Zlcl9kYXRhX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJibG9ja19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGJsb2NrX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgYmxvY2tfbnVtYmVyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQSwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1vcmVfZGF0YSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIG1vcmVfZGF0YSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgbW9yZV9kYXRhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQSwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX01PUkVfREFUQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UxNl9oZXggdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGRhdGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MTZfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBLCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBkYXRhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfcnVuX2Rkcl90ZXN0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3Qgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgcnVuX2Rkcl90ZXN0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgcnVuX2Rkcl90ZXN0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNwdSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJ1bl9kZHJfdGVzdCwgY3B1LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIGNwdSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVCwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfQ1BVLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFzXzAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIHJhc18wLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIHJhc18wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNULCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhc18xIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgcnVuX2Rkcl90ZXN0LCByYXNfMSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgcnVuX2Rkcl90ZXN0LCByYXNfMSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVCwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2VfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfYXV0b19jZmcgYXV0b19jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGV2aWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2NvbXBsZXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2VzdGFibGlzaGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9lc3RhYmxpc2hlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29ubmVjdGlvbl9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRkcl90ZXN0X2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZHJfdGVzdF9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2Vfa2VlcF9hbGl2ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgZGV2aWNlX2tlZXBfYWxpdmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX3JlYWR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2VfcmVhZHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2VfcmVhZHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2Nvbm5lY3Rpb25fY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5kaWNhdGlvbnNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgaW5kaWNhdGlvbnNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGluZGljYXRpb25zX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN3X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBzd19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzd19leGNlcHRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2V4Y2VwdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2V4Y2VwdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2VzdGFibGlzaGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2ZhaWx1cmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGV2aWNlX3JlYWR5KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRldmljZSwgaW5kaWNhdGlvbnNfZHJvcHBlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXJyb3IpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2V4Y2VwdGlvbikpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGRldmljZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGRldmljZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25uZWN0aW9uX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2VzdGFibGlzaGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25uZWN0aW9uX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRkcl90ZXN0X2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZHJfdGVzdF9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZHJfdGVzdF9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRERSX1RFU1RfQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2Vfa2VlcF9hbGl2ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGV2aWNlX2tlZXBfYWxpdmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGV2aWNlX2tlZXBfYWxpdmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX3JlYWR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2VfcmVhZHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGV2aWNlX3JlYWR5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfUkVBRFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5kaWNhdGlvbnNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgaW5kaWNhdGlvbnNfZHJvcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbmRpY2F0aW9uc19kcm9wcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3dfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2Vycm9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2Vycm9yLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FUlJPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN3X2V4Y2VwdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2V4Y2VwdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS51bmtub3duX2xpbmtfdmlvbGF0aW9uLmxpbmtfcmF0ZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnVua25vd25fbGlua192aW9sYXRpb24ubGlua19yYXRlID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUudW5rbm93bl9saW5rX3Zpb2xhdGlvbi5saW5rX3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUudW5rbm93bl9saW5rX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC51bmtub3duX2xpbmtfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS51bmtub3duX2xpbmtfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS51bmtub3duX2xpbmtfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24gPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5tYXhfbGlua192aW9sYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfbGlua192aW9sYXRpb24gPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5tYXhfbGlua192aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5sYXNlcl9vbl90aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29uX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5sYXNlcl9vZmZfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb2ZmX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUucmFuZ2VfdmlvbGF0aW9uLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUucmFuZ2VfdmlvbGF0aW9uLnJhbmdlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2VfdmlvbGF0aW9uLnJhbmdlID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24ucmFuZ2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUucmFuZ2VfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdlX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUucmFuZ2VfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUudGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9jaGFubmVsc19leGhhdXN0ZWQgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS50ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX2xsaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX2xsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX2xsaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUucm9ndWVfdmlvbGF0aW9uLmRlbmllZF9yYW5nZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfcmFuZ2UgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfcmFuZ2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUucm9ndWVfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJvZ3VlX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUucm9ndWVfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUudXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS51cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fZGVuaWVkX2xpbmssIGFsYXJtX3N0YXRlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fZGVuaWVkX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9kZW5pZWRfbGluaywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2VyX29uX29mZl92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBsYXNlcl9vbl9vZmZfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxhc2VyX29uX29mZl92aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9saW5rX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG1heF9saW5rX3Zpb2xhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBtYXhfbGlua192aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJhbmdlX3Zpb2xhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByYW5nZV92aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJvZ3VlX3Zpb2xhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByb2d1ZV92aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRkbV9jaGFubmVsc19leGhhdXN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHRkbV9jaGFubmVsc19leGhhdXN0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVua25vd25fbGlua192aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB1bmtub3duX2xpbmtfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVua25vd25fbGlua192aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxhc2VyX29uX29mZl92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbWF4X2xpbmtfdmlvbGF0aW9uKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByYW5nZV92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByb2d1ZV92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVua25vd25fbGlua192aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxhc2VyX29uX29mZl92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxhc2VyX29uX29mZl92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbGlua192aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBtYXhfbGlua192aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG1heF9saW5rX3Zpb2xhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9NQVhfTElOS19WSU9MQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJhbmdlX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcmFuZ2VfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJvZ3VlX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcm9ndWVfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5rbm93bl9saW5rX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVua25vd25fbGlua192aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVua25vd25fbGlua192aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3JhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGxpbmtfcmF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGVfZmxhZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHN0YXRlX2ZsYWdzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGxsaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGxsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2VyX29uX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJfb2ZmX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGxhc2VyX29mZl90aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5nZV92YWx1ZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGRpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBkaXN0YW5jZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0dW5uZWxfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgdHVubmVsX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2xhc2VyX292ZXJoZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidWJkX2luZm8iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgdWJkX2luZm8pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHViZF9pbmZvKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlbmRpbmdfZ3JhbnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBwZW5kaW5nX2dyYW50cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGxpbmtfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGlua190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua19yYXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHN0YXRlX2ZsYWdzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxsaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBkaXN0YW5jZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgb251X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCB1YmRfaW5mbykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxpbmtfdHlwZSkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fbGluaywgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fbGluaywgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0dW5uZWxfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX3R1bm5lbF9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl90dW5uZWxfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdHVubmVsX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdHVubmVsX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm1pbl9sYXNlcl9vdmVyaGVhZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9sYXNlcl9vdmVyaGVhZC5sYXNlcl9vbl90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzZXJfb25fdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1pbl9sYXNlcl9vdmVyaGVhZC5sYXNlcl9vbl90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29mZl90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtaW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb2ZmX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2NvbmZpZy5vYW1fdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9hbV90eXBlID0gKGJjbW9sdF9lcG9uX29hbV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlX2NvbmZpZy5vYW1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb25maWcucGVyaW9kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGVyaW9kID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlX2NvbmZpZy5wZXJpb2QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29uZmlnLmRpcmVjdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRpcmVjdGlvbiA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZV9jb25maWcuZGlyZWN0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSAoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0ID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmN0ci5rZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIG11c3QgaGF2ZSA4IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLnNjaSwgOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXBzdHJlYW1fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9rZXlfY2hvaWNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXBzdHJlYW1fa2V5X2Nob2ljZSA9IChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0ID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmN0ci5rZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIG11c3QgaGF2ZSA4IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmN0ci5zY2ksIDgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmZWNfZW5hYmxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19lbmFibGUudXBzdHJlYW0iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbSA9IChiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZlY19lbmFibGUudXBzdHJlYW0gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfZW5hYmxlLmRvd25zdHJlYW0iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtID0gKGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmVjX2VuYWJsZS5kb3duc3RyZWFtIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9GRUNfRU5BQkxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNlbmRfcGVyaW9kID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib2FtX2hlYXJ0YmVhdF9jb25maWcuc2VuZF9wZXJpb2QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy50cmFuc21pdF9mcmFtZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyYW5zbWl0X2ZyYW1lLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgdmFsLnRyYW5zbWl0X2ZyYW1lLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLnRyYW5zbWl0X2ZyYW1lLmxlbik7CisgICAgICAgICAgICBpZiAodmFsLnRyYW5zbWl0X2ZyYW1lLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnRyYW5zbWl0X2ZyYW1lLnZhbCwgdmFsLnRyYW5zbWl0X2ZyYW1lLmxlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib2FtX2hlYXJ0YmVhdF9jb25maWcudHJhbnNtaXRfZnJhbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICAgICAgaWYgKHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMudmFsLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy5sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICAgICAgaWYgKHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy5sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5yZWNlaXZlX3RpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZWNlaXZlX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5yZWNlaXZlX3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heGltdW1fcmVjZWl2ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib2FtX2hlYXJ0YmVhdF9jb25maWcubWF4aW11bV9yZWNlaXZlX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgucG9sbGluZ19pbnRlcnZhbF91cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbGxpbmdfaW50ZXJ2YWxfdXMgPSAoYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgucG9sbGluZ19pbnRlcnZhbF91cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X3NpemVfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50ZG1fZ3JhbnRfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5saW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxpbmtfcmF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxpbmtfcmF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxpbmtfcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxpbmtfcmF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN0YXRlX2ZsYWdzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHN0YXRlX2ZsYWdzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9mbGFncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBzdGF0ZV9mbGFncyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xsaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGxpZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsbGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGxpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MTElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYXNlcl9vbl90aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxhc2VyX29uX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYXNlcl9vbl90aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhc2VyX29mZl90aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxhc2VyX29mZl90aW1lX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYXNlcl9vZmZfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdlX3ZhbHVlX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5nZV92YWx1ZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWV0ZXJzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tZXRlcnMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZGlzdGFuY2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBkaXN0YW5jZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBkaXN0YW5jZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGRpc3RhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmtleV9leGNoYW5nZV9mYWlsdXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2V4Y2hhbmdlX2ZhaWx1cmUgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5rZXlfZXhjaGFuZ2VfZmFpbHVyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52YWxpZF9tcGNwX3JlcG9ydF9yZWNlaXZlZCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1wY3BfcmVwb3J0X3RpbWVvdXQgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5tcGNwX3JlcG9ydF90aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm9hbV9rZWVwYWxpdmVfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9hbV9rZWVwYWxpdmVfdGltZW91dCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm9hbV9rZWVwYWxpdmVfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50dW5uZWxfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX3R1bm5lbF9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl90dW5uZWxfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdHVubmVsX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdHVubmVsX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bm5lbF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgdHVubmVsX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgdHVubmVsX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5taW5fbGFzZXJfb3ZlcmhlYWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29uX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1pbl9sYXNlcl9vdmVyaGVhZC5sYXNlcl9vbl90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1pbl9sYXNlcl9vdmVyaGVhZC5sYXNlcl9vZmZfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc2VyX29mZl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1pbl9sYXNlcl9vdmVyaGVhZC5sYXNlcl9vZmZfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2xhc2VyX292ZXJoZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2FtX3R5cGUgPSAoYmNtb2x0X2Vwb25fb2FtX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIua2V5X2V4Y2hhbmdlX2NvbmZpZy5vYW1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLnBlcmlvZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBlcmlvZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLnBlcmlvZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLmRpcmVjdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRpcmVjdGlvbiA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLmRpcmVjdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93bnN0cmVhbV9tb2RlID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSAoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9rZXlfY2hvaWNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0ID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmN0ci5rZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIG11c3QgaGF2ZSA4IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLnNjaSwgOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXBzdHJlYW1fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9rZXlfY2hvaWNlID0gKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jZmIua2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgbXVzdCBoYXZlIDggYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLnNjaSwgOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRVBPTl9FTkNSWVBUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5mZWNfZW5hYmxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mZWNfZW5hYmxlLnVwc3RyZWFtIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXBzdHJlYW0gPSAoYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZmVjX2VuYWJsZS51cHN0cmVhbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mZWNfZW5hYmxlLmRvd25zdHJlYW0iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtID0gKGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZlY19lbmFibGUuZG93bnN0cmVhbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZmVjX2VuYWJsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZmVjX2VuYWJsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGZlY19lbmFibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBmZWNfZW5hYmxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcuc2VuZF9wZXJpb2QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZW5kX3BlcmlvZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy50cmFuc21pdF9mcmFtZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyYW5zbWl0X2ZyYW1lLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgdmFsLnRyYW5zbWl0X2ZyYW1lLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLnRyYW5zbWl0X2ZyYW1lLmxlbik7CisgICAgICAgICAgICBpZiAodmFsLnRyYW5zbWl0X2ZyYW1lLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnRyYW5zbWl0X2ZyYW1lLnZhbCwgdmFsLnRyYW5zbWl0X2ZyYW1lLmxlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICAgICAgaWYgKHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMudmFsLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy5sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlY2VpdmVfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5yZWNlaXZlX3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcubWF4aW11bV9yZWNlaXZlX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhpbXVtX3JlY2VpdmVfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGguIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sbGluZ19pbnRlcnZhbF91cyA9IChiY21vbHRfcG9sbGluZ19pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgucG9sbGluZ19pbnRlcnZhbF91cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X2ludGVydmFsX3VzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91YmRfaW5mbyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9wb2xsaW5nX2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0dWFsX3BvbGxpbmdfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX3BvbGxpbmdfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX21ic190cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX21ic190cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX3dlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX3dlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX21ic190cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX21ic190cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX3dlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX3dlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdWJkX2luZm8sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdWJkX2luZm8gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdWJkX2luZm8sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1YmRfaW5mbyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgdWJkX2luZm8pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCB1YmRfaW5mbyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNsb2NrX3RyYW5zcG9ydF9lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0VOQUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsb2NrX3RyYW5zcG9ydF9lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVuZGluZ19ncmFudHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZW5kaW5nX2dyYW50cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBwZW5kaW5nX2dyYW50cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxpbmtfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua190eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2xpbmtfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua190eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxpbmtfcmF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxsaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxhc2VyX29uX3RpbWVfdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxhc2VyX29mZl90aW1lX3RxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgZGlzdGFuY2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCB0dW5uZWxfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIG9udV9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGZlY19lbmFibGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGgpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHViZF9pbmZvKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBwZW5kaW5nX2dyYW50cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua190eXBlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdCBzdGF0OyAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZGF0YV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kYXRhX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2RhdGFfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2RhdGFfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vYW1fYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb2FtX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vYW1fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9tcGNwX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9icm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF91bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3VuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3VuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9tdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9tdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9yZXBvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfcmVwb3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mY3NfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZmNzX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vdmVyc2l6ZV9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X292ZXJzaXplX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X292ZXJzaXplX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ydW50X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfcnVudF9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9saW5lX2NvZGVfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yX21heCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZGF0YV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kYXRhX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2RhdGFfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2RhdGFfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9vYW1fYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9vYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfb2FtX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tcGNwX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X21wY3BfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X21wY3BfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9icm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF91bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X3VuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X3VuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9nYXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2dhdGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2dhdGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X29hbV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9tcGNwX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF91bmljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X211bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZmNzX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb3ZlcnNpemVfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yX21heCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2RhdGFfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9kYXRhX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfb2FtX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X21wY3BfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X3VuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2dhdGVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX2ZvcmNlX3JlZGlzY292ZXJ5X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5IG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3Zlcnkgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGZvcmNlX3JlZGlzY292ZXJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgZm9yY2VfcmVkaXNjb3ZlcnksIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfZGVsZXRlX2xpbmtfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmsgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBkZWxldGVfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGRlbGV0ZV9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VuZF9wZXJpb2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQsIHNlbmRfcGVyaW9kLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LCBzZW5kX3BlcmlvZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQsIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3Agb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfa2V5X2V4Y2hhbmdlX3N0YXJ0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVyaW9kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnQsIHBlcmlvZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0LCBwZXJpb2QsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJUX0lEX1BFUklPRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX2tleV9leGNoYW5nZV9zdG9wX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3Agb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0b3AsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfc3RhdGljX3JlZ2lzdHJhdGlvbl9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24gb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2Vyb25fdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGxhc2Vyb25fdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgbGFzZXJvbl90aW1lX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTiwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2Vyb2ZmX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsYXNlcm9mZl90aW1lX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsYXNlcm9mZl90aW1lX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTiwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST0ZGX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5nZV92YWx1ZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHJhbmdlX3ZhbHVlX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCByYW5nZV92YWx1ZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT04sIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9SQU5HRV9WQUxVRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlbmRpbmdfZ3JhbnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHBlbmRpbmdfZ3JhbnRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBwZW5kaW5nX2dyYW50cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT04sIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9QRU5ESU5HX0dSQU5UUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19wcm94eV9pbmplY3RfZnJhbWVfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lIHByb3h5OyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lIHByb3h5O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGVwb25fbGluaywgaW5qZWN0X2ZyYW1lLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmcmFtZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWUuZnJhbWVfb2N0ZXRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZnJhbWVfb2N0ZXRzLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgdmFsLmZyYW1lX29jdGV0cy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5mcmFtZV9vY3RldHMubGVuKTsKKyAgICAgICAgICAgIGlmICh2YWwuZnJhbWVfb2N0ZXRzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmZyYW1lX29jdGV0cy52YWwsIHZhbC5mcmFtZV9vY3RldHMubGVuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmcmFtZS5mcmFtZV9vY3RldHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGZyYW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX0lOSkVDVF9GUkFNRSwgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGZyYW1lLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZyBzdGF0X2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9saW5rX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2RhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2RhdGFfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2RhdGFfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3VuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3VuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3JlcG9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcmVwb3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZmNzX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb3ZlcnNpemVfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb3ZlcnNpemVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3J1bnRfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcnVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2RhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2RhdGFfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2RhdGFfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X3VuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X3VuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9HQVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9nYXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9nYXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCBzdGF0X2lkOyAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Zjc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yX21heCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2dhdGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2dhdGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9saW5rLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbGlua19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fZW5hYmxlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZW5jcnlwdGlvbl9lbmFibGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZW5jcnlwdGlvbl9lbmFibGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9zdG9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX2RlbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfZGVsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfZGVsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua19zcGVlZF9taXNtYXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfc3BlZWRfbWlzbWF0Y2gpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGVyZWdpc3RlcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX2RlcmVnaXN0ZXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NvdmVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGlzY292ZXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGlzY292ZXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZWdfYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVnX2Fja190aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZWdfYWNrX3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfcmVwb3J0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX3JlcG9ydF90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fa2VlcGFsaXZlX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV9jaGFuZ2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXJhbmdlX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJlcmFuZ2VfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJlcmFuZ2VfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZW5jcnlwdGlvbl9lbmFibGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBsaW5rX2RlbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfc3BlZWRfbWlzbWF0Y2gpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX2Rpc2NvdmVyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVnX2Fja190aW1lb3V0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX3JlcG9ydF90aW1lb3V0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVvdXQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV9jaGFuZ2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCByZXJhbmdlX2ZhaWx1cmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9yYWlzZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5jcnlwdGlvbl9lbmFibGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZW5jcnlwdGlvbl9lbmFibGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9zdG9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX2RlbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfZGVsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBsaW5rX2RlbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfREVMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfc3BlZWRfbWlzbWF0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfc3BlZWRfbWlzbWF0Y2gsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGVyZWdpc3RlcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX2RlcmVnaXN0ZXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX2RlcmVnaXN0ZXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ERVJFR0lTVEVSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NvdmVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGlzY292ZXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX2Rpc2NvdmVyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfRElTQ09WRVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfcmVnX2Fja190aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX3JlZ19hY2tfdGltZW91dCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX3JlZ19hY2tfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX3JlcG9ydF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX3JlcG9ydF90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fa2VlcGFsaXZlX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZW91dCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5nZV92YWx1ZV9jaGFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV9jaGFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXJhbmdlX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJlcmFuZ2VfZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCByZXJhbmdlX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmlfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVwb25fbmlfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX25pX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5pbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbWluaW11bV9maWJlcl9sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4aW11bV9maWJlcl9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdyYW50X3NwYWNpbmdfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFsbF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFsbF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5jcnlwdGlvbl9jZmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJvcGRvd25fd2VpZ2h0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGRyb3Bkb3duX3dlaWdodHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcHByb3hpbWF0ZV90ZG1fdXNhZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFwcHJveGltYXRlX3RkbV91c2FnZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFwcHJveGltYXRlX3RkbV91c2FnZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9fcmVwb3J0c19zb2FrX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBwb25fYWdncmVnYXRlX3NoYXBlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGVwb25fbmlfZW4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgbXR1XzFnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYWxhcm1fc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGFsbF9saW5rcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBwb25fYWdncmVnYXRlX3NoYXBlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fbmksIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBlcG9uX25pLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCByZWdpc3RyYXRpb25fYmVoYXZpb3IsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9SRUdJU1RSQVRJT05fQkVIQVZJT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdHVfMWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXR1XzFnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXR1XzEwZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbmltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWV0ZXJzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tZXRlcnMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhpbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21ldGVycyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbWV0ZXJzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3JhbnRfc3BhY2luZ190cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0gKGJjbW9sdF9tcGNwX2dhdGVfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnaXN0cmF0aW9uX2dhdGVfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVBDUF9HQVRFX01PREVfVEVLTk9WVVM6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ19hY2tfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnX2Fja190aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9DVVNUT006CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZmxhZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmZsYWdzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5mbGFncyA9IChiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncykgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5kZWxheV9iZWZvcmVfbXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmRlbGF5X2JlZm9yZV9tcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbjsgaTArKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbFtpMF0uZGVsYXlfYmVmb3JlX21zID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmdhdGVfc2l6ZV90cSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZ2F0ZV9zaXplX3RxIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5nYXRlX3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZXBvcnRpbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcG9ydGluZ19tb2RlID0gKGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVwb3J0aW5nX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLm1heF9saW5rcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9saW5rcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVBDUF9ESVNDT1ZFUllfUEVSSU9EX01TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVuY3J5cHRpb25fY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fY2ZnLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5jcnlwdGlvbl9jZmcuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX2NmZy51cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5jcnlwdGlvbl9jZmcudXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl90eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJvdGVjdGlvbl90eXBlID0gKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zID0gKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2Vfb3B0aW9ucyA9IChiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX29wdGlvbnMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9hdHRlbXB0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2VfYXR0ZW1wdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9hdHRlbXB0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnN5bmNfZ2F0ZV9kdXJhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN5bmNfZ2F0ZV9kdXJhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5zeW5jX2dhdGVfZHVyYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9faW5wdXQgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9faW5wdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dF9wb2xhcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9faW5wdXRfcG9sYXJpdHkgPSAoYmNtb2x0X2dwaW9fcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fb3V0cHV0ID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dF9wb2xhcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fb3V0cHV0X3BvbGFyaXR5ID0gKGJjbW9sdF9ncGlvX3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNsb2NrX3RyYW5zcG9ydF9jZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xvY2tfdHJhbnNwb3J0X2NmZy5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSA9IChiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsb2NrX3RyYW5zcG9ydF9jZmcuZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZHJvcGRvd25fd2VpZ2h0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyb3Bkb3duX3dlaWdodHMuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkxOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGRyb3Bkb3duX3dlaWdodHMuYXJyIG11c3QgaGF2ZSA3IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA3OyBpMSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkcm9wZG93bl93ZWlnaHRzLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGRyb3Bkb3duX3dlaWdodHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl83IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9EUk9QRE9XTl9XRUlHSFRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5vX3JlcG9ydHNfc29ha190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyLmJhbmR3aWR0aF9rYnBzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmFuZHdpZHRoX2ticHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fYWdncmVnYXRlX3NoYXBlci5iYW5kd2lkdGhfa2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyLm1ic19rQiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1ic19rQiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyLm1ic19rQiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9QT05fQUdHUkVHQVRFX1NIQVBFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLm9hbV9leHRlbnNpb25fdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9hbV9leHRlbnNpb25fdHlwZSA9IChiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMub2FtX2V4dGVuc2lvbl90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAodmFsLm9hbV9leHRlbnNpb25fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9CUk9BRENPTToKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5icm9hZGNvbS5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9DVEM6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUuY3RjLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0U6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUuZHBvZS5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5ibG9ja19zaXplIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLmJsb2NrX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5ibG9ja19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbWFjX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX25pX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVwb25fbmlfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9uaV9lbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTklfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZXBvbl9uaV9lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlcG9uX25pX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2JlaGF2aW9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCByZWdpc3RyYXRpb25fYmVoYXZpb3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2JlaGF2aW9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm10dV8xZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXR1XzFnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbXR1XzFnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXR1XzEwZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtdHVfMTBnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xMGcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5pbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21ldGVycyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbWV0ZXJzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluaW11bV9maWJlcl9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1heGltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWV0ZXJzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tZXRlcnMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFYSU1VTV9GSUJFUl9MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhpbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ3JhbnRfc3BhY2luZ190cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdyYW50X3NwYWNpbmdfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0gKGJjbW9sdF9tcGNwX2dhdGVfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnX2Fja190aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnX2Fja190aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9DVVNUT006CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5mbGFncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmZsYWdzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5mbGFncyA9IChiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncykgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZGVsYXlfYmVmb3JlX21zIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZGVsYXlfYmVmb3JlX21zIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5kZWxheV9iZWZvcmVfbXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmdhdGVfc2l6ZV90cSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmdhdGVfc2l6ZV90cSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbjsgaTArKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbFtpMF0uZ2F0ZV9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVwb3J0aW5nX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXBvcnRpbmdfbW9kZSA9IChiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZXBvcnRpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLm1heF9saW5rcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9saW5rcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLm1heF9saW5rcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9MT0dJQ0FMX0xJTktfT1BUSU9OUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5ub19yZXBvcnRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubm9fcmVwb3J0cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm5vX3JlcG9ydHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhbGFybV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkxOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmxlbjsgaTErKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMV0gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS5tYWM7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFsbF9saW5rcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhbGxfbGlua3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhbGxfbGlua3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYWxsX2xpbmtzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmNyeXB0aW9uX2NmZy5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmNyeXB0aW9uX2NmZy5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmNyeXB0aW9uX2NmZy51cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl90eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJvdGVjdGlvbl90eXBlID0gKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgPSAoYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX29wdGlvbnMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX29wdGlvbnMgPSAoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9hdHRlbXB0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2VfYXR0ZW1wdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfYXR0ZW1wdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5zeW5jX2dhdGVfZHVyYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zeW5jX2dhdGVfZHVyYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnN5bmNfZ2F0ZV9kdXJhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9faW5wdXQgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19pbnB1dF9wb2xhcml0eSA9IChiY21vbHRfZ3Bpb19wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19vdXRwdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncGlvX291dHB1dCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dF9wb2xhcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fb3V0cHV0X3BvbGFyaXR5ID0gKGJjbW9sdF9ncGlvX3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2xvY2tfdHJhbnNwb3J0X2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2xvY2tfdHJhbnNwb3J0X2NmZy5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSA9IChiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jbG9ja190cmFuc3BvcnRfY2ZnLmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xvY2tfdHJhbnNwb3J0X2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kcm9wZG93bl93ZWlnaHRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfNyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRyb3Bkb3duX3dlaWdodHMuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkyOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGZpbHRlci5kcm9wZG93bl93ZWlnaHRzLmFyciBtdXN0IGhhdmUgNyBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgNzsgaTIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kyXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTJdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRyb3Bkb3duX3dlaWdodHMuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJvcGRvd25fd2VpZ2h0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGRyb3Bkb3duX3dlaWdodHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX2JvdW5kc184IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkzOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGZpbHRlci5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UuYXJyIG11c3QgaGF2ZSA4IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UuYXJyLmJlc3RfY2FzZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIuYmVzdF9jYXNlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgODsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTNdLmJlc3RfY2FzZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTNdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UuYXJyLndvcnN0X2Nhc2UiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UuYXJyLndvcnN0X2Nhc2UgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCA4OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpM10ud29yc3RfY2FzZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTNdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl9ib3VuZHNfOCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3RkbV91c2FnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfVERNX1VTQUdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBwcm94aW1hdGVfdGRtX3VzYWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFwcHJveGltYXRlX3RkbV91c2FnZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5vX3JlcG9ydHNfc29ha190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJub19yZXBvcnRzX3NvYWtfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG5vX3JlcG9ydHNfc29ha190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBvbl9hZ2dyZWdhdGVfc2hhcGVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX2FnZ3JlZ2F0ZV9zaGFwZXIuYmFuZHdpZHRoX2ticHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iYW5kd2lkdGhfa2JwcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fYWdncmVnYXRlX3NoYXBlci5iYW5kd2lkdGhfa2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fYWdncmVnYXRlX3NoYXBlci5tYnNfa0IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYnNfa0IgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX2FnZ3JlZ2F0ZV9zaGFwZXIubWJzX2tCIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fYWdncmVnYXRlX3NoYXBlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfYm91bmRzXzggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTQ7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS5hcnIuYmVzdF9jYXNlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci5iZXN0X2Nhc2UgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCA4OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpNF0uYmVzdF9jYXNlID0gY2xpX3Bhcm0tPnZhbHVlc1tpNF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS5hcnIud29yc3RfY2FzZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS5hcnIud29yc3RfY2FzZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IDg7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2k0XS53b3JzdF9jYXNlID0gY2xpX3Bhcm0tPnZhbHVlc1tpNF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2JvdW5kc184IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5vYW1fZXh0ZW5zaW9uX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vYW1fZXh0ZW5zaW9uX3R5cGUgPSAoYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5vYW1fZXh0ZW5zaW9uX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2YWwub2FtX2V4dGVuc2lvbl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9SRVNFUlZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0JST0FEQ09NOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5icm9hZGNvbS5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQ1RDOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5jdGMucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kYXNhbi5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfS1Q6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EUE9FOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYmxvY2tfc2l6ZSIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUuZHBvZS5ibG9ja19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLmJsb2NrX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19USFJFU0hPTEQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGVwb25fbmlfZW4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCByZWdpc3RyYXRpb25fYmVoYXZpb3IpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtdHVfMWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtdHVfMTBnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgbWluaW11bV9maWJlcl9sZW5ndGgpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYWxhcm1fc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhbGxfbGlua3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBwb25fYWdncmVnYXRlX3NoYXBlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX3NldF9lcG9uX25pX2VuX3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmV3X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIG5ld19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHNldF9lcG9uX25pX2VuX3N0YXRlLCBuZXdfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFLCBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfaXNzdWVfcnNzaV9ncmFudF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudCBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncmFudGVkX2xpbmsiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIGdyYW50ZWRfbGluaywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIGdyYW50ZWRfbGluaywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVCwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTkssICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmlnZ2VyX3dpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgdHJpZ2dlcl93aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIHRyaWdnZXJfd2lkdGgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQsIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCB0cmlnZ2VyX2RlbGF5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgdHJpZ2dlcl9kZWxheSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVCwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX0RFTEFZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2FtcGxlX3BlcmlvZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIHNhbXBsZV9wZXJpb2QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCBzYW1wbGVfcGVyaW9kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9SU1NJX0dSQU5ULCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfYWRkX2xpbmtfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rIG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmsgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX2xpbmssIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX2xpbmssIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSywgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX3JhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywgcmF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9saW5rLCByYXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSywgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9hZGRfbXVsdGljYXN0X2xpbmtfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGluayBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGluayBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfbXVsdGljYXN0X2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbXVsdGljYXN0X2xpbmssIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTkssIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywgcmF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywgcmF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX01VTFRJQ0FTVF9MSU5LLCBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTkssIEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19pbmZvIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3b3JraW5nX2xpbmtfaW5mby5saW5rX3N0YXR1cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxpbmtfc3RhdHVzID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAid29ya2luZ19saW5rX2luZm8ubGlua19zdGF0dXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3b3JraW5nX2xpbmtfaW5mby5yYXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmF0ZSA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5yYXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ubGxpZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAid29ya2luZ19saW5rX2luZm8ubGxpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLm1wY3BfZGlzY292ZXJ5X2luZm8iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tcGNwX2Rpc2NvdmVyeV9pbmZvID0gKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAid29ya2luZ19saW5rX2luZm8ubXBjcF9kaXNjb3ZlcnlfaW5mbyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLm9udV9sYXNlcl9vbl90aW1lX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X2xhc2VyX29uX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5vbnVfbGFzZXJfb25fdGltZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLm9udV9sYXNlcl9vZmZfdGltZV90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9sYXNlcl9vZmZfdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLm9udV9sYXNlcl9vZmZfdGltZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLnBlbmRpbmdfZ3JhbnRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGVuZGluZ19ncmFudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5wZW5kaW5nX2dyYW50cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2VfdmFsdWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5yYW5nZV92YWx1ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLnR1bm5lbF9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR1bm5lbF9pZCA9IChiY21vbHRfZXBvbl90dW5uZWxfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLnR1bm5lbF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIHdvcmtpbmdfbGlua19pbmZvLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19pbmZvIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LLCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIHdvcmtpbmdfbGlua19pbmZvLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcmFuZ2VfZGVsdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLCByZXJhbmdlX2RlbHRhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwgcmVyYW5nZV9kZWx0YSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQSwgQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9SRVJBTkdFX0RFTFRBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX3JvZ3VlX2xsaWRfc2Nhbl9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2Nhbiwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiwgbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiwgbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOLCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xsaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGxpZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCByb2d1ZV9sbGlkX3NjYW4sIGxsaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCByb2d1ZV9sbGlkX3NjYW4sIGxsaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1JPR1VFX0xMSURfU0NBTiwgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaXN0X29mX29udV9pZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubWFjOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBsaXN0X29mX29udV9pZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwgbGlzdF9vZl9vbnVfaWRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxsaWRfcXVhcmFudGluZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBsbGlkX3F1YXJhbnRpbmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIGxsaWRfcXVhcmFudGluZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIG1wY3BfdGltZXN0YW1wX2NoYW5nZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5vX3JlcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBub19yZXBvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIG5vX3JlcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcmFuZ2VfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHJlcmFuZ2VfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByZXJhbmdlX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX3NjYW5fY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByb2d1ZV9zY2FuX2NvbXBsZXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHJvZ3VlX3NjYW5fY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbGxpZF9xdWFyYW50aW5lZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIG1wY3BfdGltZXN0YW1wX2NoYW5nZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBub19yZXBvcnRzKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByZXJhbmdlX2ZhaWx1cmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByb2d1ZV9zY2FuX2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxsaWRfcXVhcmFudGluZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBsbGlkX3F1YXJhbnRpbmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBsbGlkX3F1YXJhbnRpbmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0xMSURfUVVBUkFOVElORUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbXBjcF90aW1lc3RhbXBfY2hhbmdlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbXBjcF90aW1lc3RhbXBfY2hhbmdlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9fcmVwb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIG5vX3JlcG9ydHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIG5vX3JlcG9ydHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVyYW5nZV9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcmVyYW5nZV9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByZXJhbmdlX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfc2Nhbl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJvZ3VlX3NjYW5fY29tcGxldGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJvZ3VlX3NjYW5fY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUk9HVUVfU0NBTl9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fb251XzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvZGVfd29yZHNfdG90YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc190b3RhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc190b3RhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX3plcm9lc19jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfemVyb2VzX2NvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfemVyb2VzX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX29uZXNfY29ycmVjdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX29uZXNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19vbmVzX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfemVyb2VzX2NvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19vbmVzX2NvcnJlY3RlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubWFjOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfbGlua3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9vbnVfMTBnX3VzLCBhbGxfbGlua3MpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfREVDT0RFX0ZBSUxTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfemVyb2VzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfemVyb2VzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX29uZXNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfREVDT0RFX0ZBSUxTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfemVyb2VzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfemVyb2VzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX29uZXNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0IHN0YXQ7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdvb2RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBnb29kX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnb29kX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZ29vZF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcnN6X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgb3ZlcnN6X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5vbl9mZWNfZ29vZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJub25fZmVjX2dvb2RfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2dvb2RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19nb29kX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfZnJhbWVzX2V4Y19lcnJzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2ZyYW1lc19leGNfZXJycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2Jsa3Nfbm9fZXJycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX25vX2VycnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19ibGtzX2NvcnJfZXJycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfY29ycl9lcnJzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfY29ycl9lcnJzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfYmxrc191bmNvcnJfZXJycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfdW5jb3JyX2VycnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvcnJfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyX3plcm9lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfemVyb2VzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfemVyb2VzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29ycl9vbmVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfb25lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5kZXJzel9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIHVuZGVyc3pfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVycm9yc3pfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBlcnJvcnN6X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBvdmVyc3pfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19mcmFtZXNfZXhjX2VycnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX25vX2VycnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX2NvcnJfZXJycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfdW5jb3JyX2VycnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX29uZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIHVuZGVyc3pfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBlcnJvcnN6X2ZyYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fb251XzFnX3VzLCBhbGxfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fb251XzFnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fb251XzFnX3VzLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm1hYzsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fb251XzFnX3VzLCBhbGxfbGlua3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xZ191cywgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzFnX3VzLCBhbGxfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fb251XzFnX3VzLCBhbGxfbGlua3MpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBvdmVyc3pfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2ZyYW1lc19leGNfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX25vX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19ub19lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX1VOQ09SUl9FUlJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfdW5jb3JyX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfb25lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCB1bmRlcnN6X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIHVuZGVyc3pfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZXJyb3Jzel9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGdvb2RfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBvdmVyc3pfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgb3ZlcnN6X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfRlJBTUVTX0VYQ19FUlJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2ZyYW1lc19leGNfZXJycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19mcmFtZXNfZXhjX2VycnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19ub19lcnJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfY29ycl9lcnJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfY29ycl9lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX3VuY29ycl9lcnJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfdW5jb3JyX2VycnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfWkVST0VTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfemVyb2VzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfemVyb2VzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfb25lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX29uZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCB1bmRlcnN6X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRVJST1JTWl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBlcnJvcnN6X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmZWNfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX2RzLCBmZWNfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfZHMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXQgc3RhdDsgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NV8xMjcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTI4XzI1NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzI1Nl81MTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzUxMl8xMDIzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEwMjRfMTUxOCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzE1MTlfMjA0NyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yMDQ4XzQwOTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzQwOTZfOTIxNik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzkyMTdfMTYzODMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJicm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGJyb2FkY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGJyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZGF0YV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZGF0YV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBtdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBtdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCB1bmljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnYXRlX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBnYXRlX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZ2F0ZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG1wY3BfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBtcGNwX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGFib3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYWJvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMjhfMjU1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGJyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZGF0YV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBtdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG1wY3BfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGFib3J0X2ZyYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBnYXRlX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG1wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBnYXRlX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIG1wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3luY190aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3luY190aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgc3luY190aW1lX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfU1lOQ19USU1FX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgc3luY190aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19zdGF0dXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19zdGF0dXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0IHN0YXQ7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGJ5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBicm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBicm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGRhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIHVuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgbXBjcF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXBvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIHJlcG9ydF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIHJlcG9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFib3J0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBhYm9ydF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmNzX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZjc19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcmNfOF9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBjcmNfOF9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgY3JjXzhfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm91dF9vZl9zbG90Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvdXRfb2Zfc2xvdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcnNpemVfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG92ZXJzaXplX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJydW50X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIHJ1bnRfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIHJ1bnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBhYm9ydF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG92ZXJzaXplX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIHJ1bnRfZXJyb3IpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBjcmNfOF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHJlcG9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHJlcG9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZjc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBjcmNfOF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgY3JjXzhfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdXRfb2Zfc2xvdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHJ1bnRfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHJ1bnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBkZWZhdWx0X2ZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFtYW5fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0dXJib18yZ19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBwcmJzX2dlbmVyYXRvcikpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbWFuX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUkFNQU5fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1cmJvXzJnX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfVFVSQk9fMkdfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW1hbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW1hbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR1cmJvXzJnX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfVFVSQk9fMkdfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1cmJvXzJnX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCBwcmJzX2dlbmVyYXRvcikpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQgc3RhdDsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NV8xMjcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY1XzEyNyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEyOF8yNTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzI1Nl81MTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjU2XzUxMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzUxMl8xMDIzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc181MTJfMTAyMyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEwMjRfMTUxOCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzE1MTlfMjA0NyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xNTE5XzIwNDcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yMDQ4XzQwOTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzIwNDhfNDA5NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzQwOTZfOTIxNiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzkyMTdfMTYzODMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfOTIxN18xNjM4Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGJyb2FkY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYnJvYWRjYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZGF0YV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIG11bHRpY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCB1bmljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCB1bmljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2F0ZV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBnYXRlX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBnYXRlX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGFib3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGJyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBhYm9ydF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgc3luY190aW1lX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgc3luY190aW1lX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgc3luY190aW1lX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgc3luY190aW1lX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgc3luY190aW1lX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgc3luY190aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0IHN0YXQ7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBicm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGRhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBtdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvYW1fYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvYW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcG9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCByZXBvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJlcG9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFib3J0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBhYm9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZjc19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmY3NfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNyY184X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgY3JjXzhfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgY3JjXzhfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm91dF9vZl9zbG90Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm92ZXJzaXplX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb3ZlcnNpemVfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb3ZlcnNpemVfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ1bnRfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBydW50X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGJ5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMjhfMjU1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNTEyXzEwMjMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTAyNF8xNTE4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNDA5Nl85MjE2KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBicm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZGF0YV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG1wY3BfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJlcG9ydF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBhYm9ydF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmY3NfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBjcmNfOF9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG91dF9vZl9zbG90KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb3ZlcnNpemVfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBydW50X2Vycm9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GQ1NfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHJlcG9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBjcmNfOF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBjcmNfOF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09VVF9PRl9TTE9UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG91dF9vZl9zbG90LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG91dF9vZl9zbG90LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcnVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3JwX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsaW5rX3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxpbmtfcmF0ZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSwgJmtleS5saW5rX3JhdGUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJhc2VfbGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgYmFzZV9sbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgYmFzZV9sbGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19lbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjX2dudF9sZW5fdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2dudF9sZW5fdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfcmVwb3J0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbGlua3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXRlX29mX3JlZnJhY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19lbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2dudF9sZW5fdHEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbikpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3JwX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua19yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubGlua19yYXRlID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGlua19yYXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5saW5rX3JhdGUgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUsICZrZXkubGlua19yYXRlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9ycCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9ycCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYXNlX2xsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xsaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGxpZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgYmFzZV9sbGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGJhc2VfbGxpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19lbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY19nbnRfbGVuX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTVBDUF9SRUdfUEVSX0RJU0NfV0lORE9XLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbGlua3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgucG9sbGluZ19pbnRlcnZhbF91cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbGxpbmdfaW50ZXJ2YWxfdXMgPSAoYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X3NpemVfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50ZG1fZ3JhbnRfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X2ludGVydmFsX3VzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfREVGQVVMVF9VUFNUUkVBTV9CQU5EV0lEVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGVfb2ZfcmVmcmFjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZG91YmxlIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLmQ7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3JwX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9ycF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9ycF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3JwX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua19yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubGlua19yYXRlID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGlua19yYXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5saW5rX3JhdGUgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUsICZrZXkubGlua19yYXRlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9ycCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9ycCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3JwX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsaW5rX3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxpbmtfcmF0ZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSwgJmtleS5saW5rX3JhdGUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9ycCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9ycCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmFzZV9sbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9sbGlkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2xsaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGJhc2VfbGxpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYXNlX2xsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBiYXNlX2xsaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgYmFzZV9sbGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXBjcF9kaXNjX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfZGlzY19lbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1wY3BfZGlzY19nbnRfbGVuX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjX2dudF9sZW5fdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1wY3BfcmVwb3J0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfcmVwb3J0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1csICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWF4X2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbGlua3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtYXhfbGlua3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgbWF4X2xpbmtzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sbGluZ19pbnRlcnZhbF91cyA9IChiY21vbHRfcG9sbGluZ19pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLmdyYW50X3RocmVzaG9sZF90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdyYW50X3RocmVzaG9sZF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9pbnRlcnZhbF91cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhdGVfb2ZfcmVmcmFjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZG91YmxlIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLmQ7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGVfb2ZfcmVmcmFjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCByYXRlX29mX3JlZnJhY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIGJhc2VfbGxpZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfZGlzY19lbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3JwLCBtYXhfbGlua3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbikpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bpb19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncGlvX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncGlvX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ3Bpb19pZCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdwaW9faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdwaW9faWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lELCAma2V5LmdwaW9faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpcmVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3BpbywgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3BpbywgZGlyZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3BpbywgdmFsdWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCB2YWx1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwaW8sIHZhbHVlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3BpbywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwaW8sIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncGlvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwaW9fY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bpb19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwaW9fY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5ncGlvX2lkID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3Bpb19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3Bpb19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsICZrZXkuZ3Bpb19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bpb19waW5fZGlyIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncGlvX3Bpbl9kaXIpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgZGlyZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncGlvX3ZhbHVlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncGlvX3ZhbHVlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgdmFsdWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncGlvX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bpb19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncGlvX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncGlvX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ3Bpb19pZCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdwaW9faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdwaW9faWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lELCAma2V5LmdwaW9faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bpb19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwaW9fY2ZnIGNmZzsgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncGlvX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ3Bpb19pZCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdwaW9faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdwaW9faWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lELCAma2V5LmdwaW9faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bpbywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bpbywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bpb19waW5fZGlyIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncGlvX3Bpbl9kaXIpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgZGlyZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwaW8sIGRpcmVjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bpb192YWx1ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bpb192YWx1ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwaW8sIHZhbHVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwaW8sIHZhbHVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwaW8sIHZhbHVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwaW8sIHZhbHVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncGlvLCBkaXJlY3Rpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncGlvLCB2YWx1ZSkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncGlvLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwaW8sIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9hbGxvYywgc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBzdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9hbGxvYywgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9hbGxvYywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9hbGxvYywgc2xhKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNsYS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX3J0X2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfbnJ0X2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfbnJ0X2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmd1YXJhbnRlZWRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ndWFyYW50ZWVkX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmd1YXJhbnRlZWRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEubWF4aW11bV9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heGltdW1fYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEubWF4aW11bV9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IChiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ydF9jb21wZW5zYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfY29tcGVuc2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfcnRfYXBfaW5kZXgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYXBfaW5kZXggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX3J0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ucnRfYXBfaW5kZXgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfbnJ0X2FwX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ucnRfYXBfaW5kZXggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuYWxsb2NfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFsbG9jX3R5cGUgPSAoYmNtb2x0X2FsbG9jX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuYWxsb2NfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS53ZWlnaHQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53ZWlnaHQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEud2VpZ2h0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLnByaW9yaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEucHJpb3JpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgc2xhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hbGxvY19zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYWxsb2Nfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBzdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBzdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zbGEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfcnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX25ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ucnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmd1YXJhbnRlZWRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ndWFyYW50ZWVkX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5ndWFyYW50ZWVkX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5tYXhpbXVtX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEubWF4aW11bV9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSAoYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9jb21wZW5zYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfY29tcGVuc2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ydF9jb21wZW5zYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX3J0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX25ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuYWxsb2NfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFsbG9jX3R5cGUgPSAoYmNtb2x0X2FsbG9jX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmFsbG9jX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLndlaWdodCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndlaWdodCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEud2VpZ2h0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5wcmlvcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBzbGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgc2xhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNvbGxlY3Rfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBzdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHNsYSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIG9udV9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdCBzdGF0OyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fYWxsb2MsIHJ4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX29wZXJfc2V0X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGUgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9hbGxvY19vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEUsIEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2Nfb3Blcl9nZXRfc3RhdHNfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cyBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHMgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fYWxsb2MsIGdldF9zdGF0cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2FsbG9jLCBnZXRfc3RhdHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtX29mX2N5Y2xlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fYWxsb2MsIGdldF9zdGF0cywgbnVtX29mX2N5Y2xlcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fYWxsb2MsIGdldF9zdGF0cywgbnVtX29mX2N5Y2xlcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTLCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2FsbG9jLCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25fYWxsb2MsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcgYXV0b19jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcgYXV0b19jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkZWJ1Z19mbG93X2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfZW50cnlfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBvbnVfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjb25maWd1cmF0aW9uLmRpcmVjdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24udHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGUgPSAoYmNtb2x0X2dlbV9wb3J0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjb25maWd1cmF0aW9uLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF9mbG93Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudW50YWdnZWRfZmxvdyA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX2Zsb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF92aWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51bnRhZ2dlZF92aWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX3ZpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfZW50cnlfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29uZmlndXJhdGlvbi5kaXJlY3Rpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kaXJlY3Rpb24gPSAoYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jb25maWd1cmF0aW9uLmRpcmVjdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb25maWd1cmF0aW9uLnR5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlID0gKGJjbW9sdF9nZW1fcG9ydF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24udHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdlbV9wb3J0X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWdfZmxvd19jb25maWcudW50YWdnZWRfZmxvdyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX2Zsb3cgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWdfZmxvd19jb25maWcudW50YWdnZWRfZmxvdyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF92aWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51bnRhZ2dlZF92aWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF92aWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkZWJ1Z19mbG93X2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWdfZmxvd19jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkZWJ1Z19mbG93X2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkZWJ1Z19mbG93X2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9lbnRyeV9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2VudHJ5X2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkZWJ1Z19mbG93X2NvbmZpZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9vcGVyX3NldF9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fZ2VtX3BvcnQsIHNldF9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBzdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyBzdGF0X2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0X2lkOyAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIml3Zl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX3RwaWRfcGVyX2Zsb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX3RwaWRfcGVyX2Zsb3cpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3BiaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF9wYml0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBkc190cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGRzX3RwaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb3VudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2YsIGl3Zl9tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF9wYml0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpd2ZfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2l3Zl9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9pd2ZfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0lXRl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInVzX3RwaWRfcGVyX2Zsb3cuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl8yX2hleCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfdHBpZF9wZXJfZmxvdy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgdXNfdHBpZF9wZXJfZmxvdy5hcnIgbXVzdCBoYXZlIDIgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDI7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVzX3RwaWRfcGVyX2Zsb3cuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX3RwaWRfcGVyX2Zsb3csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yX2hleCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX3RwaWRfcGVyX2Zsb3csIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19vdGFnX2RpcmVjdF90cGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfb3RhZ19kaXJlY3RfcGJpdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF9wYml0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF9wYml0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRzX3RwaWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl81X2hleCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZHNfdHBpZC5hcnIgbXVzdCBoYXZlIDUgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDU7IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMV0gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRzX3RwaWQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGRzX3RwaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl81X2hleCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGRzX3RwaWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2siKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taXNzX2ZhbGxiYWNrID0gKGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjaykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2sgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5kZWZhdWx0X2Zsb3dfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZWZhdWx0X2Zsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmFnaW5nX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYWdpbmdfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmxlYXJuaW5nX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sZWFybmluZ19tb2RlID0gKGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmxlYXJuaW5nX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYXV0b21hdGljX21hY19sZWFybmluZyA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbGVhcm5pbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2FnaW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYXV0b21hdGljX21hY19hZ2luZyA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfYWdpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX21vdmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfbWFjX21vdmUgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX21vdmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfc3RhdGljX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfc3RhdGljX21vZGUgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19zdGF0aWNfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24udW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLml3Zl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaXdmX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2l3Zl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGl3Zl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpd2ZfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBpd2ZfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgaXdmX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIudXNfdHBpZF9wZXJfZmxvdy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzJfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfdHBpZF9wZXJfZmxvdy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLnVzX3RwaWRfcGVyX2Zsb3cuYXJyIG11c3QgaGF2ZSAyIGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCAyOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXNfdHBpZF9wZXJfZmxvdy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzJfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX1RQSURfUEVSX0ZMT1csICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX3RwaWRfcGVyX2Zsb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19vdGFnX2RpcmVjdF90cGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19vdGFnX2RpcmVjdF9wYml0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19vdGFnX2RpcmVjdF9wYml0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZHNfdHBpZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfdHBpZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmRzX3RwaWQuYXJyIG11c3QgaGF2ZSA1IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA1OyBpMSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHNfdHBpZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgZHNfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgZHNfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2siKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taXNzX2ZhbGxiYWNrID0gKGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjaykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5taXNzX2ZhbGxiYWNrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlZmF1bHRfZmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWdpbmdfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmxlYXJuaW5nX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sZWFybmluZ19tb2RlID0gKGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5sZWFybmluZ19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbGVhcm5pbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbGVhcm5pbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19tYWNfYWdpbmcgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX21vdmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfbWFjX21vdmUgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19tb3ZlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19zdGF0aWNfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19zdGF0aWNfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19zdGF0aWNfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24ubGVhcm5fdW50YWdnZWRfZmxvd192aWRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGVhcm5fdW50YWdnZWRfZmxvd192aWRzID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWdfZmxvd19jb25maWd1cmF0aW9uLmxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24udW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24udW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYWNfdGFibGVfY291bnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb3VudCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09VTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfY291bnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9GT1JCSURERU5fVkxBTl9GTE9XX0dFTV9SQU5HRV9TVEFSVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGl3Zl9tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIHVzX3RwaWRfcGVyX2Zsb3cpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF9wYml0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGRzX3RwaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb3VudCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdCBzdGF0OyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9pd2YsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfaGl0X2V2ZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19oaXRfZXZlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19oaXRfZXZlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX21pc3NfZXZlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19taXNzX2V2ZW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZXdfbWFjX2Rpc2NvdmVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIG5ld19tYWNfZGlzY292ZXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIG5ld19tYWNfZGlzY292ZXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibW92ZV9ldmVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbW92ZV9ldmVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIG1vdmVfZXZlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfbWlzc19ldmVudCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2l3ZiwgbmV3X21hY19kaXNjb3ZlcmVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBtb3ZlX2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCkpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2Zfb3Blcl9mbHVzaF9tYWNfdGFibGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGNvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlLCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRSwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdmxhbl9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlLCB2aWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlLCB2aWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFLCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGZsb3dfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlLCBmbG93X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRSwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2Zfb3Blcl9zY2FuX21hY190YWJsZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25faXdmLCBzY2FuX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBzY2FuX21hY190YWJsZSwgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfU0NBTl9NQUNfVEFCTEUsIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25faXdmX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19taXNzX2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19NSVNTX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBtb3ZlX2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbW92ZV9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19oaXRfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19oaXRfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX01JU1NfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19taXNzX2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfbWlzc19ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfVE9fRElTQUJMRURfR0VNOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF90b19kaXNhYmxlZF9nZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbmV3X21hY19kaXNjb3ZlcmVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbmV3X21hY19kaXNjb3ZlcmVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbW92ZV9ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG1vdmVfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRFJPUF9EVUVfVE9fRklGT19GVUxMOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25faXdmLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmbG93X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5mbG93X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lELCAma2V5LmZsb3dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGJpdF9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQsICZrZXkuZmxvd19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYml0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfUEJJVF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmxvd19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQsICZrZXkuZmxvd19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ2VtX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX0dFTV9QT1JULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGJpdF9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBiaXRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbl9pZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQsICZrZXkudmxhbl9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hcHBpbmdfbWV0aG9kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ190YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbikpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW5faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnZsYW5faWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCwgJmtleS52bGFuX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ19tZXRob2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ19tZXRob2QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hcHBpbmdfdGFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RzX3ZsYW5fYWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kc192bGFuX2FjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbl9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lELCAma2V5LnZsYW5faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW5faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnZsYW5faWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCwgJmtleS52bGFuX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFwcGluZ19tZXRob2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ19tZXRob2QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hcHBpbmdfbWV0aG9kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFwcGluZ190YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX1RBRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hcHBpbmdfdGFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudmxhbl9hY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kc192bGFuX2FjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZHNfdmxhbl9hY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbiA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4sICZrZXkudmxhbik7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBnZW1fcG9ydF9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBnZW1fcG9ydF9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbiA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOLCAma2V5LnZsYW4pOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmxvd19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbiA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOLCAma2V5LnZsYW4pOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS52bGFuID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnZsYW4gPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTiwgJmtleS52bGFuKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Zsb3dfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RhdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5nZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBnZW1fcG9ydF9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgYXV0b19jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfYWdlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19hZ2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX21vdmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19tb3ZlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX21vdmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5ld19tYWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG5ld19tYWMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBuZXdfbWFjKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19hZ2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfZHJvcHBlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX21vdmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG5ld19tYWMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FnZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19hZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19hZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfZHJvcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfZHJvcHBlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0RST1BQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfbW92ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX21vdmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX21vdmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19NT1ZFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmV3X21hYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbmV3X21hYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBuZXdfbWFjLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9hY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fdGFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cGlkX2luZGV4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmxvd19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgZmxvd19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfRkxPV19JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfdmxhbl9hY3Rpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX3ZsYW5fYWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJ2bGFuX3RhZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF92bGFuX3RhZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl90YWcudmxhbl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW5fdGFnLnZsYW5faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX3RhZy5wYml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGJpdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW5fdGFnLnBiaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF92bGFuX3RhZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRwaWRfaW5kZXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmxvd19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgZmxvd19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfRkxPV19JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYWNfbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudmxhbl9hY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91c192bGFuX2FjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdXNfdmxhbl9hY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9hY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci52bGFuX3RhZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF92bGFuX3RhZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnZsYW5fdGFnLnZsYW5faWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudmxhbl90YWcudmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci52bGFuX3RhZy5wYml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGJpdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci52bGFuX3RhZy5wYml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdmxhbl90YWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fVEFHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX3RhZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHBpZF9pbmRleCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1RQSURfSU5ERVgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cGlkX2luZGV4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb25fc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXZhaWxhYmxlX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9hY3RpdmVfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3dpbmRvd19zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9sZXZlbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9sZXZlbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRzX2ZlY19tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBkcmlmdF9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2FsYXJtX3RocmVzaG9sZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmVyX21vbml0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGJlcl9tb25pdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYmVyX21vbml0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtX2Fja190aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRiYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRiYSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2JhbmR3aWR0aF9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX21jYXN0X2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRlYnVnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJpcDMyX2luZGljYXRpb25fY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBvbl9zdGF0dXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfc3RhdHVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwb25fZGlzdGFuY2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX2xldmVsKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBkc19mZWNfbW9kZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgYmVyX21vbml0b3IpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGtleV9leGNoYW5nZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBkYmEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2dlbmVyYXRvcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGFsbF9vbnVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBkZWJ1ZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGdwb25fbmksIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBncG9uX25pLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicG9uX2Rpc3RhbmNlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfbG9nX2Rpc3RhbmNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2giKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfZGlmZl9yZWFjaCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJFQVNTSUdORURfRVFVQUxJWkFUSU9OX0RFTEFZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb3dlcl9sZXZlbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsLnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX2xldmVsLnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbGV2ZWwubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX2xldmVsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTEVWRUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9sZXZlbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRzX2ZlY19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRzX2ZlY19tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZHJpZnRfY29udHJvbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRyaWZ0X2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kcmlmdF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX2ludGVydmFsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3NfYWxhcm1fdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9maSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvZmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9maSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2FtaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYW1pID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvYW1pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYmVyX21vbml0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19iZXJfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci5zZl90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZl90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci5zZF90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZF90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci5zZF90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYmVyX21vbml0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9hY2tfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BMT0FNX0FDS19USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9leGNoYW5nZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWN0aXZhdGlvbi5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic25fYWNxdWlzaXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24uaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24uY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbl9hY3F1aXNpdGlvbi5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IChiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZS5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wb3J0c19vbmx5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZW5jcnlwdGVkX3BvcnRzX29ubHkgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBrZXlfZXhjaGFuZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLnRpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19waW4gPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcuZ3Bpb19waW4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5vcHRpb25zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub3B0aW9ucyA9IChiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5vcHRpb25zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfNyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfNyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8xID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIgbXVzdCBoYXZlIDIgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDI7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkYmEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RiYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhLnNyX3JlcG9ydGluZ19ibG9ja19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkYmEuc3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmEuZGJhX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYmFfbW9kZSA9IChiY21vbHRfZGJhX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkYmEuZGJhX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkYmEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2RiYSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZGJhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbG93cG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWF3YXJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pYXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pdHJhbnNpbml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pdHhpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXR4aW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaXR4aW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXJ4b2ZmID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pcnhvZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lmxvd19wb3dlcl9jbG9iaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvd19wb3dlcl9jbG9iaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5tZWFzdXJlbWVudF90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLnNlY29uZF9yYW5naW5nX3dpbmRvdyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSAoYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsbG9jX3R5cGVfdG9fc2NhbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX1NQRUNJQUxfTUFQOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMucGxvX3NpemUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5wbG9fc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFsbG9jX2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfcG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5vbnVfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5vbnVfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5vbnVfaWQgPSAoYmNtb2x0X3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWNjZXNzX3NpemUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5hY2Nlc3Nfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRVhURU5ERURfR1VBUkRfVElNRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19jaGVja2VyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfYWxhcm1zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5vbnVfYWxhcm1zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5hY2tfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFja190aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5hY2tfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxva2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2JhbmR3aWR0aF9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fbmlfZGVidWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRlYnVnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfcmV0cnlfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub21jaV9mb3JtYXQgPSAoYmNtb2x0X29tY2lfZGV2aWNlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0aXZhdGVfY29tbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZWxheV9mb3JfY29tbWl0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QU19DX1dBSVRfQkVGT1JFX0RFQUNUSVZBVElPTl9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG9uX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX3N0YXR1cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXRlID0gKGJjbW9sdF9wb25fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX3N0YXR1cy5zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fc3RhdHVzLmxvc19zdGF0dXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3Nfc3RhdHVzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX3N0YXR1cy5sb3Nfc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwb25fc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvbl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGguY2JyX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGguY2JyX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgudG90YWxfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50b3RhbF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLnRvdGFsX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5uZXh0X29udV90b3RhbF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLm5leHRfb251X3RvdGFsX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdmFpbGFibGVfYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubnVtYmVyX29mX2FjdGl2ZV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfYWN0aXZlX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9ja19zdGF0ZSA9IChiY21vbHRfcHJic19sb2NrX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfY291bnRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wb25fZGlzdGFuY2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2Rpc3RhbmNlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfbG9nX2Rpc3RhbmNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS5tYXhfbG9nX2Rpc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9kaWZmX3JlYWNoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvbl9kaXN0YW5jZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwb25fZGlzdGFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3dpbmRvd19zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3dpbmRvd19zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbGV2ZWwuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbGV2ZWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX2xldmVsLnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb3dlcl9sZXZlbC5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9sZXZlbC5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX2xldmVsLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwb3dlcl9sZXZlbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwb3dlcl9sZXZlbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRzX2ZlY19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRzX2ZlY19tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19mZWNfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2ZlY19tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2ZlY19tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkcmlmdF9jb250cm9sLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfaW50ZXJ2YWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb3NfYWxhcm1fdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb3NfaW5pdGlhbF92YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXR1cyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9maSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9maSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9hbWkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2FtaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9hbWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNfYmVyX2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZl90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmVyX21vbml0b3Iuc2ZfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNkX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iZXJfbW9uaXRvci5zZF90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYmVyX21vbml0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGJlcl9tb25pdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGJlcl9tb25pdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGxvYW1fYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtX2Fja190aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X2FjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9leGNoYW5nZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FjdGl2YXRpb24ucGFzc3dvcmRfYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gKGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lbmNyeXB0ZWRfcG9ydHNfb25seSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBrZXlfZXhjaGFuZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGtleV9leGNoYW5nZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBrZXlfZXhjaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fcGluID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5vcHRpb25zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub3B0aW9ucyA9IChiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcub3B0aW9ucyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfNyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGJhLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kYmEgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kYmEuc3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kYmEuc3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGJhLmRiYV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGJhX21vZGUgPSAoYmNtb2x0X2RiYV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRiYS5kYmFfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRiYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGJhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkYmEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkYmEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZGJhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWxvd3Bvd2VyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWxvd3Bvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWxvd3Bvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWF3YXJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXRyYW5zaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLml0cmFuc2luaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXR4aW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLml0eGluaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHhpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXJ4b2ZmID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG93X3Bvd2VyX2Nsb2JpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5tZWFzdXJlbWVudF90eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnNlY29uZF9yYW5naW5nX3dpbmRvdyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsbG9jX3R5cGVfdG9fc2NhbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuID0gKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVA6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLnBsb19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFsbG9jX2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFsbG9jX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWxsb2NfaWQgPSAoYmNtb2x0X3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5vbnVfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5vbnVfaWQgPSAoYmNtb2x0X3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFjY2Vzc19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRVhURU5ERURfR1VBUkRfVElNRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5vbnVfYWxhcm1zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X2FsYXJtcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWNrX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5hY2tfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZmkgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxva2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsbF9vbnVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTI7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfb251cy5vbnVfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX29udXMub251X2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdmFsLmxlbjsgaTIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kyXS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kyXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX29udXMuc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX29udXMuc3RhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB2YWwubGVuOyBpMisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTJdLnN0YXRlID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZXNbaTJdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhbGxfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX29udXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGFsbF9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGFsbF9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkzOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5nZW1faWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5nZW1faWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB2YWwubGVuOyBpMysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTNdLmdlbV9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZXNbaTNdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfbWNhc3RfZ2VtX3BvcnRzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuc3RhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB2YWwubGVuOyBpMysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTNdLnN0YXRlID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kzXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbWNhc3RfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fbmlfZGVidWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfcmV0cnlfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbWNpX2Zvcm1hdCA9IChiY21vbHRfb21jaV9kZXZpY2VfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy53aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy53aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0aXZhdGVfY29tbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLmFjdGl2YXRlX2NvbW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGF5X2Zvcl9jb21taXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QU19DX1dBSVRfQkVGT1JFX0RFQUNUSVZBVElPTl9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJpcDMyX2luZGljYXRpb25fY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG9uX3N0YXR1cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfc3RhdHVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBkc19mZWNfbW9kZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmVyX21vbml0b3IpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBrZXlfZXhjaGFuZ2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGRiYSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX29udXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgZGVidWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3N0YXQgc3RhdDsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZXdvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGZlY19jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGZlY19jb2Rld29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwOF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXA4X2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgYmlwOF9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2dlbV9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZ2VtX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9nZW1faWRsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2lkbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2dlbV9jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2NvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZ2VtX2lsbGVnYWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9pbGxlZ2FsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9hbGxvY2F0aW9uc192YWxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19ub25faWRsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NwdSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9jcHUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2NwdSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfb21jaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9vbWNpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Ryb3BwZWRfdG9vX3Nob3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZHJvcHBlZF90b29fbG9uZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jcmNfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2NyY19lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2NyY19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2tleV9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfa2V5X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfa2V5X2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZnJhZ21lbnRzX2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9mcmFnbWVudHNfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9mcmFnbWVudHNfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYWNrZXRzX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2dlbSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9nZW0pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcGxvYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X3Bsb2Ftcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfcGxvYW1zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9nZW1fZnJhZ21lbnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbV9mcmFnbWVudHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbV9mcmFnbWVudHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2NwdSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2NwdSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfb21jaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9vbWNpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZHJvcHBlZF90cGlkX21pc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kcm9wcGVkX3ZpZF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCBmZWNfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgYmlwOF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9pbGxlZ2FsKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3B1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X29tY2kpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2NyY19lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfa2V5X2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9mcmFnbWVudHNfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9nZW0pICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfcGxvYW1zKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbV9mcmFnbWVudHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfY3B1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHR4X29tY2kpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9zZXRfcG9uX3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wb25fb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9QT05fU1RBVEUsIEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3Jlc2V0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9yZXNldCBvcGVyOyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3Jlc2V0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgcmVzZXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgcmVzZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwgY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwgY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSLCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSLCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBzZXJpYWxfbnVtYmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmcgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmcgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NldF9vbnVfc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGUgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzZXRfb251X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X29udV9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURSwgQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX3Byb3h5X2NwdV9wYWNrZXRzX3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHMgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wYWNrZXRfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcGFja2V0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FsY19jcmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgY2FsY19jcmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9saXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMF0gPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGdlbV9wb3J0X2xpc3QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9IHsgfTsKKyAgICAgICAgdmFsLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwubGVuKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52YWwsIHZhbC5sZW4pOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfcHJveHlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgcHJveHk7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0IHByb3h5O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9wcm94eV9zZW5kIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9uaSwgYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGxvYW0uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzEyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHBsb2FtLmFyciBtdXN0IGhhdmUgMTIgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDEyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwbG9hbS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzEyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHByb3h5Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndpbmRvd190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgd2luZG93X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCB3aW5kb3dfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9hbGxvY19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBhbGxvY19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGFsbG9jX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgc2Vjb25kX3Jhbmdpbmdfd2luZG93LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgc2Vjb25kX3Jhbmdpbmdfd2luZG93LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl90b2RfcmVxdWVzdF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3Qgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgdG9kX3JlcXVlc3QsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgdG9kX3JlcXVlc3QsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlLCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFLCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfbGlzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMF0gPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlLCBvbnVfbGlzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFLCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIG9udV9saXN0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3N0YXJ0X29udV91cGdyYWRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlzdF9vZl9vbnVfaWRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwgbGlzdF9vZl9vbnVfaWRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREUsIEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgc3RhcnRfb251X3VwZ3JhZGUsIGxpc3Rfb2Zfb251X2lkcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGJpcDhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGJpcDhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGJpcDhfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBiaXA4X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1faWxsZWdhbCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2NwdSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfY3B1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9rZXlfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9rZXlfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2dlbSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZ2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNX0ZSQUdNRU5UUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2NwdSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fbmlfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGJpcDhfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pbGxlZ2FsLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1faWxsZWdhbCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcmNfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcmNfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2tleV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2tleV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZnJhZ21lbnRzX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZnJhZ21lbnRzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZ2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW1fZnJhZ21lbnRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW1fZnJhZ21lbnRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX25pLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3B1X3BhY2tldHNfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgbG9zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGxvcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2NvdmVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfZGlzY292ZXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfZGlzY292ZXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG9kX3JlcXVlc3RfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBlbmFibGVfYWxsX29udXNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgbG9zKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNwdV9wYWNrZXRzX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGxvcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgbG9zLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kaXNjb3ZlcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV9kaXNjb3ZlcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG9kX3JlcXVlc3RfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgdG9kX3JlcXVlc3RfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb251X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIG9udV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgc2VyaWFsX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFzc3dvcmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19wYXNzd29yZF9sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfZmVjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIHVzX2ZlYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib21jaV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVzX2VuY3J5cHRpb25fa2V5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2FsbG9jcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX2FsbG9jcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3BzX3R5cGVfYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIG9udV9wc190eXBlX2MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgc2VyaWFsX251bWJlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIHVzX2ZlYykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgYWxsX2FsbG9jcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIG9udV9wc190eXBlX2MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGdwb25fb251LCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZ3Bvbl9vbnUsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBhc3N3b3JkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF8xMCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFzc3dvcmQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBwYXNzd29yZC5hcnIgbXVzdCBoYXZlIDEwIGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuYXJyLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFzc3dvcmQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91OF8xMCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcGFzc3dvcmRfbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfZmVjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCB1c19mZWMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9tY2lfcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTUNJX1BPUlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX2ludGVydmFsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImFlc19lbmNyeXB0aW9uX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hZXNfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZXNfZW5jcnlwdGlvbl9rZXkuYnl0ZXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5ieXRlcywgMTYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVzX2tleSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb3NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9hbWkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2FtaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9hbWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5kZ2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZ2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmRnaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnRpd2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50aXdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS50aXdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuZG93aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmRvd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5zdWZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3VmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuc3VmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuc2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuc2RpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zZGkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5kZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmRmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvYWkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2FpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb2FpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9raSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxva2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfcHNfdHlwZV9jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1BTX1RZUEVfQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJleHRlbmRlZF9ndWFyZF90aW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfb251X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb251X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBvbnVfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc2VyaWFsX251bWJlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3JfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3JfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgc2VyaWFsX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgc2VyaWFsX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wYXNzd29yZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfMTAgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wYXNzd29yZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5wYXNzd29yZC5hcnIgbXVzdCBoYXZlIDEwIGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuYXJyLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBhc3N3b3JkLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfMTAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUEFTU1dPUkQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcGFzc3dvcmQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYXNzd29yZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBwYXNzd29yZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgcGFzc3dvcmQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvX3Bhc3N3b3JkX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQVVUT19QQVNTV09SRF9MRUFSTklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcGFzc3dvcmRfbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVzX2ZlYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHVzX2ZlYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9VU19GRUMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19mZWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgdXNfZmVjKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCB1c19mZWMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbWNpX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib21jaV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb21jaV9wb3J0X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Jlcl9pbnRlcnZhbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYmVyX2ludGVydmFsKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hZXNfZW5jcnlwdGlvbl9rZXkuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYWVzX2tleSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5ieXRlcywgMTYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hZXNfZW5jcnlwdGlvbl9rZXkuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Flc19rZXkgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUVTX0VOQ1JZUFRJT05fS0VZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlc19lbmNyeXB0aW9uX2tleSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9maSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9hbWkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2FtaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvYW1pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRnaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRnaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRnaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZG93aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5kb3dpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnN1ZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdWZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc3VmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5zZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc2RpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc2RpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2FpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9haSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvYWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9raSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxva2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2tpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxhcm1fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgcmFuZ2luZ190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYWN0aXZhdGlvbl9yZWFzb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRpb25fcmVhc29uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLmdlbV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLmdlbV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uZ2VtX2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9nZW1fcG9ydHMuc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uc3RhdGUgPSAoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxsX2dlbV9wb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX2FsbG9jcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9hbGxvY3MuYWxsb2NfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX2FsbG9jcy5hbGxvY19pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5sZW47IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMV0uYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfYWxsb2NzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9hbGxvY3Muc3RhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwubGVuOyBpMSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTFdLnN0YXRlID0gKGJjbW9sdF9hbGxvY19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGxfYWxsb2NzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGxfYWxsb2NzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2FsbG9jcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfYWxsb2NzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfYWxsb2NzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3BzX3R5cGVfYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9udV9wc190eXBlX2MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9udV9wc190eXBlX2MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfcHNfdHlwZV9jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9udV9wc190eXBlX2MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9udV9wc190eXBlX2MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXh0ZW5kZWRfZ3VhcmRfdGltZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9udV9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHBhc3N3b3JkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgdXNfZmVjKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCByYW5naW5nX3RpbWUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgYWxsX2dlbV9wb3J0cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfYWxsb2NzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9udV9wc190eXBlX2MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdCBzdGF0OyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZXdvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3Jkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2J5dGVzX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19ieXRlc19jb3JyZWN0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHNfY29ycmVjdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwOF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJpcDhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJpcDhfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBiaXA4X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfY3JjX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9wbG9hbXNfY3JjX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfcGxvYW1zX2NyY19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX25vbl9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvc2l0aXZlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZWdhdGl2ZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgbmVnYXRpdmVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfb21jaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfb21jaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfcmVwb3J0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJlcl9yZXBvcnRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJlcl9yZXBvcnRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5yZWNlaXZlZF9idXJzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHVucmVjZWl2ZWRfYnVyc3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxjZGdfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBsY2RnX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZGlfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByZGlfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcmRpX2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCB0eF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgdHhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHR4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJpcDhfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9wbG9hbXNfY3JjX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcnhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgYmVyX3JlcG9ydGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCB1bnJlY2VpdmVkX2J1cnN0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBsY2RnX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcmRpX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcnhfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHR4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCB0eF9wYWNrZXRzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9vcGVyX3NldF9vbnVfc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfb251X29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURSwgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfb3Blcl9yc3NpX21lYXN1cmVtZW50X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnQsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfb3Blcl9jaGFuZ2VfcG93ZXJfbGV2ZWxfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWwgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9wb3dlcl9sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfb251X3Bvd2VyX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsLCBwb3dlcl9sZXZlbF9hY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsLCBwb3dlcl9sZXZlbF9hY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMLCBCQ01PTFRfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMX0lEX1BPV0VSX0xFVkVMX0FDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X3Byb3h5X2NwdV9wYWNrZXRzX3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHMgcHJveHk7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzIHByb3h5O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BhY2tldF90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wYWNrZXRfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGNfY3JjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF9zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF9zaXplLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF9zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9IHsgfTsKKyAgICAgICAgdmFsLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwubGVuKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52YWwsIHZhbC5sZW4pOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfcHJveHlfcGxvYW1fcGFja2V0X3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldCBwcm94eTsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9wcm94eV9zZW5kIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fb251LCBwbG9hbV9wYWNrZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBsb2FtLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF8xMiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW0uYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBwbG9hbS5hcnIgbXVzdCBoYXZlIDEyIGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuYXJyLCAxMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW0uYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBwbG9hbV9wYWNrZXQsIHBsb2FtLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91OF8xMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VULCBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBwbG9hbV9wYWNrZXQsIHBsb2FtLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19ieXRlc19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGJpcDhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wbG9hbXNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcG9zaXRpdmVfZHJpZnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmVyX3JlcG9ydGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmVyX3JlcG9ydGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHVucmVjZWl2ZWRfYnVyc3QsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0xDREdfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgbGNkZ19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBsY2RnX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByZGlfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19ieXRlc19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGJpcDhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wbG9hbXNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcG9zaXRpdmVfZHJpZnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmVyX3JlcG9ydGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmVyX3JlcG9ydGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHVucmVjZWl2ZWRfYnVyc3QsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0xDREdfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgbGNkZ19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBsY2RnX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByZGlfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25fb251LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX29udSwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBkZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRmaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGdpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRnaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGdpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkb3dpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRvd2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRvd2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVyciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBlcnIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVycik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW52YWxpZF9kYnJ1X3JlcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBpbnZhbGlkX2RicnVfcmVwb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBpbnZhbGlkX2RicnVfcmVwb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2FpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxvYWkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxvYWkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxva2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9raSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9raSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBtZW1pKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBtZW1pKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FsYXJtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWxhcm0pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2FibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kaXNhYmxlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wdGljYWxfcmVmbGVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvcHRpY2FsX3JlZmxlY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvc3NpYmxlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcHN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwc3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCByYW5naW5nX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJlaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmVpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNkaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZGkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNkaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2ZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNmaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3VmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdWZpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdWZpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0aXdpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHRpd2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHRpd2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRnaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBkb3dpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVycikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBpbnZhbGlkX2RicnVfcmVwb3J0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2FpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxva2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbWVtaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hbGFybSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG9zc2libGVfZHJpZnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcHN0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJlaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZGkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdWZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHRpd2kpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRmaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRmaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRnaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBkZ2ksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBkZ2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkb3dpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRvd2ksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBkb3dpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVyciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBlcnIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBlcnIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZhbGlkX2RicnVfcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBpbnZhbGlkX2RicnVfcmVwb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2FpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxvYWksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2FpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9BSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxva2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9raSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxva2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBtZW1pLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbWVtaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWxhcm0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWxhcm0sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2VuYWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3B0aWNhbF9yZWZsZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9zc2libGVfZHJpZnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG9zc2libGVfZHJpZnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBzdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BTVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCByZWksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCByZWksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZGkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2RpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2RpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2ZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNmaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNmaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdWZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHRpd2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9USVdJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCByeF9jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcHJlYW1ibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcHJlYW1ibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlbGltaXRlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBkZWxpbWl0ZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImd1YXJkX2JpdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBndWFyZF9iaXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb19yYW5naW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX3JhbmdpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX3JhbmdpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb19kYXRhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX2RhdGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX2RhdGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmVzeW5jX3BvbGFyaXR5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHBsb19yYW5naW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX2RhdGEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl90cnhfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX3RyeCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RyeF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYmNkci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyLnJlc3luY19jb250cm9sLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BvbGFyaXR5IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkVTWU5DX1BPTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yZXN5bmNfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb2xhcml0eSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmVzeW5jX3BvbGFyaXR5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9pbml0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2RlbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9yYW5naW5nX2FjY2VzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMubWVkX3ZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1lZF92YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMubWVkX3ZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9pbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfaW5pdCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9pbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19kZWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19kZWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9yYW5naW5nX2FjY2VzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWVkX3ZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMubWVkX3ZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJ4X2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvbmZpZ3VyYXRpb24ud2FpdF93aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndhaXRfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyeF9jb25maWd1cmF0aW9uLndhaXRfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jb25maWd1cmF0aW9uLnJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyeF9jb25maWd1cmF0aW9uLnJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlhfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByeF9jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzFfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8yX3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF9zdGF0ZV8yX3dpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X2FmdGVyX3Jlc3luY180Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF9hZnRlcl9yZXN5bmNfNCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfYWZ0ZXJfcmVzeW5jXzQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfZWRfc291cmNlID0gKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3QucmFuZ2luZ19lZF9zb3VyY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LmRlbGltaXRlcl9lZF9zb3VyY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZWxpbWl0ZXJfZWRfc291cmNlID0gKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QubWluaW11bV90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5pbXVtX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3QubWluaW11bV90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0Lm1heGltdW1fdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmVyZ3lfZGV0ZWN0Lm1heGltdW1fdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZWRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3QuZWRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QuZWRfcGF0dGVybl9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZWRfcGF0dGVybl9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmVyZ3lfZGV0ZWN0LndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5pbnZlcnNpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnNpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3QuaW52ZXJzaW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5ub19lZF90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ub19lZF90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmVyZ3lfZGV0ZWN0Lm5vX2VkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5lcmd5X2RldGVjdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SQU5HSU5HX1BBVFRFUk4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmVhbWJsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfcHJlYW1ibGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlLnR5cGVfMV9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8xX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmVhbWJsZS50eXBlXzFfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlLnR5cGVfMl9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8yX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmVhbWJsZS50eXBlXzJfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3ByZV9yYW5naW5nX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmVhbWJsZS50eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlLnR5cGVfM19wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmVhbWJsZS50eXBlXzNfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfcHJlYW1ibGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcHJlYW1ibGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVsaW1pdGVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlbGltaXRlci5wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGRlbGltaXRlci5wYXR0ZXJuIG11c3QgaGF2ZSAzIGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwucGF0dGVybiwgMyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVsaW1pdGVyLnBhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWxpbWl0ZXIuc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWxpbWl0ZXIuc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlbGltaXRlci53aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVsaW1pdGVyLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfZGVsaW1pdGVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBkZWxpbWl0ZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJndWFyZF9iaXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBndWFyZF9iaXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBndWFyZF9iaXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJkZXNfY29uZmlndXJhdGlvbi5yYW5naW5nX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5naW5nX21vZGUgPSAoYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5yYW5naW5nX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXVsdGlfZWRfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24ubXVsdGlfZWRfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5idXJzdF9lbmFibGVfZW5kX29mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLmVkX2ludmVydGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVkX2ludmVydGlvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uZWRfaW52ZXJ0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb25fc2lnbiA9IChiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3JlcGVydGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGVydGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pZGRsZV9yZXBlcnRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWluaW11bV9idXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfbm9fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX25vX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9yZXNldF8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmVzZXRfMyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX3Jlc2V0XzMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfUlNTSV9SRVNZTkNfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl90cnhfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX3RyeCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX3RyeCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90cnhfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJjZHIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9sYXJpdHkgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yZXN5bmNfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BvbGFyaXR5IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yZXN5bmNfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmVzeW5jX3BvbGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9pbml0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2RlbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19kZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLm1lZF92YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tZWRfdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9pbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfaW5pdCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19kZWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19kZWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMubWVkX3ZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1lZF92YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucnhfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2NvbmZpZ3VyYXRpb24ud2FpdF93aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndhaXRfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnhfY29uZmlndXJhdGlvbi53YWl0X3dpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yeF9jb25maWd1cmF0aW9uLnJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlhfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByeF9jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByeF9jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByeF9jb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzFfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X3N0YXRlXzFfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8yX3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF9zdGF0ZV8yX3dpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzJfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfYWZ0ZXJfcmVzeW5jXzQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X2FmdGVyX3Jlc3luY180ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfYWZ0ZXJfcmVzeW5jXzQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QucmFuZ2luZ19lZF9zb3VyY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5naW5nX2VkX3NvdXJjZSA9IChiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmRlbGltaXRlcl9lZF9zb3VyY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZWxpbWl0ZXJfZWRfc291cmNlID0gKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmRlbGltaXRlcl9lZF9zb3VyY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5taW5pbXVtX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbmltdW1fdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QubWluaW11bV90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5tYXhpbXVtX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heGltdW1fdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QubWF4aW11bV90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZWRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9wYXR0ZXJuX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC53aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3Qud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5pbnZlcnNpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnNpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmludmVyc2lvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0Lm5vX2VkX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5vX2VkX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0Lm5vX2VkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5lcmd5X2RldGVjdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5lcmd5X2RldGVjdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5lcmd5X2RldGVjdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfREFUQV9QQVRURVJOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4uc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByZWFtYmxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9wcmVhbWJsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfMV9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8xX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8xX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8yX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzJfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmVhbWJsZS50eXBlXzJfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmVhbWJsZS50eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmVhbWJsZS50eXBlXzNfcG9zdF9yYW5naW5nX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8zX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzNfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmVhbWJsZS50eXBlXzNfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfcHJlYW1ibGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcHJlYW1ibGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmVhbWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwcmVhbWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcHJlYW1ibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVsaW1pdGVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWxpbWl0ZXIucGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZGVsaW1pdGVyLnBhdHRlcm4gbXVzdCBoYXZlIDMgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5wYXR0ZXJuLCAzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVsaW1pdGVyLnBhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVsaW1pdGVyLnNpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlbGltaXRlci5zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlbGltaXRlci53aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlbGltaXRlci53aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBkZWxpbWl0ZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2RlbGltaXRlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZGVsaW1pdGVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVsaW1pdGVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGRlbGltaXRlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZGVsaW1pdGVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ3VhcmRfYml0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZ3VhcmRfYml0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZ3VhcmRfYml0cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImd1YXJkX2JpdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZ3VhcmRfYml0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZ3VhcmRfYml0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfbW9kZSA9IChiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5yYW5naW5nX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ubXVsdGlfZWRfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm11bHRpX2VkX21vZGUgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idXJzdF9lbmFibGVfZW5kX29mZnNldCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5idXJzdF9lbmFibGVfZW5kX29mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5lZF9pbnZlcnRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9pbnZlcnRpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5lZF9pbnZlcnRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJkZXNfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9fcmFuZ2luZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX3JhbmdpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHBsb19yYW5naW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb19yYW5naW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHBsb19yYW5naW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb19kYXRhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX2RhdGEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvX2RhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcGxvX2RhdGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHBsb19kYXRhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb25fc2lnbiA9IChiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcmVwZXJ0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXJ0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLm1pZGRsZV9yZXBlcnRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWluaW11bV9idXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbmltdW1fYnVyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfbm9fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9ub19lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfcmVzZXRfMyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX3Jlc2V0XzMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfcmVzZXRfMyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5lcmd5X2RldGVjdCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgcHJlYW1ibGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgZGVsaW1pdGVyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGd1YXJkX2JpdHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgcGxvX3JhbmdpbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgcGxvX2RhdGEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dfZW50cnksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2xvZ19sZXZlbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfbGV2ZWwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfbG9nX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2xldmVsX3ByaW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9wcmludCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbGV2ZWxfc2F2ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX3N0eWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3N0eWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbmFtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbmFtZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX25hbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9wcmludCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfdHlwZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfc3R5bGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX25hbWUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dfZW50cnksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbGV2ZWxfcHJpbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfbGV2ZWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ19sZXZlbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19sZXZlbF9zYXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX2xldmVsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfbGV2ZWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1NBVkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ190eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19zdHlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19zdHlsZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX3N0eWxlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfc3R5bGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfc3R5bGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1NUWUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dfZW50cnksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X2xvZ19sZXZlbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9sb2dfbGV2ZWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfbGV2ZWwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X2xvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9sb2dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb2dfbGV2ZWxfcHJpbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfbGV2ZWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ19sZXZlbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19sZXZlbF9wcmludCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubG9nX2xldmVsX3NhdmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfbGV2ZWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ19sZXZlbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19sZXZlbF9zYXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubG9nX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvZ19zdHlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19zdHlsZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX3N0eWxlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfc3R5bGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfc3R5bGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1NUWUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX3N0eWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfc3R5bGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfc3R5bGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubG9nX25hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzEwMCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvZ19uYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgMTAwLCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubG9nX25hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbmFtZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdHJfMTAwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19uYW1lLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX25hbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19uYW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX25hbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfbGV2ZWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX3R5cGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19sZXZlbF9wcmludCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ190eXBlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfc3R5bGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19uYW1lKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdCBzdGF0OyAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmxvZ19pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibG9nX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5sb2dfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTE9HX0lELCAma2V5LmxvZ19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibmFtZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmFtZS5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGtleS5uYW1lLnN0ciwgMTAwLCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lLnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm5hbWUgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSwgJmtleS5uYW1lKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbG9nX2VudHJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGxvZ19lbnRyeSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtc2dfY291bnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nX2VudHJ5LCBtc2dfY291bnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ19lbnRyeSwgbXNnX2NvdW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3N0X21zZ19jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbG9nX2VudHJ5LCBtc2dfY291bnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbG9nX2VudHJ5LCBsb3N0X21zZ19jb3VudCkpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nX2VudHJ5LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIG1zZ19jb3VudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBtc2dfY291bnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBsb3N0X21zZ19jb3VudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBsb3N0X21zZ19jb3VudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCBzdGF0X2lkOyAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmxvZ19pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibG9nX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5sb2dfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTE9HX0lELCAma2V5LmxvZ19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibmFtZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmFtZS5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGtleS5uYW1lLnN0ciwgMTAwLCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lLnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm5hbWUgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSwgJmtleS5uYW1lKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBtc2dfY291bnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgbXNnX2NvdW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgbG9zdF9tc2dfY291bnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgbG9zdF9tc2dfY291bnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dnZXJfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGJ1ZmZlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgYnVmZmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3cmFwX2Fyb3VuZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgd3JhcF9hcm91bmQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyX2FmdGVyX3JlYWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5hYmxlX2xvZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgbG9nX25hbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBsb2dfbmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGxvZ2dlciwgd3JhcF9hcm91bmQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dnZXIsIGxvZ19uYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dnZXJfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid3JhcF9hcm91bmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgd3JhcF9hcm91bmQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyX2FmdGVyX3JlYWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGNsZWFyX2FmdGVyX3JlYWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR0dFUl9DRkdfSURfQ0xFQVJfQUZURVJfUkVBRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZV9sb2ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgZW5hYmxlX2xvZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dnZXJfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dnZXJfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZpbGVfaWQgPSAoYmNtb2x0X2xvZ19maWxlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWxlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5maWxlX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQsICZrZXkuZmlsZV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5idWZmZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX2J1ZmZlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1ZmZlci5idWZmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuYnVmZiwgMjA0OCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1ZmZlci5idWZmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1ZmZlci5tc2dfdG9fcmVhZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1zZ190b19yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1ZmZlci5tc2dfdG9fcmVhZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19idWZmZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGJ1ZmZlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgYnVmZmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIud3JhcF9hcm91bmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgd3JhcF9hcm91bmQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndyYXBfYXJvdW5kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCB3cmFwX2Fyb3VuZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIHdyYXBfYXJvdW5kKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2xlYXJfYWZ0ZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXJfYWZ0ZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIGNsZWFyX2FmdGVyX3JlYWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmFibGVfbG9nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0csICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfbG9nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBlbmFibGVfbG9nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgZW5hYmxlX2xvZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sb2dfbmFtZXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzEwMDAgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb2dfbmFtZXMuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuc3RyLCAxMDAwLCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubG9nX25hbWVzLnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgbG9nX25hbWVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl8xMDAwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBsb2dfbmFtZXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIGxvZ19uYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIGxvZ19uYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nZ2VyLCBidWZmZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIHdyYXBfYXJvdW5kKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nZ2VyLCBlbmFibGVfbG9nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nZ2VyLCBsb2dfbmFtZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dnZXJfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0IHN0YXQ7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZpbGVfaWQgPSAoYmNtb2x0X2xvZ19maWxlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWxlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5maWxlX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQsICZrZXkuZmlsZV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGxvZ2dlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBsb2dnZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGluZXNfaW5fbG9nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ2dlciwgbGluZXNfaW5fbG9nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dnZXIsIGxpbmVzX2luX2xvZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGxvZ2dlciwgbGluZXNfaW5fbG9nKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dnZXIsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ2dlciwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9vcGVyX2NsZWFyX2xvZ19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2cgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZpbGVfaWQgPSAoYmNtb2x0X2xvZ19maWxlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWxlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5maWxlX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQsICZrZXkuZmlsZV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgbG9nZ2VyLCBjbGVhcl9sb2csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgbG9nZ2VyLCBjbGVhcl9sb2csIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9sb2dnZXJfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2xvZ2dlcl9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGxpbmVzX2luX2xvZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nZ2VyLCBsaW5lc19pbl9sb2csIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9sb2dnZXJfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9TVEFUX0lEX0xJTkVTX0lOX0xPRzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nZ2VyLCBsaW5lc19pbl9sb2csIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ2dlciwgbGluZXNfaW5fbG9nLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgbG9nZ2VyLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBsb2dnZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ2dlciwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBsb2dnZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ubmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZW1vdGVfbG9vcGJhY2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCByZW1vdGVfbG9vcGJhY2spO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmVfbG9vcGJhY2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjayk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjayk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbWFjX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG1hY19hZGRyZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9iYWNrdXBfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBubmlfYmFja3VwX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aXZlX25uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhY3RpdmVfbm5pKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhY3RpdmVfbm5pKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9zd2l0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgYXV0b3N3aXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgYXV0b3N3aXRjaCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIGZsb3dfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgZmxvd19jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIGxpbmVfbG9vcGJhY2spICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgbWFjX2FkZHJlc3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCBubmlfYmFja3VwX3N0YXR1cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCBhY3RpdmVfbm5pKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIGZsb3dfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlbW90ZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIHJlbW90ZV9sb29wYmFjaywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIHJlbW90ZV9sb29wYmFjaywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0ssICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5lX2xvb3BiYWNrIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjaywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGxpbmVfbG9vcGJhY2ssICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aXZlX25uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X25uaV9jb25uZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ubmlfY29ubmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYWN0aXZlX25uaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvc3dpdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGF1dG9zd2l0Y2gsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX0FVVE9TV0lUQ0gsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9jZmcgY2ZnOyAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlbW90ZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIHJlbW90ZV9sb29wYmFjaywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIHJlbW90ZV9sb29wYmFjaywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0ssICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZW1vdGVfbG9vcGJhY2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIHJlbW90ZV9sb29wYmFjayk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIHJlbW90ZV9sb29wYmFjayk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxpbmVfbG9vcGJhY2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjaywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGluZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbGluZV9sb29wYmFjayk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGxpbmVfbG9vcGJhY2spO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBtYWNfYWRkcmVzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG1hY19hZGRyZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm5uaV9zdGF0dXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbm5pX2xpbmtfc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3N0YXR1cy5saW5rX3N0YXR1cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxpbmtfc3RhdHVzID0gKGJjbW9sdF90cml2YWxlbnQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubm5pX3N0YXR1cy5saW5rX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ubmlfc3RhdHVzLnNpZ25hbF9kZXRlY3RlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNpZ25hbF9kZXRlY3RlZCA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9zdGF0dXMuc2lnbmFsX2RldGVjdGVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9zdGF0dXMucG1kX2xvY2tlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBtZF9sb2NrZWQgPSAoYmNtb2x0X3RyaXZhbGVudCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfc3RhdHVzLnBtZF9sb2NrZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2xpbmtfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBubmlfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X25uaV9saW5rX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLmxpbmtfc3RhdHVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGlua19zdGF0dXMgPSAoYmNtb2x0X3RyaXZhbGVudCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfYmFja3VwX3N0YXR1cy5saW5rX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ubmlfYmFja3VwX3N0YXR1cy5zaWduYWxfZGV0ZWN0ZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zaWduYWxfZGV0ZWN0ZWQgPSAoYmNtb2x0X3RyaXZhbGVudCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfYmFja3VwX3N0YXR1cy5zaWduYWxfZGV0ZWN0ZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX2JhY2t1cF9zdGF0dXMucG1kX2xvY2tlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBtZF9sb2NrZWQgPSAoYmNtb2x0X3RyaXZhbGVudCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfYmFja3VwX3N0YXR1cy5wbWRfbG9ja2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBubmlfYmFja3VwX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfbGlua19zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9OTklfQkFDS1VQX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX2JhY2t1cF9zdGF0dXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfYmFja3VwX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbm5pX2JhY2t1cF9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBubmlfYmFja3VwX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFjdGl2ZV9ubmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ubmlfY29ubmVjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbm5pX2Nvbm5lY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBhY3RpdmVfbm5pLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmVfbm5pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBhY3RpdmVfbm5pKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgYWN0aXZlX25uaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9zd2l0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYXV0b3N3aXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGF1dG9zd2l0Y2gsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9zd2l0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGF1dG9zd2l0Y2gpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBhdXRvc3dpdGNoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmxvd19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgZmxvd19jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgZmxvd19jb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgZmxvd19jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgZmxvd19jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIHJlbW90ZV9sb29wYmFjaykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgbGluZV9sb29wYmFjaykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgbWFjX2FkZHJlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pLCBhY3RpdmVfbm5pKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pLCBubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIGF1dG9zd2l0Y2gpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIGZsb3dfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3N0YXQgc3RhdDsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbm5pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIG5uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9nb29kX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2dvb2RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2dvb2RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF91bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9tdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9icm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mY3NfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZmNzX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mY3NfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jb250cm9sX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYXVzZV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wYXVzZV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfcGF1c2VfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZmNfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfcGZjX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wZmNfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF91bnN1cHBvcnRlZF9vcGNvZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF91bnN1cHBvcnRlZF9kYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3Vuc3VwcG9ydGVkX2RhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3Vuc3VwcG9ydGVkX2RhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9hbGlnbm1lbnRfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfYWxpZ25tZW50X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9sZW5ndGhfb3V0X29mX3JhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jb2RlX2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2NvZGVfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2NvZGVfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vdmVyc2l6ZWRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9vdmVyc2l6ZWRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9qYWJiZXJfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfamFiYmVyX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9qYWJiZXJfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9tdHVfY2hlY2tfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfbXR1X2NoZWNrX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wcm9taXNjdW91c19mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wcm9taXNjdW91c19mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF92bGFuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3ZsYW5fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3ZsYW5fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kb3VibGVfdmxhbl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF90cnVuY2F0ZWRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF91bmRlcnNpemVfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5kZXJzaXplX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFnbWVudGVkX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ydW50X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3J1bnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3J1bnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9nb29kX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2dvb2RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2dvb2RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF91bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3VuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3VuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9tdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9icm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wYXVzZV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9wYXVzZV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfcGF1c2VfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wZmNfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfcGZjX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9wZmNfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9qYWJiZXJfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfamFiYmVyX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9qYWJiZXJfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mY3NfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZmNzX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mY3NfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9jb250cm9sX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2NvbnRyb2xfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2NvbnRyb2xfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9vdmVyc2l6ZV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfb3ZlcnNpemVfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9mcmFnbWVudGVkX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYWdtZW50ZWRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYWdtZW50ZWRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9lcnJvcl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9lcnJvcl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZXJyb3JfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF92bGFuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3ZsYW5fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3ZsYW5fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kb3VibGVfdmxhbl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ydW50X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3J1bnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3J1bnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF91bmRlcnJ1bl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdW5kZXJydW5fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZ29vZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF91bmljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X211bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZmNzX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfcGF1c2VfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfcGZjX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3Vuc3VwcG9ydGVkX2RhKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfYWxpZ25tZW50X2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9jb2RlX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X292ZXJzaXplZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9qYWJiZXJfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfbXR1X2NoZWNrX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3ZsYW5fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3VuZGVyc2l6ZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFnbWVudGVkX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3J1bnRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzY1XzEyNykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xMjhfMjU1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTAyNF8xNTE4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNDA5Nl85MjE2KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2dvb2RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X3BhdXNlX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X3BmY19mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9qYWJiZXJfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZmNzX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2NvbnRyb2xfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfb3ZlcnNpemVfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9lcnJvcl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF92bGFuX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X3J1bnRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfdW5kZXJydW5fZnJhbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X25uaV9zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ubmlfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mY3NfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Zjc19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9jb250cm9sX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9jb250cm9sX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wYXVzZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGF1c2VfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wZmNfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BmY19mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Vuc3VwcG9ydGVkX2RhLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Vuc3VwcG9ydGVkX2RhLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2FsaWdubWVudF9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9MRU5HVEhfT1VUX09GX1JBTkdFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPREVfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvZGVfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvZGVfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9vdmVyc2l6ZWRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X292ZXJzaXplZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2phYmJlcl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfamFiYmVyX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbXR1X2NoZWNrX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wcm9taXNjdW91c19mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF92bGFuX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3RydW5jYXRlZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3VuZGVyc2l6ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5kZXJzaXplX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQUdNRU5URURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcnVudF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcnVudF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9nb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9nb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3VuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3VuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9wYXVzZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGF1c2VfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9wZmNfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BmY19mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9KQUJCRVJfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2phYmJlcl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfamFiYmVyX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZmNzX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mY3NfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfb3ZlcnNpemVfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X292ZXJzaXplX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYWdtZW50ZWRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYWdtZW50ZWRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRVJST1JfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Vycm9yX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9lcnJvcl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF92bGFuX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcnVudF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcnVudF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5kZXJydW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3VuZGVycnVuX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbm5pX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X25uaV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Zjc19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZmNzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BhdXNlX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wYXVzZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BmY19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGZjX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2FsaWdubWVudF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYWxpZ25tZW50X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0U6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29kZV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29kZV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X292ZXJzaXplZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfamFiYmVyX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9qYWJiZXJfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X210dV9jaGVja19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3RydW5jYXRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5kZXJzaXplX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ydW50X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ydW50X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BhdXNlX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9wYXVzZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BmY19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGZjX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfamFiYmVyX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9qYWJiZXJfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mY3NfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Zjc19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9jb250cm9sX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9jb250cm9sX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfb3ZlcnNpemVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZXJyb3JfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Vycm9yX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ydW50X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ydW50X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5kZXJydW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBubmksIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgbm5pLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbm5pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdHVzX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBubmksIHN0YXR1c19jaGFuZ2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIG5uaSwgc3RhdHVzX2NoYW5nZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdHVzX2NoYW5nZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIG5uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbm5pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXR1c19jaGFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0dXNfY2hhbmdlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0dXNfY2hhbmdlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVFVTX0NIQU5HRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmluc3RhbmNlID0gKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnN0YW5jZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF92Z2EiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3ZnYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3ZnYSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfcGYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xmcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2xmcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9sZnBmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcHJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcHJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tYWluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfbWFpbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0Mik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9hbXApOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9hbXApO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9wZikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcHJlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9hbXApKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmluc3RhbmNlID0gKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnN0YW5jZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF92Z2EiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF92Z2EsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9wZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9wZiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2xmcGYsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3ByZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tYWluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfbWFpbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfYW1wLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ubmlfc2VyZGVzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9zZXJkZXNfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc2VyZGVzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3NlcmRlc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmluc3RhbmNlID0gKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnN0YW5jZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaV9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaV9zZXJkZXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3ZnYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF92Z2EsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF92Z2EiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF92Z2EpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfdmdhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9wZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9wZiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9wZik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9wZik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2xmcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9sZnBmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2xmcGYsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2xmcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfbGZwZik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9kZmUzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU0LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlNCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9wcmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcHJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcHJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcHJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3ByZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X21haW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfbWFpbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9wb3N0MiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0Mik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0Mik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfYW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfYW1wLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2FtcCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X2FtcCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9hbXApO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3ZnYSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3BmKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfbGZwZikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmU1KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcHJlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfbWFpbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0MykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X2FtcCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZHgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZHggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkeCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWR4ID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgsICZrZXkuaWR4KTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVudHJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgZW50cnkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgZW50cnkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGVudHJ5KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3NvZnR3YXJlX2Vycm9yX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaWR4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaWR4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpZHggaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmlkeCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfSURYLCAma2V5LmlkeCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9zb2Z0d2FyZV9lcnJvcl9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZHgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZHggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkeCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWR4ID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgsICZrZXkuaWR4KTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaWR4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaWR4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpZHggaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmlkeCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfSURYLCAma2V5LmlkeCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1IsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVudHJ5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N3X2Vycm9yIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkuZmlyc3RfZXJyb3JfdGltZV91cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZpcnN0X2Vycm9yX3RpbWVfdXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbnRyeS5maXJzdF9lcnJvcl90aW1lX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVudHJ5Lmxhc3RfZXJyb3JfdGltZV91cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfZXJyb3JfdGltZV91cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5Lmxhc3RfZXJyb3JfdGltZV91cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbnRyeS5saW5lX251bWJlciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxpbmVfbnVtYmVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5LmxpbmVfbnVtYmVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVudHJ5LmVycm9yX2NvdW50ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5LmVycm9yX2NvdW50ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkuaW5zdGFuY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnN0YW5jZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbnRyeS5pbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbnRyeS5maWxlbmFtZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLmZpbGVuYW1lLCA2NCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5LmZpbGVuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVudHJ5LnRhc2tfbmFtZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnRhc2tfbmFtZSwgNjQsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbnRyeS50YXNrX25hbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgZW50cnksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3dfZXJyb3IgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgZW50cnksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbnRyeSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBzb2Z0d2FyZV9lcnJvciwgZW50cnkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBzb2Z0d2FyZV9lcnJvciwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBzb2Z0d2FyZV9lcnJvciwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fb3Blcl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdyBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgcG9uX25pLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgcG9uX25pLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJpZ2dlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgdHJpZ2dlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHRyaWdnZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3Ryb2JlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHN0cm9iZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHN0cm9iZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUUk9CRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndpbmRvd19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHdpbmRvd19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgd2luZG93X21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfcG9zaXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHRyaWdnZXJfcG9zaXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCB0cmlnZ2VyX3Bvc2l0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUl9QT1NJVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVE9QX0RVRV9UT19DT1JSVVBUX1NUUk9CRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXJ0X29mZnNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHN0YXJ0X29mZnNldCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHN0YXJ0X29mZnNldCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZmZzZXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBlbmRfb2Zmc2V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgZW5kX29mZnNldCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX0VORF9PRkZTRVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfY3ljbGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBudW1iZXJfb2ZfY3ljbGVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgbnVtYmVyX29mX2N5Y2xlcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX05VTUJFUl9PRl9DWUNMRVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fb3Blcl9zdG9wX2NhcHR1cmVfd2luZG93X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3cgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3cgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RvcF9jYXB0dXJlX3dpbmRvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0b3BfY2FwdHVyZV93aW5kb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0b3BfY2FwdHVyZV93aW5kb3csIHBvbl9uaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RvcF9jYXB0dXJlX3dpbmRvdywgcG9uX25pLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIHNsYSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2xhLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfcnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX3J0X2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ucnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfbnJ0X2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ucnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuZ3VhcmFudGVlZF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmd1YXJhbnRlZWRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuZ3VhcmFudGVlZF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5tYXhpbXVtX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5tYXhpbXVtX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gKGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9jb21wZW5zYXRpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfY29tcGVuc2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfYXBfaW5kZXggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX25ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYXBfaW5kZXggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX25ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5hbGxvY190eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWxsb2NfdHlwZSA9IChiY21vbHRfYWxsb2NfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5hbGxvY190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLndlaWdodCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndlaWdodCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS53ZWlnaHQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEucHJpb3JpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYWxsb2Nfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2FsbG9jX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIHN0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc2xhLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX3J0X2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5jYnJfcnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ucnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfbnJ0X2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5ndWFyYW50ZWVkX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3VhcmFudGVlZF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuZ3VhcmFudGVlZF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEubWF4aW11bV9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heGltdW1fYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLm1heGltdW1fYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gKGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfcnRfY29tcGVuc2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2NvbXBlbnNhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5jYnJfcnRfY29tcGVuc2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfcnRfYXBfaW5kZXgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYXBfaW5kZXggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX25ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYXBfaW5kZXggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ucnRfYXBfaW5kZXggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmFsbG9jX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hbGxvY190eXBlID0gKGJjbW9sdF9hbGxvY190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5hbGxvY190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS53ZWlnaHQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53ZWlnaHQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLndlaWdodCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEucHJpb3JpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEucHJpb3JpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9hbGxvY19zbGEgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIHNsYSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzbGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIHNsYSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNvbGxlY3Rfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgc2xhKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIG9udV9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX29wZXJfZ2V0X3N0YXRzX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0cyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX2FsbG9jLCBnZXRfc3RhdHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fYWxsb2MsIGdldF9zdGF0cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1fb2ZfY3ljbGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fYWxsb2MsIGdldF9zdGF0cywgbnVtX29mX2N5Y2xlcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX2FsbG9jLCBnZXRfc3RhdHMsIG51bV9vZl9jeWNsZXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTLCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19vcGVyX3NldF9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZSBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2FsbG9jX29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBzdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEUsIEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgeGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fYWxsb2MsIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9hbGxvYywgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9hbGxvYywgcnhfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2FsbG9jLCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2FsbG9jLCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9hbGxvYywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgeGdwb25fYWxsb2MsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5jcnlwdGlvbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGVuY3J5cHRpb25fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uLmRpcmVjdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRpcmVjdGlvbiA9IChiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY29uZmlndXJhdGlvbi5kaXJlY3Rpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uLnR5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlID0gKGJjbW9sdF9nZW1fcG9ydF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY29uZmlndXJhdGlvbi50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGVuY3J5cHRpb25fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY29uZmlndXJhdGlvbi5kaXJlY3Rpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29uZmlndXJhdGlvbi50eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZSA9IChiY21vbHRfZ2VtX3BvcnRfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jb25maWd1cmF0aW9uLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdlbV9wb3J0X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGVuY3J5cHRpb25fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGVuY3J5cHRpb25fbW9kZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0IHN0YXQ7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9pd2YsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19vdGFnX2RpcmVjdF90cGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgZHNfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgZHNfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2l3ZiwgZHNfdHBpZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9pd2YsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19vdGFnX2RpcmVjdF90cGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkc190cGlkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RwaWQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGRzX3RwaWQuYXJyIG11c3QgaGF2ZSA1IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA1OyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkc190cGlkLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfRFNfVFBJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9pd2ZfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25faXdmX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25faXdmX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9pd2ZfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19vdGFnX2RpcmVjdF90cGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRzX3RwaWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl81X2hleCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRzX3RwaWQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGZpbHRlci5kc190cGlkLmFyciBtdXN0IGhhdmUgNSBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNTsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRzX3RwaWQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgZHNfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9pd2YsIGRzX3RwaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgZHNfdHBpZCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImh3X3Bvbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBod19wb25faWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF2YWlsYWJsZV9iYW5kd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9hY3RpdmVfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwb25fc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwb25fZGlzdGFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkcmlmdF9jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGtleV9leGNoYW5nZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBrZXlfZXhjaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYV9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtX2hhbmRsaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9kYXRhX2FsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9kYXRhX2dlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG11bHRpY2FzdF9rZXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2JhbmR3aWR0aF9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9tY2FzdF9nZW1fcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYV90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdHVuaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwb25fc3RhdHVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGJlcl9tb25pdG9yKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGtleV9leGNoYW5nZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGRiYV9tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19zdGF0dXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGFsbF9vbnVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGRlYnVnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgeGdwb25fbmksIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiaHdfcG9uX2lkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2h3X3Bvbl9pZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaHdfcG9uX2lkLnBvbl9pZF8xIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9uX2lkXzEgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJod19wb25faWQucG9uX2lkXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJod19wb25faWQucG9uX2lkXzIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb25faWRfMiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImh3X3Bvbl9pZC5wb25faWRfMiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBod19wb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfaHdfcG9uX2lkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBod19wb25faWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicG9uX2Rpc3RhbmNlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfbG9nX2Rpc3RhbmNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2giKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfZGlmZl9yZWFjaCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwb25fZGlzdGFuY2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2Rpc3RhbmNlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwb25fZGlzdGFuY2UsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcWRfY3ljbGVzX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkcmlmdF9jb250cm9sLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRyaWZ0X2xpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3NfYWxhcm1fdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3NfaW5pdGlhbF92YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXR1cyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9iaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9iaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb29jaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvb2NpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9wY2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9wY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJlcl9tb25pdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNfYmVyX2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmVyX21vbml0b3Iuc2ZfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmVyX21vbml0b3Iuc2ZfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmVyX21vbml0b3Iuc2RfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmVyX21vbml0b3Iuc2RfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2V4Y2hhbmdlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hY3RpdmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hY3RpdmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gKGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24uYnVyc3RfcHJvZmlsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X3Byb2ZpbGUgPSAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLmJ1cnN0X3Byb2ZpbGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2UuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2UuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wb3J0c19vbmx5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcuZ3Bpb19waW4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncGlvX3BpbiA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLmZhc3RfcmFuZ2luZyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZhc3RfcmFuZ2luZyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcuZmFzdF9yYW5naW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5kYXRhX21hcF9kZWxheV9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfbWFwX2RlbGF5X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuZGF0YV9tYXBfZGVsYXlfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfNyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfMiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaWxvd3Bvd2VyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWxvd3Bvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lmlhd2FyZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmlhd2FyZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXRyYW5zaW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaXRyYW5zaW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaXR4aW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLml0eGluaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lml0eGluaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50LmlyeG9mZiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmlyeG9mZiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3dfcG93ZXJfY2xvYmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lmxvd19wb3dlcl9jbG9iaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnNlY29uZF9yYW5naW5nX3dpbmRvdyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmFsbG9jX3R5cGVfdG9fc2NhbiA9IChiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVA6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMucGxvX3NpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLnBsb19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hbGxvY19pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFsbG9jX2lkID0gKGJjbW9sdF9wb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWNjZXNzX3NpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFjY2Vzc19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kYmFfbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZGJhX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY2tfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtX2hhbmRsaW5nLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19yYW5naW5nX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXRyYW5zX3JhbmdpbmdfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmFuZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19hc3NpZ25fYWxsb2NfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtX2hhbmRsaW5nLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19rZXlfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfa2V5X2NvbnRyb2wgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX2tleV9jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19yZXF1ZXN0X3JlZ2lzdHJhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBsb2FtX2hhbmRsaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBsb2FtX2hhbmRsaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibXVsdGljYXN0X2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibXVsdGljYXN0X2tleS5rZXkuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9rZXkua2V5LmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIG11bHRpY2FzdF9rZXkua2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5rZXkuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibXVsdGljYXN0X2tleS5rZXkuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtdWx0aWNhc3Rfa2V5LmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9rZXkua2V5X2NvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibXVsdGljYXN0X2tleS5rZXlfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfYWxhcm1zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5vbnVfYWxhcm1zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5hY2tfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFja190aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5hY2tfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxva2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fbmlfZGVidWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5pbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuaW50ZXJfYnVyc3RfZ2FwX2luX2J5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJfYnVyc3RfZ2FwX2luX2J5dGVzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcuaW50ZXJfYnVyc3RfZ2FwX2luX2J5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRlYnVnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X3JldHJ5X2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9tY2lfZm9ybWF0ID0gKGJjbW9sdF9vbWNpX2RldmljZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy53aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLmFjdGl2YXRlX2NvbW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFjdGl2YXRlX2NvbW1pdCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLmFjdGl2YXRlX2NvbW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5kZWxheV9mb3JfY29tbWl0X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGVsYXlfZm9yX2NvbW1pdF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5kZWxheV9mb3JfY29tbWl0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19mZWNfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRzX2ZlY19tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYV90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGJhX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RiYV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X3R1bmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmcudHNvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRzb3VyY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdHVuaW5nLnRzb3VyY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdHVuaW5nLnR0YXJnZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50dGFyZ2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3R1bmluZy50dGFyZ2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9yZXF1aXJlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdHVuaW5nLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5od19wb25faWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaHdfcG9uX2lkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaHdfcG9uX2lkLnBvbl9pZF8xIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9uX2lkXzEgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaHdfcG9uX2lkLnBvbl9pZF8xIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmh3X3Bvbl9pZC5wb25faWRfMiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbl9pZF8yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmh3X3Bvbl9pZC5wb25faWRfMiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBod19wb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfaHdfcG9uX2lkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBod19wb25faWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJod19wb25faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgaHdfcG9uX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBod19wb25faWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGguY2JyX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGguY2JyX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgudG90YWxfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50b3RhbF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLnRvdGFsX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5uZXh0X29udV90b3RhbF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLm5leHRfb251X3RvdGFsX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXZhaWxhYmxlX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubnVtYmVyX29mX2FjdGl2ZV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBvbl9zdGF0dXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9zdGF0dXMuc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGF0ZSA9IChiY21vbHRfcG9uX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvbl9zdGF0dXMuc3RhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX3N0YXR1cy5sb3Nfc3RhdHVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zX3N0YXR1cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvbl9zdGF0dXMubG9zX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwb25fc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwb25fc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwb25fc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwb25fc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9sb2dfZGlzdGFuY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2RpZmZfcmVhY2ggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwb25fZGlzdGFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9kaXN0YW5jZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3dpbmRvd19zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcWRfY3ljbGVzX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRyaWZ0X2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuZHJpZnRfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRyaWZ0X2xpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb3NfYWxhcm1fdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3NfYWxhcm1fdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb3NfaW5pdGlhbF92YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXR1cyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3NfaW5pdGlhbF92YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9iaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vY2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3BjaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcGNpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3BjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNfYmVyX2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZl90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmVyX21vbml0b3Iuc2ZfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNkX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iZXJfbW9uaXRvci5zZF90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmVyX21vbml0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGJlcl9tb25pdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2V4Y2hhbmdlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hY3RpdmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hY3RpdmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG9udV9hY3RpdmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgPSAoYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmJ1cnN0X3Byb2ZpbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idXJzdF9wcm9maWxlID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uYnVyc3RfcHJvZmlsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lbmNyeXB0ZWRfcG9ydHNfb25seSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGtleV9leGNoYW5nZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fcGluID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5mYXN0X3JhbmdpbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mYXN0X3JhbmdpbmcgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5mYXN0X3JhbmdpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5kYXRhX21hcF9kZWxheV9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfbWFwX2RlbGF5X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLmRhdGFfbWFwX2RlbGF5X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfNyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzEgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl8yIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIgbXVzdCBoYXZlIDIgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDI7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWxvd3Bvd2VyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWxvd3Bvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWxvd3Bvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWF3YXJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXRyYW5zaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLml0cmFuc2luaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXR4aW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLml0eGluaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHhpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXJ4b2ZmID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG93X3Bvd2VyX2Nsb2JpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5tZWFzdXJlbWVudF90eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnNlY29uZF9yYW5naW5nX3dpbmRvdyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsbG9jX3R5cGVfdG9fc2NhbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuID0gKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVA6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLnBsb19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFsbG9jX2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFsbG9jX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWxsb2NfaWQgPSAoYmNtb2x0X3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5vbnVfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5vbnVfaWQgPSAoYmNtb2x0X3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFjY2Vzc19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRVhURU5ERURfR1VBUkRfVElNRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kYmFfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RiYV9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kYmFfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRiYV9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY2tfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5hY2tfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JhbmdpbmdfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfcmFuZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmFuZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19hc3NpZ25fYWxsb2NfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcucmV0cmFuc19hc3NpZ25fYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcucmV0cmFuc19rZXlfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfa2V5X2NvbnRyb2wgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcucmV0cmFuc19rZXlfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19yZXF1ZXN0X3JlZ2lzdHJhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBsb2FtX2hhbmRsaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBsb2FtX2hhbmRsaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBsb2FtX2hhbmRsaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWluX2RhdGFfZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubXVsdGljYXN0X2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm11bHRpY2FzdF9rZXkua2V5LiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLm11bHRpY2FzdF9rZXkua2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5rZXkuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm11bHRpY2FzdF9rZXkua2V5LmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm11bHRpY2FzdF9rZXkua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm11bHRpY2FzdF9rZXkua2V5X2NvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm11bHRpY2FzdF9rZXkua2V5X2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IChiY21vbHRfcHJic19jaGVja2VyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9ja19zdGF0ZSA9IChiY21vbHRfcHJic19sb2NrX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfY291bnRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5vbnVfYWxhcm1zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X2FsYXJtcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWNrX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5hY2tfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZmkgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxva2kgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsbF9vbnVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkyOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX29udXMub251X2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9vbnVzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHZhbC5sZW47IGkyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMl0ub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTJdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfb251cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfb251cy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHZhbC5sZW47IGkyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMl0uc3RhdGUgPSAoYmNtb2x0X29udV9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMl0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhbGxfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9PTlVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGFsbF9vbnVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGFsbF9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMzsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuZ2VtX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuZ2VtX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdmFsLmxlbjsgaTMrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kzXS5nZW1faWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpM10udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHZhbC5sZW47IGkzKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpM10uc3RhdGUgPSAoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kzXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9tY2FzdF9nZW1fcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcuaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcuaW50ZXJfYnVyc3RfZ2FwX2luX2J5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfcmV0cnlfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbWNpX2Zvcm1hdCA9IChiY21vbHRfb21jaV9kZXZpY2VfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy53aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy53aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0aXZhdGVfY29tbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLmFjdGl2YXRlX2NvbW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGF5X2Zvcl9jb21taXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRzX2ZlY19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19mZWNfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkc19mZWNfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kYmFfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RiYV90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kYmFfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRiYV90eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9udV90dW5pbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3R1bmluZy50c291cmNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHNvdXJjZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdHVuaW5nLnRzb3VyY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3R1bmluZy50dGFyZ2V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHRhcmdldCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdHVuaW5nLnR0YXJnZXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3R1bmluZy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9yZXF1aXJlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3R1bmluZy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9yZXF1aXJlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdHVuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdHVuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG9udV90dW5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG9udV90dW5pbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBod19wb25faWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG9uX3N0YXR1cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwb25fZGlzdGFuY2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBkcmlmdF9jb250cm9sKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGJlcl9tb25pdG9yKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIG9udV9hY3RpdmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGtleV9leGNoYW5nZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJic19zdGF0dXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGFsbF9vbnVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGVidWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGRzX2ZlY19tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGRiYV90eXBlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIG9udV90dW5pbmcpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3N0YXQgc3RhdDsgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZXdvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwMzJfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIGJpcDMyX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJpcDMyX2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF94Z3RjX2hlYWRlcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfeGd0Y19jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19jb3JyZWN0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hndGNfdW5jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfdW5jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX3VuY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF94Z2VtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfeGdlbV9kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hnZW1faWRsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbV9pZGxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbV9pZGxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF94Z2VtX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbV9jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY3JjX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9jcmNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYWdtZW50X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9mcmFnbWVudF9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYWNrZXRzX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZHJvcHBlZF90b29fc2hvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Ryb3BwZWRfdG9vX2xvbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9rZXlfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2tleV9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2tleV9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcGxvYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9wbG9hbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9wbG9hbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9hbGxvY2F0aW9uc192YWxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX25vbl9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jcHUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NwdSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NwdSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfb21jaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfb21jaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfeGdlbSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfeGdlbSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X3hnZW0pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2NwdSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfY3B1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfY3B1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfb21jaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZHJvcHBlZF92aWRfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgZmVjX2NvZGV3b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIGJpcDMyX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX2NvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbV9kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2lkbGUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1fY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9jcmNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9rZXlfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X3Bsb2FtcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfY3B1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9vbWNpKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCB0eF9wYWNrZXRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCB0eF94Z2VtKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCB0eF9jcHUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X29tY2kpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc2V0X3Bvbl9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3Bvbl9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9QT05fU1RBVEUsIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcmVzZXRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9yZXNldCBvcGVyOyAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3Jlc2V0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCByZXNldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgcmVzZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9kaXNhYmxlX3NlcmlhbF9udW1iZXJfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwgY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSLCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2VyaWFsX251bWJlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9pZCwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyaWFsX251bWJlci52ZW5kb3JfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9zcGVjaWZpYywgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUiwgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBzZXJpYWxfbnVtYmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3NldF9vbnVfc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFLCBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3J1bl9zcGVjaWFsX2J3X21hcF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfY3ljbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIG51bWJlcl9vZl9jeWNsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIG51bWJlcl9vZl9jeWNsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVAsIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfTlVNQkVSX09GX0NZQ0xFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NhdGlvbl9udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIGFsbG9jYXRpb25fbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwgYWxsb2NhdGlvbl9udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQLCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0FMTE9DQVRJT05fTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYndfbWFwX2FycmF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcnVuX3NwZWNpYWxfYndfbWFwLCBid19tYXBfYXJyYXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcnVuX3NwZWNpYWxfYndfbWFwLCBid19tYXBfYXJyYXksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQLCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0JXX01BUF9BUlJBWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndpbmRvd190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIHdpbmRvd190eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIHdpbmRvd190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGFsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGFsbG9jX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2Vjb25kX3Jhbmdpbmdfd2luZG93Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBzZWNvbmRfcmFuZ2luZ193aW5kb3csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgc2Vjb25kX3Jhbmdpbmdfd2luZG93LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX3Byb3h5X2NwdV9wYWNrZXRzX3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMgcHJveHk7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzIHByb3h5O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcGFja2V0X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BhY2tldF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FsY19jcmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMF0gPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGdlbV9wb3J0X2xpc3QsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX3Byb3h5X2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBwcm94eTsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9wcm94eV9zZW5kIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9uaSwgYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwbG9hbS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfNDAgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcGxvYW0uYXJyIG11c3QgaGF2ZSA0MCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgNDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzQwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VULCBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl90b2RfcmVxdWVzdF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0IG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgdG9kX3JlcXVlc3QsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHRvZF9yZXF1ZXN0LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlzdF9vZl9vbnVfaWRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgc3RhcnRfb251X3VwZ3JhZGUsIGxpc3Rfb2Zfb251X2lkcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREUsIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwgbGlzdF9vZl9vbnVfaWRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGggb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2VyaWFsX251bWJlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9pZCwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyaWFsX251bWJlci52ZW5kb3JfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9zcGVjaWZpYywgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwgc2VyaWFsX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCwgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RILCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgYmlwMzJfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgYmlwMzJfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgYmlwMzJfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX2hlYWRlcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX2hlYWRlcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y19jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfdW5jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX3VuY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1fZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1fZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1fY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9mcmFnbWVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9rZXlfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9rZXlfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF94Z2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfeGdlbSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X3hncG9uX25pX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2tleV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2tleV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NwdSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3hnZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF94Z2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgeGdwb25fbmksIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcHVfcGFja2V0c19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBsb3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2NvdmVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV9kaXNjb3ZlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG9kX3JlcXVlc3RfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBsb3MpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdF9hbGFybV9yYWlzZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3B1X3BhY2tldHNfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBlbmFibGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBsb3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBsb3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfZGlzY292ZXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV9kaXNjb3ZlcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBvbnVfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X29sZF9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3VycmVudF9lbmNyeXB0aW9uX2tleSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX2J1cnN0X3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGFfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRhdGFfYnVyc3RfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGlvbl9yZWFzb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfYWxsb2NzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9hbGxvY3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9hbGxvY3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfbGluZV9yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHVzX2xpbmVfcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgdXNfbGluZV9yYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxpYnJhdGlvbl9yZWNvcmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bmluZ19ncmFudWxhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RlcF90dW5pbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBzZXJpYWxfbnVtYmVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX2J1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9hbGxvY3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgeGdwb25fb251LCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgeGdwb25fb251LCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfb251X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBvbnVfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9iaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9iaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvcGNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9wY2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvcGNpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9wY2lfbWljX2Vycm9yIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9wY2lfbWljX2Vycm9yID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb3BjaV9taWNfZXJyb3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb29jaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvb2NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb29jaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnRpd2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50aXdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS50aXdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuZG93aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmRvd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5zdWZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3VmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuc3VmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuc2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuc2RpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zZGkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5kZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmRmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmRnaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRnaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZGdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUucHFzaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBxc2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnBxc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwucGxvYW1faWsuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5vbWNpX2lrLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9payBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLm9tY2lfazEuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwub21jaV9rMi5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5rZWsuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2Flc19rZXkgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmVuY3J5cHRpb25fa2V5LmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3VycmVudF9lbmNyeXB0aW9uX2tleS5rZXlfaW5kZXgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfaW5kZXggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5LmtleV9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NVUlJFTlRfRU5DUllQVElPTl9LRVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2VyaWFsX251bWJlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9pZCwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyaWFsX251bWJlci52ZW5kb3JfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9zcGVjaWZpYywgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF8zNiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDM2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcmVnaXN0cmF0aW9uX2lkLmFyciBtdXN0IGhhdmUgMzYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDM2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25faWQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzM2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX2J1cnN0X3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX2J1cnN0X3Byb2ZpbGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJleHRlbmRlZF9ndWFyZF90aW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfbGluZV9yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgdXNfbGluZV9yYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgdXNfbGluZV9yYXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjYWxpYnJhdGlvbl9yZWNvcmQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxpYnJhdGlvbl9yZWNvcmQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGNhbGlicmF0aW9uX3JlY29yZC5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSAoYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2FsaWJyYXRpb25fcmVjb3JkLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX2dyYW51bGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVFVOSU5HX0dSQU5VTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RlcF90dW5pbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU1RFUF9UVU5JTkdfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfb251X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBvbnVfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBvbnVfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBvbnVfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfb2xkX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfb2xkX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgb251X29sZF9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb3NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9iaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvcGNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9wY2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sb3BjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb3BjaV9taWNfZXJyb3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaV9taWNfZXJyb3IgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sb3BjaV9taWNfZXJyb3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9vY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb29jaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvb2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnRpd2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50aXdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUudGl3aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5kb3dpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRvd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc3VmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN1ZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zdWZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5zZGkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZGkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zZGkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRnaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRnaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRnaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5wcXNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHFzaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnBxc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5wbG9hbV9pay5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwub21jaV9pay5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9payBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLm9tY2lfazEuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5vbWNpX2syLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwua2VrLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY3VycmVudF9lbmNyeXB0aW9uX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZW5jcnlwdGlvbl9rZXkuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmtleV9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmtleV9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NVUlJFTlRfRU5DUllQVElPTl9LRVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3JfaWQgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3JfaWQsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3Jfc3BlY2lmaWMsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBzZXJpYWxfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9pZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfMzYgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25faWQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMzYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIucmVnaXN0cmF0aW9uX2lkLmFyciBtdXN0IGhhdmUgMzYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDM2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2lkLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91OF8zNiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX2J1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRhdGFfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXggdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGFfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYWN0aXZhdGlvbl9yZWFzb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy5nZW1faWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy5nZW1faWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmdlbV9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLnN0YXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5zdGF0ZSA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2dlbV9wb3J0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9nZW1fcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsbF9hbGxvY3MuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkxOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2FsbG9jcy5hbGxvY19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfYWxsb2NzLmFsbG9jX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmxlbjsgaTErKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfYWxsb2NzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9hbGxvY3Muc3RhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwubGVuOyBpMSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTFdLnN0YXRlID0gKGJjbW9sdF9hbGxvY19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9hbGxvY3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfYWxsb2NzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfYWxsb2NzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX2FsbG9jcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfbGluZV9yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgdXNfbGluZV9yYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgdXNfbGluZV9yYXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2xpbmVfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgdXNfbGluZV9yYXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgdXNfbGluZV9yYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmNhbGlicmF0aW9uX3JlY29yZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYWxpYnJhdGlvbl9yZWNvcmQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkyOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGZpbHRlci5jYWxpYnJhdGlvbl9yZWNvcmQuYXJyIG11c3QgaGF2ZSA4IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCA4OyBpMisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTJdID0gKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQpIGNsaV9wYXJtLT52YWx1ZXNbaTJdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYWxpYnJhdGlvbl9yZWNvcmQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxpYnJhdGlvbl9yZWNvcmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR1bmluZ19ncmFudWxhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1RVTklOR19HUkFOVUxBUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bmluZ19ncmFudWxhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RlcF90dW5pbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU1RFUF9UVU5JTkdfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0ZXBfdHVuaW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMucmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMucmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLnNtYV9mbGFnIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc21hX2ZsYWcgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMuc21hX2ZsYWcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgb251X29sZF9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxhcm1fc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCByYW5naW5nX3RpbWUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX2dlbV9wb3J0cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX2FsbG9jcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgdXNfbGluZV9yYXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdCBzdGF0OyAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIHhncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3NpdGl2ZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZWdhdGl2ZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXAzMl9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBiaXAzMl9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgYmlwMzJfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF93b3JkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29ycmVjdGVkX3N5bWJvbHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9zeW1ib2xzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29ycmVjdGVkX2NvZGV3b3JkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZXdvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvZGV3b3Jkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29kZXdvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29ycmVjdGVkX2JpdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2JpdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9iaXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ4Z2VtX2tleV9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgeGdlbV9rZXlfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ4Z2VtX2xvc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2xvc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgeGdlbV9sb3NzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfbWljX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfcGxvYW1zX21pY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbWljX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfbm9uX2lkbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfcGxvYW1zX25vbl9pZGxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfb21jaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHR4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHR4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgdHhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB0eF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgYmlwMzJfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgcnhfd29yZHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2NvZGV3b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2JpdHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2xvc3MpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbWljX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgcnhfcGxvYW1zX25vbl9pZGxlKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgcnhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCB0eF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHR4X3BhY2tldHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURSwgQkNNT0xUX1hHUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX3Jzc2lfbWVhc3VyZW1lbnRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnQsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X3Byb3h5X3Bsb2FtX3BhY2tldF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0IHByb3h5OyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0IHByb3h5O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX29udSwgcGxvYW1fcGFja2V0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfa2V5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBwbG9hbV9wYWNrZXQsIGRlZmF1bHRfa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgZGVmYXVsdF9rZXksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfREVGQVVMVF9LRVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGxvYW0uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzQwIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHBsb2FtLmFyciBtdXN0IGhhdmUgNDAgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDQwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwbG9hbS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBwbG9hbV9wYWNrZXQsIHBsb2FtLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91OF80MCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQsIEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHByb3h5Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfcHJveHlfY3B1X3BhY2tldHNfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMgcHJveHk7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzIHByb3h5O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BhY2tldF90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wYWNrZXRfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FsY19jcmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgY2FsY19jcmMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF9zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3NpemUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb24gb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb24sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic21hX2ZsYWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbiwgc21hX2ZsYWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uLCBzbWFfZmxhZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OLCBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX1NNQV9GTEFHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsbGluZywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMTElORywgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdHRlbnVhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBhdHRlbnVhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsbGluZywgYXR0ZW51YXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HLCBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9nZXRfcG93ZXJfbGV2ZWxfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBnZXRfcG93ZXJfbGV2ZWwsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBnZXRfcG93ZXJfbGV2ZWwsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb24gb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGdldF9wb3dlcl9jb25zdW1wdGlvbiwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGdldF9wb3dlcl9jb25zdW1wdGlvbiwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCwgQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwgZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RILCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm1hc3Rlcl9rZXkuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYWVzX2tleSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFzdGVyX2tleS5ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgbWFzdGVyX2tleS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5ieXRlcywgMTYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hc3Rlcl9rZXkuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgbWFzdGVyX2tleSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZXNfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OLCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBtYXN0ZXJfa2V5LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIGJ1ZmZlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTiwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIG1pYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgbWljLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTiwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01JQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX29udV90dW5pbmdfaW5fc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbiBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19pbiwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfaW4sIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfb251X3R1bmluZ19vdXRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInRhcmdldF9kc19wb25faWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2lkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0YXJnZXRfZHNfcG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRtaW5pc3RyYXRpdmVfbGFiZWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0YXJnZXRfZHNfcG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGFyZ2V0X2RzX3Bvbl9pZC5kd2xjaF9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmR3bGNoX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidGFyZ2V0X2RzX3Bvbl9pZC5kd2xjaF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGFyZ2V0X2RzX3Bvbl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25faWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VULCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF9kc19wb25faWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidGFyZ2V0X3VzX3Bvbl9pZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25faWQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF91c19wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRhcmdldF91c19wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0YXJnZXRfdXNfcG9uX2lkLmR3bGNoX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0YXJnZXRfdXNfcG9uX2lkLmR3bGNoX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfdXNfcG9uX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9pZCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGFyZ2V0X3VzX3Bvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpbWVfdG9fc3dpdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGltZV90b19zd2l0Y2gsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0aW1lX3RvX3N3aXRjaCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VULCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9sbGJhY2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgcm9sbGJhY2ssIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCByb2xsYmFjaywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VULCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHN0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHN0YXR1cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VULCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fb251X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgYmlwMzJfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGJpcDMyX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1dPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9iaXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgeGdlbV9rZXlfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2xvc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX21pY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X3hncG9uX29udV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcG9zaXRpdmVfZHJpZnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcG9zaXRpdmVfZHJpZnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0RFTElNSVRFUl9NSVNTX0RFVEVDVElPTjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGJpcDMyX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBiaXAzMl9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF93b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF93b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9zeW1ib2xzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfVU5DT1JSRUNUQUJMRV9DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9CSVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2JpdHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgeGdlbV9rZXlfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fa2V5X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2xvc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgeGdlbV9sb3NzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX01JQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbWljX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgdHhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHR4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgeGdwb25fb251LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIHhncG9uX29udSwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGZpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGZpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZ2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRnaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRnaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZG93aSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZG93aSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRvd2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludmFsaWRfZGJydV9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBpbnZhbGlkX2RicnVfcmVwb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9vY2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGxvb2NpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgbG9vY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9hbGFybSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9hbGFybSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZ19pbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfaW5fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19pbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcHRpY2FsX3JlZmxlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9zc2libGVfZHJpZnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG9zc2libGVfZHJpZnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9sZXZlbF9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsX3JlcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsX3JlcG9ydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBxc2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBxc2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwcXNpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByYW5naW5nX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZGkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNkaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNkaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2ZpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2ZpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1ZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN1ZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdWZpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0aXdpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0aXdpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdGl3aSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX3Jlc3BvbnNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0dW5pbmdfcmVzcG9uc2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0dW5pbmdfcmVzcG9uc2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZ2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRvd2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgbG9vY2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19pbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9sZXZlbF9yZXBvcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwcXNpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByYW5naW5nX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNmaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3VmaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdGl3aSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdHVuaW5nX3Jlc3BvbnNlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGZpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRmaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGdpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZ2ksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGdpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkb3dpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkb3dpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRvd2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZhbGlkX2RicnVfcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBpbnZhbGlkX2RicnVfcmVwb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0lOVkFMSURfREJSVV9SRVBPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvb2NpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBsb29jaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBsb29jaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfTE9PQ0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9hbGFybSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9kaXNhYmxlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2VuYWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmdfaW5fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19JTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wdGljYWxfcmVmbGVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9zc2libGVfZHJpZnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWxfcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9sZXZlbF9yZXBvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxfcmVwb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHFzaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcHFzaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwcXNpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QUVNJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNkaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNkaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNmaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1ZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN1ZmksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3VmaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHRpd2ksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdGl3aSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bmluZ19yZXNwb25zZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdHVuaW5nX3Jlc3BvbnNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19yZXNwb25zZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl90cnhfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fdHJ4X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fdHJ4X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGRlYnVnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXNldF9vbl9kZWxfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVkX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBlZF9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW52ZXJ0X2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGludmVydF9lZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmVzZXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgZW5kX29mX2J1cnN0X3Jlc2V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyeF9yc3RfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGludmVydF9lZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX3RyeCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGJ1cnN0X3Byb2ZpbGUuYXJyIG11c3QgaGF2ZSA0IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUuYXJyLnByb2ZpbGVfdmVyc2lvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJvZmlsZV92ZXJzaW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByb2ZpbGVfdmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUuYXJyLmlzX2ZlY19vbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIuaXNfZmVjX29uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmlzX2ZlY19vbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9zaXplX2luX2J5dGVzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmRlbGltaXRlcl9zaXplX2luX2J5dGVzID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3BhdHRlcm5faGlnaCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3BhdHRlcm5faGlnaCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3BhdHRlcm5fbG93Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVsaW1pdGVyX3BhdHRlcm5fbG93ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcmVwZWF0c19jb3VudCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcmVwZWF0c19jb3VudCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9yZXBlYXRzX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcGF0dGVybl9oaWdoIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJlYW1ibGVfcGF0dGVybl9oaWdoID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcGF0dGVybl9sb3ciKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5fbG93IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByZWFtYmxlX3BhdHRlcm5fbG93ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIucG9uX3RhZyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIucG9uX3RhZyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wb25fdGFnID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5udW1fb2ZfZ3VhcmRfYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLm51bV9vZl9ndWFyZF9ieXRlcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5pc19wcm9maWxlX3ZhbGlkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5pc19wcm9maWxlX3ZhbGlkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmlzX3Byb2ZpbGVfdmFsaWQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUuYXJyLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkxOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IHRyYW5zY2VpdmVyX2NvbmZpZy5hcnIgbXVzdCBoYXZlIDQgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9sb2NhdGlvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wb2xhcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcG9sYXJpdHkgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbG9jYXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wb2xhcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BvbGFyaXR5IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3RyeF90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWJ1Zy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLnJ4X3JldmVyc2VkX3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucnhfcmV2ZXJzZWRfcG9sYXJpdHkgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5yeF9yZXZlcnNlZF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLm5lZ19vdXRfYml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubmVnX291dF9iaXQgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5uZWdfb3V0X2JpdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGRlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5wb2xhcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbGFyaXR5ID0gKGJjbW9sdF9wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbl9zaWduID0gKGJjbW9sdF9zaWduKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcucHVsc2Vfd2lkdGgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wdWxzZV93aWR0aCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5wdWxzZV93aWR0aCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWluaW11bV9idXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicnNzaV9yYW5naW5nX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnLnN0YXJ0X29uX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfb25fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnLmZyYW1lX2RlbGF5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZnJhbWVfZGVsYXkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX3JhbmdpbmdfY29uZmlnLmZyYW1lX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud29yZF9kZWxheSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfcmFuZ2luZ19jb25maWcud29yZF9kZWxheSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXlfYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mcmFtZV9kZWxheV9hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXlfYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXlfYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53b3JkX2RlbGF5X2FmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5X2FmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXVsdGlfZWRfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24ubXVsdGlfZWRfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfbW9kZSA9IChiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfNCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91OF80IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRV9ERUxJTUlURVJfTUFYX0VSUk9SUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcG9sYXJpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcG9sYXJpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0VEX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlc2V0X29uX2RlbF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZWRfc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fZWRfc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXNldF9vbl9lZF9mYWlsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlZF9zdGF0ZS5yZXNldF9vbl9lZF9mYWlsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZWRfc3RhdGUucmVzZXRfb25fZWRfc3VjY2VzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc2V0X29uX2VkX3N1Y2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVkX3N0YXRlLnJlc2V0X29uX2VkX3N1Y2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2VkX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW52ZXJ0X2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGludmVydF9lZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGludmVydF9lZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmVzZXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZW5kX29mX2J1cnN0X3Jlc2V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZW5kX29mX2J1cnN0X3Jlc2V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyeF9yc3RfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyeF9yc3RfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl90cnhfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX3RyeCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fdHJ4X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fdHJ4X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX3RyeCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIgbXVzdCBoYXZlIDQgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByb2ZpbGVfdmVyc2lvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByb2ZpbGVfdmVyc2lvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcm9maWxlX3ZlcnNpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuaXNfZmVjX29uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuaXNfZmVjX29uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmlzX2ZlY19vbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9zaXplX2luX2J5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3BhdHRlcm5faGlnaCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVsaW1pdGVyX3BhdHRlcm5faGlnaCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9sb3ciKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVsaW1pdGVyX3BhdHRlcm5fbG93ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcmVwZWF0c19jb3VudCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3JlcGVhdHNfY291bnQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2giKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJlYW1ibGVfcGF0dGVybl9oaWdoID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5fbG93Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcGF0dGVybl9sb3cgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucG9uX3RhZyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnBvbl90YWcgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucG9uX3RhZyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLm51bV9vZl9ndWFyZF9ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLm51bV9vZl9ndWFyZF9ieXRlcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuaXNfcHJvZmlsZV92YWxpZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmlzX3Byb2ZpbGVfdmFsaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfcHJvZmlsZV92YWxpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5idXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIgbXVzdCBoYXZlIDQgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbG9jYXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcG9sYXJpdHkgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BvbGFyaXR5IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3RyeF90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLnJ4X3JldmVyc2VkX3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucnhfcmV2ZXJzZWRfcG9sYXJpdHkgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcucnhfcmV2ZXJzZWRfcG9sYXJpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcubmVnX291dF9iaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5uZWdfb3V0X2JpdCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5uZWdfb3V0X2JpdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGRlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGRlYnVnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5wb2xhcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbGFyaXR5ID0gKGJjbW9sdF9wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcucG9sYXJpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb25fc2lnbiA9IChiY21vbHRfc2lnbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb25fc2lnbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcucHVsc2Vfd2lkdGgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wdWxzZV93aWR0aCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcucHVsc2Vfd2lkdGggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5pbXVtX2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLnN0YXJ0X29uX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfb25fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLnN0YXJ0X29uX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mcmFtZV9kZWxheSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLmZyYW1lX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcud29yZF9kZWxheSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndvcmRfZGVsYXkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXlfYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mcmFtZV9kZWxheV9hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLmZyYW1lX2RlbGF5X2FmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcud29yZF9kZWxheV9hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndvcmRfZGVsYXlfYWZ0ZXJfZWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5X2FmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9yYW5naW5nX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXVsdGlfZWRfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19tb2RlID0gKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJkZXNfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF80IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMuYXJyIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuYXJyLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9sYXN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wb2xhcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfQVRfSU5JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9sYXN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wb2xhcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZXNldF9vbl9kZWxfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVzZXRfb25fZGVsX21pc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZWRfc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fZWRfc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lZF9zdGF0ZS5yZXNldF9vbl9lZF9mYWlsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVzZXRfb25fZWRfZmFpbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZWRfc3RhdGUucmVzZXRfb25fZWRfc3VjY2VzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc2V0X29uX2VkX3N1Y2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lZF9zdGF0ZS5yZXNldF9vbl9lZF9zdWNjZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlZF9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlZF9zdGF0ZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVkX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBlZF9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVkX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaW52ZXJ0X2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGludmVydF9lZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGludmVydF9lZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZlcnRfZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGludmVydF9lZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGludmVydF9lZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yZXNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JFU0VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3Jlc2V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cnhfcnN0X3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyeF9yc3RfcG9sYXJpdHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSWF9SU1RfUE9MQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cnhfcnN0X3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGRlYnVnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVkX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCBpbnZlcnRfZWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgJmtleS5pbnN0YW5jZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4cG9uX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF92Z2EiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF92Z2EpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfdmdhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3BmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3BmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9sZnBmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfbGZwZik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wcmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcHJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tYWluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfbWFpbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXApOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfYW1wKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF92Z2EpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9wZikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2xmcGYpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3ByZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X21haW4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXApKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hwb25fc2VyZGVzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5zdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnN0YW5jZSA9IChiY21vbHRfc2VyZGVzX2luc3RhbmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW5zdGFuY2UgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF92Z2EsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3BmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xmcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfbGZwZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfbGZwZiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wcmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcHJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfbWFpbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfbWFpbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X2FtcCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfYW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9BTVAsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgJmtleS5pbnN0YW5jZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4cG9uX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hwb25fc2VyZGVzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmluc3RhbmNlID0gKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnN0YW5jZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4cG9uX3NlcmRlcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF92Z2EsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfdmdhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X3ZnYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfdmdhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3BmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X3BmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9wZik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2xmcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfbGZwZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfbGZwZiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xmcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfbGZwZik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfbGZwZik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9kZmUzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9wcmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcHJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wcmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3ByZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfbWFpbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfbWFpbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfbWFpbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfbWFpbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9wb3N0MiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0Mik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3Bvc3QzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfYW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X2FtcCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfYW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9BTVAsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfYW1wKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9hbXApO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF92Z2EpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfcGYpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfbGZwZikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmU0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcHJlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X21haW4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfYW1wKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FwaV9yb290KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXBfdHlwZSwgYmNtb2x0X21zZ190eXBlIG1zZ190eXBlLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb2x0X29ial9pZCBvYmpfaWQ7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYmplY3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG9ial9pZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYmplY3QgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgc3dpdGNoIChvYmpfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9uaV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9uaV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9uaV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYWVfbmlfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9hZV9uaV9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfT1BFUl9JRF9TRVRfQUVfTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX29wZXJfc2V0X2FlX25pX2VuX3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfZHNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfZHNfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF91c19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF91c19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0NIQU5ORUw6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2NoYW5uZWxfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2NoYW5uZWxfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFQlVHOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RlYnVnX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZGVidWdfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfQ0xJX0lOUFVUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX2NsaV9pbnB1dF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RBUlRfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX29wZXJfc3RhcnRfYXBpX2NhcHR1cmVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVE9QX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX3N0b3BfYXBpX2NhcHR1cmVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfb3Blcl9yZXNldF9hcGlfY2FwdHVyZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2VfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2VfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9kZXZpY2Vfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9kZXZpY2Vfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9vcGVyX2Nvbm5lY3Rfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfZGlzY29ubmVjdF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfcmVzZXRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSE9TVF9LRUVQX0FMSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9ob3N0X2tlZXBfYWxpdmVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfU1dfVVBHUkFERV9BQ1RJVkFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfc3dfdXBncmFkZV9hY3RpdmF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfaW1hZ2VfdHJhbnNmZXJfZGF0YV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfcnVuX2Rkcl90ZXN0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9saW5rX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZXBvbl9saW5rX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9GT1JDRV9SRURJU0NPVkVSWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfZm9yY2VfcmVkaXNjb3Zlcnlfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfREVMRVRFX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX2RlbGV0ZV9saW5rX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3Bfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9rZXlfZXhjaGFuZ2Vfc3RhcnRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX2tleV9leGNoYW5nZV9zdG9wX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX3N0YXRpY19yZWdpc3RyYXRpb25fc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbGlua19wcm94eV9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfcHJveHlfaW5qZWN0X2ZyYW1lX3NlbmQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZXBvbl9uaV9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfc2V0X2Vwb25fbmlfZW5fc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9pc3N1ZV9yc3NpX2dyYW50X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2FkZF9saW5rX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9hZGRfbXVsdGljYXN0X2xpbmtfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9ST0dVRV9MTElEX1NDQU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9yb2d1ZV9sbGlkX3NjYW5fc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3JwX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQSU86CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwaW9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwaW9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bpb19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncGlvX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0M6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2NfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fYWxsb2Nfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9ncG9uX2FsbG9jX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX29wZXJfc2V0X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2Nfb3Blcl9nZXRfc3RhdHNfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9vcGVyX3NldF9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2Zfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX2l3Zl9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2dwb25faXdmX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2Zfb3Blcl9mbHVzaF9tYWNfdGFibGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9TQ0FOX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2Zfb3Blcl9zY2FuX21hY190YWJsZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fbmlfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9ncG9uX25pX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NldF9wb25fc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfcmVzZXRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9zZXRfb251X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl90b2RfcmVxdWVzdF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3N0YXJ0X29udV91cGdyYWRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fbmlfcHJveHlfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfcHJveHlfY3B1X3BhY2tldHNfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX3Byb3h5X2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2dwb25fb251X29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X29wZXJfcnNzaV9tZWFzdXJlbWVudF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfb3Blcl9jaGFuZ2VfcG93ZXJfbGV2ZWxfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fb251X3Byb3h5X2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2dwb25fb251X3Byb3h5X2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X3Byb3h5X2NwdV9wYWNrZXRzX3NlbmQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfcHJveHlfcGxvYW1fcGFja2V0X3NlbmQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fVFJYOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl90cnhfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl90cnhfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl90cnhfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0xPR0dFUjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfbG9nZ2VyX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfbG9nZ2VyX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9DTEVBUl9MT0c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9vcGVyX2NsZWFyX2xvZ19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc2VyZGVzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc2VyZGVzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3NvZnR3YXJlX2Vycm9yX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3NvZnR3YXJlX2Vycm9yX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3NvZnR3YXJlX2Vycm9yX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fb3Blcl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVE9QX0NBUFRVUkVfV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fb3Blcl9zdG9wX2NhcHR1cmVfd2luZG93X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0M6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfeGdwb25fYWxsb2Nfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19vcGVyX2dldF9zdGF0c19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfb3Blcl9zZXRfc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9JV0Y6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9pd2ZfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X3hncG9uX25pX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9QT05fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc2V0X3Bvbl9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3Jlc2V0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JVTl9TUEVDSUFMX0JXX01BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9ydW5fc3BlY2lhbF9id19tYXBfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9UT0RfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl90b2RfcmVxdWVzdF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3N0YXJ0X29udV91cGdyYWRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfeGdwb25fbmlfcHJveHlfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfeGdwb25fbmlfcHJveHlfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfcHJveHlfY3B1X3BhY2tldHNfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfcHJveHlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9zZW5kKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX3NldF9vbnVfc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfcnNzaV9tZWFzdXJlbWVudF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX2dldF9wb3dlcl9sZXZlbF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfQ09OU1VNUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX2dldF9wb3dlcl9jb25zdW1wdGlvbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfYWRqdXN0X3R4X3dhdmVsZW5ndGhfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfSU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX29udV90dW5pbmdfaW5fc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX29udV90dW5pbmdfb3V0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfcHJveHlfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfeGdwb25fb251X3Byb3h5X2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X3Byb3h5X3Bsb2FtX3BhY2tldF9zZW5kKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfcHJveHlfY3B1X3BhY2tldHNfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl90cnhfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94cG9uX3NlcmRlc19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94cG9uX3NlcmRlc19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94cG9uX3NlcmRlc19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9Cit9CisKKy8qIFBlcmZvcm0gYW4gQVBJIGNhbGwgYmFzZWQgb24gQ0xJIGlucHV0ICovCitiY21vc19lcnJubyBiY21vbHRfY2xpX2FwaV9jYWxsKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXBfdHlwZSwgYmNtb2x0X21zZ190eXBlIG1zZ190eXBlLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYXBpY2xpX2J5dGVfcG9vbCBieXRlX3Bvb2w7CisgICAgKHZvaWQpYXBpY2xpX3VudW1iZXJfdG9faXB2NDsKKworICAgIC8qIHNldHVwIG1lbW9yeSBwb29sIGZvciBkeW5hbWljYWxseS1zaXplZCBsaXN0IG1lbW9yeSBhbGxvY2F0aW9uICovCisgICAgZXJyID0gYXBpY2xpX2J5dGVfcG9vbF9jcmVhdGUoJmJ5dGVfcG9vbCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBjYWxsIHRoZSByb290IEFQSSBoYW5kbGVyICovCisgICAgZXJyID0gYmNtb2x0X2NsaV9hcGlfcm9vdChkZXZpY2VfaWQsIGdyb3VwX3R5cGUsIG1zZ190eXBlLCBzZXNzaW9uLCAmYnl0ZV9wb29sKTsKKworICAgIC8qIGZyZWUgYWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBhcGljbGlfYnl0ZV9wb29sX2Rlc3Ryb3koJmJ5dGVfcG9vbCk7CisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGFuZGxlcnMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hhbmRsZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhNWU1OAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hhbmRsZXJzLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIE1BUExFX0NMSV9IQU5ETEVSU19IXworI2RlZmluZSBNQVBMRV9DTElfSEFORExFUlNfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKworLyogdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0aGF0IGNvdWxkIHBvc3NpYmx5IGJ5IHVzZWQgYnkgYWxsIHZhcmlhYmxlLXNpemVkIGxpc3RzIHdpdGhpbiBhIEdFVCByZXF1ZXN0ICovCisjZGVmaW5lIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKKworLyogUGVyZm9ybSBhbiBBUEkgY2FsbCBiYXNlZCBvbiBDTEkgaW5wdXQgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYXBpX2NhbGwoCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICBiY21vbHRfbWd0X2dyb3VwIGdyb3VwX3R5cGUsCisgICAgYmNtb2x0X21zZ190eXBlIG1zZ190eXBlLAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oZWxwZXJzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oZWxwZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3N2FlYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuYwpAQCAtMCwwICsxLDI0NzM0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKworI2luY2x1ZGUgImJjbV9hcGlfY2xpX2hlbHBlcnMuaCIKKworLyogYWxsb3cgcG9zc2libHkgdW51c2VkIGRlc2NyaXB0b3JzIHRvIG1ha2UgdGhlIGNvZGUgZWFzaWVyIHRvIGdlbmVyYXRlICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgQkNNX0RFU0NSICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIEJDTV9ERVNDUgorI2VuZGlmCisKKy8qIFVubGVzcyBzcGVjaWZpZWQgaW4gdGhlIFhNTCBtb2RlbCwgZHluYW1pYyBhcnJheXMgd2lsbCBoYXZlIHRoaXMgbWF4IHNpemUgKGluIGJ5dGVzLCB3aWxsIGRpdmlkZSBieSBlbGVtZW50IHNpemUpICovCisjZGVmaW5lIERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAgICAyMDQ4CisKKy8qID09PT0gQmFzZSBUeXBlIERlc2NyaXB0b3JzID09PT0gKi8KK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90ID0geyAubmFtZSA9ICJ1aW50OF90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSwgLnNpemUgPSBzaXplb2YodWludDhfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQxNl90ID0geyAubmFtZSA9ICJ1aW50MTZfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0sIC5zaXplID0gc2l6ZW9mKHVpbnQxNl90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDMyX3QgPSB7IC5uYW1lID0gInVpbnQzMl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSwgLnNpemUgPSBzaXplb2YodWludDMyX3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50NjRfdCA9IHsgLm5hbWUgPSAidWludDY0X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNLCAuc2l6ZSA9IHNpemVvZih1aW50NjRfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfaGV4ID0geyAubmFtZSA9ICJ1aW50OF90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgsIC5zaXplID0gc2l6ZW9mKHVpbnQ4X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MTZfdF9oZXggPSB7IC5uYW1lID0gInVpbnQxNl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgsIC5zaXplID0gc2l6ZW9mKHVpbnQxNl90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDMyX3RfaGV4ID0geyAubmFtZSA9ICJ1aW50MzJfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYLCAuc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ2NF90X2hleCA9IHsgLm5hbWUgPSAidWludDY0X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCwgLnNpemUgPSBzaXplb2YodWludDY0X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9pbnQ4X3QgPSB7IC5uYW1lID0gImludDhfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU0sIC5zaXplID0gc2l6ZW9mKGludDhfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2ludDE2X3QgPSB7IC5uYW1lID0gImludDE2X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TTlVNLCAuc2l6ZSA9IHNpemVvZihpbnQxNl90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfaW50MzJfdCA9IHsgLm5hbWUgPSAiaW50MzJfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU0sIC5zaXplID0gc2l6ZW9mKGludDMyX3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9pbnQ2NF90ID0geyAubmFtZSA9ICJpbnQ2NF90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTSwgLnNpemUgPSBzaXplb2YoaW50NjRfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2Zsb2F0ID0geyAubmFtZSA9ICJmbG9hdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0ZMT0FULCAuc2l6ZSA9IHNpemVvZihmbG9hdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2RvdWJsZSA9IHsgLm5hbWUgPSAiZG91YmxlIiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQsIC5zaXplID0gc2l6ZW9mKGRvdWJsZSkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJiY21vc19tYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJNQUMgYWRkcmVzcyIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX01BQywgLnNpemUgPSBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vc19pcHY0X2FkZHJlc3MgPSB7IC5uYW1lID0gImJjbW9zX2lwdjRfYWRkcmVzcyIsIC5kZXNjciA9ICJJUHY0IGFkZHJlc3MiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9JUFY0LCAuc2l6ZSA9IHNpemVvZihiY21vc19pcHY0X2FkZHJlc3MpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vc19ib29sID0geyAubmFtZSA9ICJiY21vc19ib29sIiwgLmRlc2NyID0gIkJvb2xlYW4iLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9CT09MLCAuc2l6ZSA9IHNpemVvZihiY21vc19ib29sKSB9OworCisvKiA9PT09IE9iamVjdCBUeXBlIEluZm9ybWF0aW9uID09PT0gKi8KK3N0YXRpYyBjaGFyICpvYmplY3RfbmFtZVtdID0geyAiYWVfbmkiLCAiYWVfcGF0aF9kcyIsICJhZV9wYXRoX3VzIiwgImNoYW5uZWwiLCAiZGVidWciLCAiZGV2aWNlIiwgImVwb25fZGVuaWVkX2xpbmsiLCAiZXBvbl9saW5rIiwgImVwb25fbmkiLCAiZXBvbl9vbnVfMTBnX3VzIiwgImVwb25fb251XzFnX3VzIiwgImVwb25fcGF0aF8xMGdfZHMiLCAiZXBvbl9wYXRoXzEwZ191cyIsICJlcG9uX3BhdGhfMWdfZHMiLCAiZXBvbl9wYXRoXzFnX3VzIiwgImVwb25fcnAiLCAiZ3BpbyIsICJncG9uX2FsbG9jIiwgImdwb25fZ2VtX3BvcnQiLCAiZ3Bvbl9pd2YiLCAiZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3ciLCAiZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93IiwgImdwb25faXdmX21hY190YWJsZSIsICJncG9uX2l3Zl91c19mbG93IiwgImdwb25fbmkiLCAiZ3Bvbl9vbnUiLCAiZ3Bvbl90cngiLCAibG9nX2VudHJ5IiwgImxvZ2dlciIsICJubmkiLCAibm5pX3NlcmRlcyIsICJzb2Z0d2FyZV9lcnJvciIsICJ0cnhfY2FsaWJyYXRpb24iLCAieGdwb25fYWxsb2MiLCAieGdwb25fZ2VtX3BvcnQiLCAieGdwb25faXdmIiwgInhncG9uX25pIiwgInhncG9uX29udSIsICJ4Z3Bvbl90cngiLCAieHBvbl9zZXJkZXMiIH07CitzdGF0aWMgY2hhciAqb2JqZWN0X2Rlc2NyW10gPSB7ICJBRSBOZXR3b3JrIEludGVyZmFjZS4iLCAiQUUgZG93bnN0cmVhbSBkYXRhIHBhdGguIiwgIkFFIHVwc3RyZWFtIGRhdGEgcGF0aC4iLCAiQ2hhbm5lbCIsICJEZWJ1ZyBGZWF0dXJlcyIsICJTaW5nbGV0b24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGV2aWNlIGFzIGEgd2hvbGUuIiwgIlVuaWNhc3QgRVBPTiBsaW5rIHRoYXQgaGFzIGJlZW4gZGVuaWVkIHJlZ2lzdHJhdGlvbiBmb3Igc29tZSByZWFzb24uIFRvIGJlIGFuIG9iamVjdCBvZiB0aGlzIHR5cGUgeW91IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWN0aXZlIGFsYXJtIHBvc3RlZCBhZ2FpbnN0IHlvdS4iLCAiVW5pY2FzdCBFUE9OIGxpbmsiLCAiRVBPTiBOZXR3b3JrIEludGVyZmFjZS4iLCAiRVBPTiBPTlUgMTBHIFVTIiwgIkVQT04gT05VIGludGVyZmFjZSBvZiBvbmUgb3IgbW9yZSBFUE9OIGxpbmtzLiIsICJFUE9OIDEwRyBkb3duc3RyZWFtIGRhdGEgcGF0aC4iLCAiRVBPTiAxMEcgdXBzdHJlYW0gZGF0YSBwYXRoLiIsICJFUE9OIDFHIGRvd25zdHJlYW0gZGF0YSBwYXRoLiIsICJFUE9OIDFHIHVwc3RyZWFtIGRhdGEgcGF0aC4iLCAiMTAvMTAsIDEwLzEgb3IgMS8xIERTL1VTIHBhaXIgb2YgRVBPTiBQYXRocyIsICJHUElPIGNvbnRyb2wiLCAiR1BPTiBBbGxvYyIsICJHUE9OIEdFTSBQb3J0IiwgIkdQT04gSVdGIiwgIkdQT04gSVdGIERTIGVncmVzcyBmbG93IiwgIkdQT04gSVdGIERTIGluZ3Jlc3MgZmxvdyIsICJHUE9OIElXRiBNQUMgdGFibGUiLCAiR1BPTiBJV0YgVVMgZmxvdyIsICJHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgIkdQT04gT05VIiwgIkdQT04gVFJYIiwgImxvZyBlbnRyeSIsICJsb2dnZXIiLCAiVXNlIGZvciBsb29wYmFja3MiLCAiTk5JIFNFUkRFUyBwYXJhbWV0ZXJzLiIsICJTb2Z0d2FyZSBFcnJvciIsICJUUlggQ2FsaWJyYXRpb24iLCAiWEdQT04gQWxsb2MiLCAiWEdQT04gR0VNIHBvcnQiLCAiWEdQT04gSVdGIiwgIlhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgIlhHUE9OIE9OVSIsICJYR1BPTiBUUlgiLCAiUE9OIFNFUkRFUyBwYXJhbWV0ZXJzLiIgfTsKKworLyogPT09PSBTdXBwb3J0aW5nIFR5cGVzID09PT0gKi8KK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUgfSwgeyAubmFtZSA9ICJyYW5naW5nIiwgLnZhbCA9IEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX1JBTkdJTkcgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbiIsIC52YWwgPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTiB9LCB7IC5uYW1lID0gImxvcyIsIC52YWwgPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9MT1MgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAudmFsID0gQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiYWN0aXZhdGlvbiBmYWlsIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWN0dWFsX21ic190cSIsIC5kZXNjciA9ICJBY3R1YWwgTUJTIChUUSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIsIGFjdHVhbF9tYnNfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWN0dWFsX3dlaWdodF90cSIsIC5kZXNjciA9ICJBY3R1YWwgV2VpZ2h0IChUUSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIsIGFjdHVhbF93ZWlnaHRfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciA9IHsgLm5hbWUgPSAiYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIiLCAuZGVzY3IgPSAiQWN0dWFsIFNjaGVkdWxlci9TaGFwZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9ORSB9LCB7IC5uYW1lID0gIm5vbl9hc3N1cmVkIiwgLnZhbCA9IEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTl9BU1NVUkVEIH0sIHsgLm5hbWUgPSAiYmVzdF9lZmZvcnQiLCAudmFsID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfQkVTVF9FRkZPUlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0geyAubmFtZSA9ICJiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIsIC5kZXNjciA9ICJBZGRpdGlvbmFsIEJXIGVsaWdpYmlsaXR5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUyB9LCB7IC5uYW1lID0gImFlX25pX2VuIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4gfSwgeyAubmFtZSA9ICJtdHVfMTBnIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRyB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX25pX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX25pX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfQUVfTklfRU5fU1RBVEVfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJlbmFibGVkIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9FTl9TVEFURV9FTkFCTEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfZW5fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9uaV9lbl9zdGF0ZSIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGUgb2YgdGhlIEFFIE5JLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWVfbmkiLCAudmFsID0gQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX25pX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9uaV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWVfbmkiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfZHNfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUyB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfZHNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmY3NfZXJyb3IiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GQ1NfRVJST1IgfSwgeyAubmFtZSA9ICJvdmVyc2l6ZV9lcnJvciIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SIH0sIHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9hcnJfMTYgPSB7IC5uYW1lID0gInVpbnQ4X3RbMTZdIiwgLmRlc2NyID0gIkFycmF5IG9mIDE2IGVsZW1lbnRzIG9mIHR5cGUgdWludDhfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQ4X3RbMTZdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5zaXplID0gMTYgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIkJ5dGVzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Flc19rZXksIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl8xNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9hZXNfa2V5IiwgLmRlc2NyID0gIjEyOC1iaXQgQUVTIGtleSB1c2VkIGZvciBPTlUgYXV0aGVudGljYXRpb24uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Flc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5X2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFjdGl2YXRlIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19PUEVSQVRJT05fQUNUSVZBVEUgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRlIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19PUEVSQVRJT05fREVBQ1RJVkFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX29wZXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2FsbG9jX29wZXJhdGlvbiIsIC5kZXNjciA9ICJBbGxvYyBvcGVyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWxsb2Nfb3BlcmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FsbG9jX29wZXJhdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY19zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3RfY29uZmlndXJlZCIsIC52YWwgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQgfSwgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfQUxMT0NfU1RBVEVfSU5BQ1RJVkUgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19TVEFURV9BQ1RJVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FsbG9jX3N0YXRlIiwgLmRlc2NyID0gIkFsbG9jIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FsbG9jX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FsbG9jX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FsbG9jX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfQUxMT0NfVFlQRV9OT05FIH0sIHsgLm5hbWUgPSAibnNyIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX05TUiB9LCB7IC5uYW1lID0gInNyIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX1NSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWxsb2NfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FsbG9jX3R5cGUiLCAuZGVzY3IgPSAiQWxsb2MgVHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hbGxvY190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FsbG9jX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVudXNlZCIsIC52YWwgPSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX1VOVVNFRCB9LCB7IC5uYW1lID0gInByZXZpb3VzbHlfdXNlZCIsIC52YWwgPSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX1BSRVZJT1VTTFlfVVNFRCB9LCB7IC5uYW1lID0gImFsbCIsIC52YWwgPSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX0FMTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbiIsIC5kZXNjciA9ICJBbGxvYyBUeXBlIHRvIHNjYW4gZHVyaW5nIHRoZSByb2d1ZSBvbnUgZGV0ZWN0aW9uIHByb2Nlc3MuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW5fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib3ZlcmZsb3ciLCAudmFsID0gQkNNT0xUX0FQSV9DQVBUVVJFX0JVRkZFUl9NT0RFX09WRVJGTE9XIH0sIHsgLm5hbWUgPSAid3JhcCIsIC52YWwgPSBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfV1JBUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUiLCAuZGVzY3IgPSAiV2hhdCB0byBkbyB3aGVuIHRoZSBjYXB0dXJlIGJ1ZmZlciBpcyBmdWxsLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvZmZzZXQiLCAuZGVzY3IgPSAiVGhlIGJ5dGVzIG9mZnNldCB0byByZWFkIGZyb20uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyLCBvZmZzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic2l6ZSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyLCBzaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgPSB7IC5uYW1lID0gImJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIiwgLmRlc2NyID0gIldoYXQgcG9ydGlvbiBvZiB0aGUgY2FwdHVyZSBidWZmZXIgdG8gcmVhZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZXZpY2UiLCAudmFsID0gQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0RFVklDRSB9LCB7IC5uYW1lID0gImhvc3QiLCAudmFsID0gQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0hPU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIiwgLmRlc2NyID0gIldoZXJlIHRvIHBlcmZvcm0gdGhlIEFQSSBjYXB0dXJlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvY2F0aW9uIiwgLmRlc2NyID0gIldoZXJlIHRvIHBlcmZvcm0gdGhlIEFQSSBjYXB0dXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnLCBsb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIH0sIHsgLm5hbWUgPSAiYnVmZmVyX3NpemVfYnl0ZXMiLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY2FwdHVyZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZywgYnVmZmVyX3NpemVfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyX21vZGUiLCAuZGVzY3IgPSAiV2hhdCB0byBkbyB3aGVuIHRoZSBjYXB0dXJlIGJ1ZmZlciBpcyBmdWxsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnLCBidWZmZXJfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gZm9yIEFQSSBjYXB0dXJlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJidWZmZXJfdXNlZF9ieXRlcyIsIC5kZXNjciA9ICJVc2VkIHNwYWNlIGluIHRoZSBjYXB0dXJlIGJ1ZmZlciAoaW4gYnl0ZXMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMsIGJ1ZmZlcl91c2VkX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImJ1ZmZlcl93cmFwX2NvdW50IiwgLmRlc2NyID0gIk51bWJlciBvZiB0aW1lcyB0aGUgY2FwdHVyZSBidWZmZXIgaGFzIHdyYXBwZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgYnVmZmVyX3dyYXBfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZXZlbnRzX3JlY29yZGVkIiwgLmRlc2NyID0gIk51bWJlciBvZiBldmVudHMgcmVjb3JkZWQgaW4gdGhlIGNhcHR1cmUgYnVmZmVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMsIGV2ZW50c19yZWNvcmRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJldmVudHNfZHJvcHBlZCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgZXZlbnRzIGRyb3BwZWQgZHVlIHRvIG92ZXJmbG93LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMsIGV2ZW50c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJlYWRhYmxlX2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmV0cmlldmUgY2FwdHVyZSBidWZmZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgcmVhZGFibGVfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgPSB7IC5uYW1lID0gImJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyIsIC5kZXNjciA9ICJTdGF0aXN0aWNzIG9uIHRoZSBtb3N0IHJlY2VudCBBUEkgY2FwdHVyZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYm91bmRzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJlc3RfY2FzZSIsIC5kZXNjciA9ICJCZXN0IENhc2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2JvdW5kcywgYmVzdF9jYXNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIndvcnN0X2Nhc2UiLCAuZGVzY3IgPSAiV29yc3QgQ2FzZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYm91bmRzLCB3b3JzdF9jYXNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2JvdW5kcyIsIC5kZXNjciA9ICJCb3VuZHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYm91bmRzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ib3VuZHNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ib3VuZHNfYXJyXzggPSB7IC5uYW1lID0gImJjbW9sdF9ib3VuZHNbOF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgOCBlbGVtZW50cyBvZiB0eXBlIGJjbW9sdF9ib3VuZHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYm91bmRzWzhdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ib3VuZHMsIC5zaXplID0gOCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl9ib3VuZHNfOCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYm91bmRzX2Fycl84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2JvdW5kc184ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX2JvdW5kc184IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA4eCBib3VuZHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX2JvdW5kc184KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfYm91bmRzXzhfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidW5zcGVjaWZpZWQiLCAudmFsID0gQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9VTlNQRUNJRklFRCB9LCB7IC5uYW1lID0gInVuY2FsaWJyYXRlZCIsIC52YWwgPSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOQ0FMSUJSQVRFRCB9LCB7IC5uYW1lID0gImxvb3NlIiwgLnZhbCA9IEJDTU9MVF9DQUxJQlJBVElPTl9SRUNPUkRfTE9PU0UgfSwgeyAubmFtZSA9ICJzdWZmaWNpZW50IiwgLnZhbCA9IEJDTU9MVF9DQUxJQlJBVElPTl9SRUNPUkRfU1VGRklDSUVOVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCIsIC5kZXNjciA9ICJDYWxpYnJhdGlvbiBSZWNvcmQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfYXJyXzggPSB7IC5uYW1lID0gImJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRbOF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgOCBlbGVtZW50cyBvZiB0eXBlIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkWzhdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQsIC5zaXplID0gOCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX2Fycl84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA4eCBjYWxpYnJhdGlvbl9yZWNvcmQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zaWduX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvc2l0aXZlIiwgLnZhbCA9IEJDTU9MVF9TSUdOX1BPU0lUSVZFIH0sIHsgLm5hbWUgPSAibmVnYXRpdmUiLCAudmFsID0gQkNNT0xUX1NJR05fTkVHQVRJVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zaWduID0geyAubmFtZSA9ICJiY21vbHRfc2lnbiIsIC5kZXNjciA9ICJzaWduIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NpZ24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc2lnbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzaWduIiwgLmRlc2NyID0gInNpZ24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQsIHNpZ24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zaWduIH0sIHsgLm5hbWUgPSAidmFsdWUiLCAuZGVzY3IgPSAidmFsdWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQsIHZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQiLCAuZGVzY3IgPSAiRFMgZnJlcXVlbmN5IG9mZnNldCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmF0ZV8yX3BfNV9nIiwgLnZhbCA9IEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMl9QXzVfRyB9LCB7IC5uYW1lID0gInJhdGVfMTBfZyIsIC52YWwgPSBCQ01PTFRfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFU19SQVRFXzEwX0cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzID0geyAubmFtZSA9ICJiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyIsIC5kZXNjciA9ICJYR1BPTiBuaSB1cHN0cmVhbSBsaW5lIHJhdGUgY2FwYWJpbGl0aWVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW5rX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidW5zcGVjaWZpZWQiLCAudmFsID0gQkNNT0xUX0xJTktfVFlQRV9VTlNQRUNJRklFRCB9LCB7IC5uYW1lID0gImIiLCAudmFsID0gQkNNT0xUX0xJTktfVFlQRV9CIH0sIHsgLm5hbWUgPSAiYSIsIC52YWwgPSBCQ01PTFRfTElOS19UWVBFX0EgfSwgeyAubmFtZSA9ICJhX2FuZF9iIiwgLnZhbCA9IEJDTU9MVF9MSU5LX1RZUEVfQV9BTkRfQiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xpbmtfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xpbmtfdHlwZSIsIC5kZXNjciA9ICJMaW5rIHR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbGlua190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xpbmtfdHlwZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9wcm9maWxlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInZlcnNpb24iLCAuZGVzY3IgPSAiQ2hhbm5lbCBwcm9maWxlIHZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImNoYW5uZWxfaW5kZXgiLCAuZGVzY3IgPSAiQ2hhbm5lbCBwcm9maWxlIGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIGNoYW5uZWxfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkc19mcmVxdWVuY3lfb2Zmc2V0IiwgLmRlc2NyID0gIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFjdHVhbCBPTFQgQ1QgVHggZnJlcXVlbmN5IGFuZCB0aGUgbm9taW5hbCBjZW50cmFsIGZyZXF1ZW5jeSBmb3IgdGhlIGdpdmVuIERXTENIIElELCBleHByZXNzZWQgaW4gdW5pdHMgb2YgMC4xR0h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIGRzX2ZyZXF1ZW5jeV9vZmZzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0IH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9wYXJ0aXRpb24iLCAuZGVzY3IgPSAiQ2hhbm5lbCBwYXJ0aXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgY2hhbm5lbF9wYXJ0aXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ1d2xjaF9pZCIsIC5kZXNjciA9ICJUaGUgYXNzaWduZWQgdXBzdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIHV3bGNoX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidXNfZnJlcXVlbmN5IiwgLmRlc2NyID0gIlRoZSBub21pbmFsIGNlbnRyYWwgZnJlcXVlbmN5IG9mIHRoZSB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgb3IgYSByb290IGZyZXF1ZW5jeSBvZiB0aGUgY3ljbGljIHNldCBvZiBjZW50cmFsIGZyZXF1ZW5jaWVzIGZvcm1pbmcgYW4gdXBzdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsLCBpbmRpY2F0ZXMgdGhlIHZhbHVlIGluIHVuaXRzIG9mIDAuMSBHSHouIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIHVzX2ZyZXF1ZW5jeSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ1c19yYXRlIiwgLmRlc2NyID0gIlVTIHJhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgdXNfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgfSwgeyAubmFtZSA9ICJkZWZhdWx0X29udV9hdHRlbnVhdGlvbiIsIC5kZXNjciA9ICJUaGUgZGVmYXVsdCBPTlUgYXR0ZW51YXRpb24gbGV2ZWwgaW4gc3RlcHMgb2YgM2RCIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIGRlZmF1bHRfb251X2F0dGVudWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmVzcG9uc2VfdGhyZXNob2xkIiwgLmRlc2NyID0gIlRocmVzaG9sZCByZXByZXNlbnQgdGhlIG1heGltdW0gbnVtYmVyIG9mIFBsb2FtcyB0aGUgT05VIGNhbiB0cmFuc21pdCBhdCBub24temVybyBhdHRlbnVhdGlvbiBsZXZlbCB3aGlsZSBhdHRlbXB0aW5nIHRvIGVzdGFibGlzaCBjb21tdW5pY2F0aW9uIHdpdGggT0xUIENUIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIHJlc3BvbnNlX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInVzX2xpbmtfdHlwZSIsIC5kZXNjciA9ICJVUyBsaW5rIHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgdXNfbGlua190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGlua190eXBlIH0sIHsgLm5hbWUgPSAiaXNfdmFsaWQiLCAuZGVzY3IgPSAiaXMgdmFsaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgaXNfdmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGUgPSB7IC5uYW1lID0gImJjbW9sdF9jaGFubmVsX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ2hhbm5lbCBQcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9wcm9maWxlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9wcm9maWxlX2Fycl84ID0geyAubmFtZSA9ICJiY21vbHRfY2hhbm5lbF9wcm9maWxlWzhdIiwgLmRlc2NyID0gIkFycmF5IG9mIDggZWxlbWVudHMgb2YgdHlwZSBiY21vbHRfY2hhbm5lbF9wcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZVs4XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9wcm9maWxlLCAuc2l6ZSA9IDggfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzgsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV9hcnJfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogOHggY2hhbm5lbF9wcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCIsIC5kZXNjciA9ICJEb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQsIGRzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCIsIC5kZXNjciA9ICJVcHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0LCB1c193YXZlbGVuZ3RoX2NoYW5uZWxfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwb3dlcl9jb25zdW1wdGlvbiIsIC5kZXNjciA9ICJQb3dlciBjb25zdW1wdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQsIHBvd2VyX2NvbnN1bXB0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0ID0geyAubmFtZSA9ICJiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQiLCAuZGVzY3IgPSAiUG93ZXIgY29uc3VtcHRpb24gcmVwb3J0IHBlciBjaGFubmVsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfYXJyXzggPSB7IC5uYW1lID0gImJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydFs4XSIsIC5kZXNjciA9ICJBcnJheSBvZiA4IGVsZW1lbnRzIG9mIHR5cGUgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0WzhdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCwgLnNpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzhfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfYXJyXzggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA4eCBwb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDE2X3RfYXJyXzIgPSB7IC5uYW1lID0gInVpbnQxNl90WzJdIiwgLmRlc2NyID0gIkFycmF5IG9mIDIgZWxlbWVudHMgb2YgdHlwZSB1aW50MTZfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQxNl90WzJdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90LCAuc2l6ZSA9IDIgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfdTE2XzIsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfYXJyXzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzIgPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfdTE2XzIiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDJ4IFUxNiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfdTE2XzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDE2X3RfYXJyXzJfaGV4ID0geyAubmFtZSA9ICJ1aW50MTZfdFsyXSIsIC5kZXNjciA9ICJBcnJheSBvZiAyIGVsZW1lbnRzIG9mIHR5cGUgdWludDE2X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50MTZfdFsyXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXgsIC5zaXplID0gMiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXhfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfdTE2XzJfaGV4LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl8yX2hleCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXggPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfdTE2XzJfaGV4IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAyeCBVMTYiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3UxNl8yX2hleCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzJfaGV4X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXhfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl81X2hleCA9IHsgLm5hbWUgPSAidWludDE2X3RbNV0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNSBlbGVtZW50cyBvZiB0eXBlIHVpbnQxNl90IiwgLnNpemUgPSBzaXplb2YodWludDE2X3RbNV0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4LCAuc2l6ZSA9IDUgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3UxNl81X2hleCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfNV9oZXggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3UxNl81X2hleCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNXggVTE2IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91MTZfNV9oZXgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl81X2hleF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfNyA9IHsgLm5hbWUgPSAidWludDE2X3RbN10iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNyBlbGVtZW50cyBvZiB0eXBlIHVpbnQxNl90IiwgLnNpemUgPSBzaXplb2YodWludDE2X3RbN10pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5zaXplID0gNyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfN19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91MTZfNywgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfNyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91MTZfNyIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogN3ggVTE2IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91MTZfNyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MzJfdF9hcnJfNiA9IHsgLm5hbWUgPSAidWludDMyX3RbNl0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNiBlbGVtZW50cyBvZiB0eXBlIHVpbnQzMl90IiwgLnNpemUgPSBzaXplb2YodWludDMyX3RbNl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QsIC5zaXplID0gNiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MzJfNl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91MzJfNiwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9hcnJfNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MzJfNiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91MzJfNiIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNnggVTMyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91MzJfNiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTMyXzZfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UzMl82X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8xMCA9IHsgLm5hbWUgPSAidWludDhfdFsxMF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMTAgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFsxMF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSAxMCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91OF8xMCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl8xMCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91OF8xMCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogMTB4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF8xMCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8xMiA9IHsgLm5hbWUgPSAidWludDhfdFsxMl0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMTIgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFsxMl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSAxMiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91OF8xMiwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl8xMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91OF8xMiIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogMTJ4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF8xMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8xMyA9IHsgLm5hbWUgPSAidWludDhfdFsxM10iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMTMgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFsxM10pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSAxMyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xM19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91OF8xMywgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl8xMyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91OF8xMyIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogMTN4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF8xMyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8zNiA9IHsgLm5hbWUgPSAidWludDhfdFszNl0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMzYgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFszNl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSAzNiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91OF8zNiwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl8zNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91OF8zNiIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogMzZ4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF8zNiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMzZfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl80ID0geyAubmFtZSA9ICJ1aW50OF90WzRdIiwgLmRlc2NyID0gIkFycmF5IG9mIDQgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFs0XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDQgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91OF80LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91OF80IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA0eCBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfdThfNCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9hcnJfNDAgPSB7IC5uYW1lID0gInVpbnQ4X3RbNDBdIiwgLmRlc2NyID0gIkFycmF5IG9mIDQwIGVsZW1lbnRzIG9mIHR5cGUgdWludDhfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQ4X3RbNDBdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5zaXplID0gNDAgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfdThfNDAsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfNDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDAgPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfdThfNDAiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDQweCBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfdThfNDApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQwX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInByb2ZpbGVfdmVyc2lvbiIsIC5kZXNjciA9ICJwcm9maWxlIHZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIHByb2ZpbGVfdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9oZXggfSwgeyAubmFtZSA9ICJpc19mZWNfb24iLCAuZGVzY3IgPSAiaXMgZmVjIG9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBpc19mZWNfb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyIsIC5kZXNjciA9ICJkZWxpbWl0ZXIgc2l6ZSBpbiBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkZWxpbWl0ZXJfcGF0dGVybl9oaWdoIiwgLmRlc2NyID0gImRlbGltaXRlciBwYXR0ZXJuIGhpZ2giLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIGRlbGltaXRlcl9wYXR0ZXJuX2hpZ2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gImRlbGltaXRlcl9wYXR0ZXJuX2xvdyIsIC5kZXNjciA9ICJkZWxpbWl0ZXIgcGF0dGVybiBsb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIGRlbGltaXRlcl9wYXR0ZXJuX2xvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAicHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIiwgLmRlc2NyID0gInByZWFtYmxlIGxlbmd0aCBpbiBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgcHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicHJlYW1ibGVfcmVwZWF0c19jb3VudCIsIC5kZXNjciA9ICJwcmVhbWJsZSByZXBlYXRzIGNvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwcmVhbWJsZV9yZXBlYXRzX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicHJlYW1ibGVfcGF0dGVybl9oaWdoIiwgLmRlc2NyID0gInByZWFtYmxlIHBhdHRlcm4gaGlnaCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgcHJlYW1ibGVfcGF0dGVybl9oaWdoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJwcmVhbWJsZV9wYXR0ZXJuX2xvdyIsIC5kZXNjciA9ICJwcmVhbWJsZSBwYXR0ZXJuIGxvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgcHJlYW1ibGVfcGF0dGVybl9sb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gInBvbl90YWciLCAuZGVzY3IgPSAiUE9OIHRhZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgcG9uX3RhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJudW1fb2ZfZ3VhcmRfYnl0ZXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGd1YXJkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBudW1fb2ZfZ3VhcmRfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiaXNfcHJvZmlsZV92YWxpZCIsIC5kZXNjciA9ICJpcyBwcm9maWxlIHZhbGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBpc19wcm9maWxlX3ZhbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyIsIC5kZXNjciA9ICJCdXJzdCBvdmVyaGVhZCBzaXplIGluIDQtYnl0ZSB3b3JkcyAod29yZCBzaXplIGlzIDQgYnl0ZXMgcmVnYXJkbGVzcyBvZiB1cHN0cmVhbSBkYXRhIHJhdGUpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSIsIC5kZXNjciA9ICJYR1BPTiBidXJzdCBwcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV9hcnJfNCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVbNF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNCBlbGVtZW50cyBvZiB0eXBlIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVbNF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIC5zaXplID0gNCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX2Fycl80IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDR4IHhncG9uX2J1cnN0X3Byb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBhdHRlcm4gZmlyc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCB0cnhfcmVzZXRfcGF0dGVybl9maXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIiwgLmRlc2NyID0gInRyeCByZXNldCBwYXR0ZXJuIG1pZGRsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIHRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIsIC5kZXNjciA9ICJ0cnggcmVzZXQgcGF0dGVybiBsYXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgdHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50IiwgLmRlc2NyID0gInRyeCByZXNldCBtaWRkbGUgcmVwZWF0cyBjb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIHRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInRyeF9yZXNldF9sb2NhdGlvbiIsIC5kZXNjciA9ICJ0cnggcmVzZXQgbG9jYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCB0cnhfcmVzZXRfbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X3BvbGFyaXR5IiwgLmRlc2NyID0gInRyeCByZXNldCBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIHRyeF9yZXNldF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBhdHRlcm4gZmlyc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCBiY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiLCAuZGVzY3IgPSAiYmNkciByZXNldCBwYXR0ZXJuIG1pZGRsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIGJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfcGF0dGVybl9sYXN0IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcGF0dGVybiBsYXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiLCAuZGVzY3IgPSAiYmNkciByZXNldCBtaWRkbGUgcmVwZWF0cyBjb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIGJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X2xvY2F0aW9uIiwgLmRlc2NyID0gImJjZHIgcmVzZXQgbG9jYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCBiY2RyX3Jlc2V0X2xvY2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wb2xhcml0eSIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgYmNkcl9yZXNldF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiWEdQT04gVFJYIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9hcnJfNCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uWzRdIiwgLmRlc2NyID0gIkFycmF5IG9mIDQgZWxlbWVudHMgb2YgdHlwZSBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25bNF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCAuc2l6ZSA9IDQgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9hcnJfNCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDR4IHhncG9uX3RyeF9jb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvcyIsIC5kZXNjciA9ICJBdXRvIGRlYWN0aXZhdGUgT05VIGR1ZSB0byBMT1MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBsb3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm1zIiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIE9OVSBhbGFybXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBvbnVfYWxhcm1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJBdXRvIGRlYWN0aXZhdGUgT05VIGR1ZSB0byBUSVdpIGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFja190aW1lb3V0IiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIEFjayB0aW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgYWNrX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gU0ZpIGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgc2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibG9raSIsIC5kZXNjciA9ICJBdXRvIGRlYWN0aXZhdGUgT05VIGR1ZSB0byBMb2tpIGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgbG9raSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAuZGVzY3IgPSAiQXV0b21hdGljIE9OVSBkZWFjdGl2YXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2xfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhcnRfcGF0dGVybiIsIC5kZXNjciA9ICJzdGFydCBwYXR0ZXJuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yZXN5bmNfY29udHJvbCwgc3RhcnRfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1pZGRsZV9wYXR0ZXJuIiwgLmRlc2NyID0gIm1pZGRsZSBwYXR0ZXJuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yZXN5bmNfY29udHJvbCwgbWlkZGxlX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsYXN0X3BhdHRlcm4iLCAuZGVzY3IgPSAibGFzdCBwYXR0ZXJuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yZXN5bmNfY29udHJvbCwgbGFzdF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlkZGxlX3JlcGV0aXRpb24iLCAuZGVzY3IgPSAibWlkZGxlIHJlcGV0aXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBtaWRkbGVfcmVwZXRpdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxvY2F0aW9uIiwgLmRlc2NyID0gImxvY2F0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yZXN5bmNfY29udHJvbCwgbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gIlRSWCBSZXN5bmMgcGF0dGVybiBjb250cm9sIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Jlc3luY19jb250cm9sKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN5bmNfY29udHJvbCIsIC5kZXNjciA9ICJyZXN5bmMgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uLCByZXN5bmNfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19yZXN5bmNfY29udHJvbCIsIC5kZXNjciA9ICJyYW5naW5nIHJlc3luYyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24sIHJhbmdpbmdfcmVzeW5jX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJCQ0RSIHJlc3luYyBwYXR0ZXJuIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInVzX2Jlcl9pbnRlcnZhbCIsIC5kZXNjciA9ICJJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgZm9yIHVwc3RyZWFtIEJFUiBtb25pdG9yaW5nICgwID0gZGlzYWJsZWQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zLCB1c19iZXJfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic2ZfdGhyZXNob2xkIiwgLmRlc2NyID0gIlNpZ25hbCBmYWlsIGFsYXJtIGlzIHJhaXNlZCB3aGVuIEJFUiByYWlzZXMgdG8gMTBeLXgsIHdoZXJlIHggaXMgdGhpcyBudW1iZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMsIHNmX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInNkX3RocmVzaG9sZCIsIC5kZXNjciA9ICJTaWduYWwgZGVncmFkZSBhbGFybSBpcyByYWlzZWQgd2hlbiBCRVIgcmFpc2VzIHRvIDEwXi14LCB3aGVyZSB4IGlzIHRoaXMgbnVtYmVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zLCBzZF90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgPSB7IC5uYW1lID0gImJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMiLCAuZGVzY3IgPSAiQkVSIG1vbml0b3JpbmcgcGFyYW1ldGVycyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncG9uX2JjZHJfcmVzZXQiLCAudmFsID0gQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX0JDRFJfUkVTRVQgfSwgeyAubmFtZSA9ICJncG9uX3RyeF9lZCIsIC52YWwgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fVFJYX0VEIH0sIHsgLm5hbWUgPSAiZ3Bvbl9yc3NpIiwgLnZhbCA9IEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9SU1NJIH0sIHsgLm5hbWUgPSAiZ3Bvbl9lb2IiLCAudmFsID0gQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX0VPQiB9LCB7IC5uYW1lID0gInNlcmRlc19idXJzdF9lbiIsIC52YWwgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX1NFUkRFU19CVVJTVF9FTiB9LCB7IC5uYW1lID0gInNlcmRlc19yeF9sb2NrIiwgLnZhbCA9IEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfU0VSREVTX1JYX0xPQ0sgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgPSB7IC5uYW1lID0gImJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwiLCAuZGVzY3IgPSAiY2FwdHVyZSBzdHJvYmUgc2lnbmFsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWxfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFfNyIsIC5kZXNjciA9ICJDQkEgbWF4aW11bSBhbGxvY2F0aW9uIHNpemUgZm9yIGZyYW1lIGdhcCA3IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCBtYV83KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1hXzMiLCAuZGVzY3IgPSAiQ0JBIG1heGltdW0gYWxsb2NhdGlvbiBzaXplIGZvciBmcmFtZSBnYXAgMyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgbWFfMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtYV8xIiwgLmRlc2NyID0gIkNCQSBtYXhpbXVtIGFsbG9jYXRpb24gc2l6ZSBmb3IgZnJhbWUgZ2FwIDEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIG1hXzEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIFJUIEFsbG9jYXRpb24gcHJvZmlsZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9wZXJhdGlvbl9jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9PUEVSQVRJT05fQ09OVFJPTCB9LCB7IC5uYW1lID0gInRvbCIsIC52YWwgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfVE9MIH0sIHsgLm5hbWUgPSAic3lzdGVtX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFIH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2NoYW5uZWxfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGNoYW5uZWxfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jaGFubmVsX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9jaGFubmVsX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jaGFubmVsX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfY2hhbm5lbF9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgY2hhbm5lbF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfQ09OU09MRV9SRURJUkVDVElPTl9OT05FIH0sIHsgLm5hbWUgPSAicmVkaXJlY3QiLCAudmFsID0gQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fUkVESVJFQ1QgfSwgeyAubmFtZSA9ICJjbG9uZSIsIC52YWwgPSBCQ01PTFRfQ09OU09MRV9SRURJUkVDVElPTl9DTE9ORSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24gPSB7IC5uYW1lID0gImJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIiwgLmRlc2NyID0gIkNvbnNvbGUgUmVkaXJlY3Rpb24gVHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY29udHJvbF9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlIiwgLnZhbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEUgfSwgeyAubmFtZSA9ICJlbmFibGUiLCAudmFsID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2NvbnRyb2xfc3RhdGUiLCAuZGVzY3IgPSAiY29udHJvbCBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jb250cm9sX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NvbnRyb2xfc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGJhX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9ybWFsIiwgLnZhbCA9IEJDTU9MVF9EQkFfTU9ERV9OT1JNQUwgfSwgeyAubmFtZSA9ICJleHRlbmRlZCIsIC52YWwgPSBCQ01PTFRfREJBX01PREVfRVhURU5ERUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RiYV9tb2RlIiwgLmRlc2NyID0gImRiYSBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RiYV9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RiYV9tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RiYV9yYW1fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fMCIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8wIH0sIHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fMSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8xIH0sIHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fMiIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8yIH0sIHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fMyIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8zIH0sIHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fNCIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV80IH0sIHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fNSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV81IH0sIHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fNiIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV82IH0sIHsgLm5hbWUgPSAiZ3JhbnRfZmlmb19yYW1fNyIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV83IH0sIHsgLm5hbWUgPSAiZ3JhbnRzX291dF9yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fR1JBTlRTX09VVF9SQU0gfSwgeyAubmFtZSA9ICJncmFudHNfaW5fcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UU19JTl9SQU0gfSwgeyAubmFtZSA9ICJncmFudHNfcmV0aXJlZF9yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fR1JBTlRTX1JFVElSRURfUkFNIH0sIHsgLm5hbWUgPSAicmVwb3J0X3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9SRVBPUlRfUkFNIH0sIHsgLm5hbWUgPSAiZ3JhbnRfY2ZnX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVF9DRkdfUkFNIH0sIHsgLm5hbWUgPSAiZGVmYXVsdF90b2tlbnNfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0RFRkFVTFRfVE9LRU5TX1JBTSB9LCB7IC5uYW1lID0gInBvbGxfcmVjb3Jkc19yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fUE9MTF9SRUNPUkRTX1JBTSB9LCB7IC5uYW1lID0gImhlaXJfcG9sbF9yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fSEVJUl9QT0xMX1JBTSB9LCB7IC5uYW1lID0gImxhc3RfcG9sbF90aW1lX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9MQVNUX1BPTExfVElNRV9SQU0gfSwgeyAubmFtZSA9ICJwb2xsX29yZGVyX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9QT0xMX09SREVSX1JBTSB9LCB7IC5uYW1lID0gInRkbV9yYW1fMCIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzAgfSwgeyAubmFtZSA9ICJ0ZG1fcmFtXzEiLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fVERNX1JBTV8xIH0sIHsgLm5hbWUgPSAidGRtX3JhbV8yIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMiB9LCB7IC5uYW1lID0gInRkbV9yYW1fMyIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzMgfSwgeyAubmFtZSA9ICJ0ZG1fcmFtXzQiLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fVERNX1JBTV80IH0sIHsgLm5hbWUgPSAidGRtX3JhbV81IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNSB9LCB7IC5uYW1lID0gInRkbV9yYW1fNiIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzYgfSwgeyAubmFtZSA9ICJ0ZG1fcmFtXzciLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fVERNX1JBTV83IH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGJhX3JhbSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RiYV9yYW0iLCAuZGVzY3IgPSAiREJBIFJBTSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kYmFfcmFtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RiYV9yYW1fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGJhX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJuYWwiLCAudmFsID0gQkNNT0xUX0RCQV9UWVBFX0lOVEVSTkFMIH0sIHsgLm5hbWUgPSAicGFydGlhbF9leHRlcm5hbCIsIC52YWwgPSBCQ01PTFRfREJBX1RZUEVfUEFSVElBTF9FWFRFUk5BTCB9LCB7IC5uYW1lID0gImV4dGVybmFsIiwgLnZhbCA9IEJDTU9MVF9EQkFfVFlQRV9FWFRFUk5BTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RiYV90eXBlID0geyAubmFtZSA9ICJiY21vbHRfZGJhX3R5cGUiLCAuZGVzY3IgPSAiREJBIHR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGJhX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGJhX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImNvbm5lY3Rpb25fZmFpbGVkIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfQ09OTkVDVElPTl9GQUlMRUQgfSwgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfVElNRU9VVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyIsIC5kZXNjciA9ICJERFIgVGVzdCBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJwaHlfaW5pdF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1BIWV9JTklUX0VSUk9SIH0sIHsgLm5hbWUgPSAiZHJhbV9pbml0X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfRFJBTV9JTklUX0VSUk9SIH0sIHsgLm5hbWUgPSAic2htb29fZXJyb3IiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9TSE1PT19FUlJPUiB9LCB7IC5uYW1lID0gImVkaXNfdGVzdF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0VESVNfVEVTVF9FUlJPUiB9LCB7IC5uYW1lID0gIm1lbV90ZXN0X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTUVNX1RFU1RfRVJST1IgfSwgeyAubmFtZSA9ICJub3RfdGVzdGVkIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTk9UX1RFU1RFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCIsIC5kZXNjciA9ICJERFIgVGVzdCBSZXN1bHQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGRyX3Rlc3RfcmVzdWx0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidGltZW91dCIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJrZWVwYWxpdmUiLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9LRUVQQUxJVkUgfSwgeyAubmFtZSA9ICJ1c2VyX2NhbGxiYWNrX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUiB9LCB7IC5uYW1lID0gInNvZnR3YXJlX3ZlcnNpb25fbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TT0ZUV0FSRV9WRVJTSU9OX01JU01BVENIIH0sIHsgLm5hbWUgPSAic3lzdGVtX21vZGVfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9NSVNNQVRDSCB9LCB7IC5uYW1lID0gIm5uaV9zcGVlZF9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05OSV9TUEVFRF9NSVNNQVRDSCB9LCB7IC5uYW1lID0gInJlY29ubmVjdF90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fUkVDT05ORUNUX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJpbnRlcm5hbF9lcnJvciIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SIH0sIHsgLm5hbWUgPSAic3lzdGVtX21vZGVfbm90X3N1cHBvcnRlZCIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX05PVF9TVVBQT1JURUQgfSwgeyAubmFtZSA9ICJwYXJhbWV0ZXIiLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9QQVJBTUVURVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiUmVhc29ucyB3aHkgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGhlIGRldmljZSBmYWlsZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJPdXRjb21lIG9mIHRoZSBERFIgdGVzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2NvbXBsZXRlZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjcHVfcmVzdWx0IiwgLmRlc2NyID0gIkNQVSBSZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCkgLSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5jcHVfcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfcmVzdWx0IH0sIHsgLm5hbWUgPSAicmFzXzBfcmVzdWx0IiwgLmRlc2NyID0gIlJBUyAwIFJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5yYXNfMF9yZXN1bHQpIC0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCB9LCB7IC5uYW1lID0gInJhc18xX3Jlc3VsdCIsIC5kZXNjciA9ICJSQVMgMSBSZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb21wbGV0ZWQucmFzXzFfcmVzdWx0KSAtIG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHUuY29tcGxldGVkLmNwdV9yZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkID0geyAubmFtZSA9ICJiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJERFIgVGVzdCBDb21wbGV0ZWQgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICopMCktPnUuY29tcGxldGVkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb21wbGV0ZWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2NvbXBsZXRlZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29ubmVjdGlvbl9mYWlsZWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIkNvbm5lY3Rpb24gZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb25uZWN0aW9uX2ZhaWxlZC5yZWFzb24pIC0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb25uZWN0aW9uX2ZhaWxlZC5yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29ubmVjdGlvbl9mYWlsZWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29ubmVjdGlvbl9mYWlsZWQiLCAuZGVzY3IgPSAiRERSIFRlc3QgQ29tcGxldGVkIENvbm5lY3Rpb24gRmFpbGVkIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICopMCktPnUuY29ubmVjdGlvbl9mYWlsZWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2Nvbm5lY3Rpb25fZmFpbGVkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfdW5pb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidS5jb21wbGV0ZWQiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHUuY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2NvbXBsZXRlZCB9LCB7IC5uYW1lID0gInUuY29ubmVjdGlvbl9mYWlsZWQiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHUuY29ubmVjdGlvbl9mYWlsZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29ubmVjdGlvbl9mYWlsZWQgfSwgeyB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkID0geyAubmFtZSA9ICJiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkIiwgLmRlc2NyID0gIlJlc3VsdHMgb2YgdGhlIEREUiB0ZXN0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9maWVsZHMsIC5jbGFzc2lmaWVyX2lkeCA9IDAsIC51bmlvbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfdW5pb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGlvbiIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9ERUFDVElWQVRJT04gfSwgeyAubmFtZSA9ICJhY2tfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9BQ0tfVElNRU9VVCB9LCB7IC5uYW1lID0gInNmaSIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9TRkkgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1RJV0kgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbiIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTiB9LCB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9PTlVfQUxBUk0gfSwgeyAubmFtZSA9ICJsb3MiLCAudmFsID0gQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTE9TIH0sIHsgLm5hbWUgPSAibG9raSIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9MT0tJIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1JFUkFOR0VfRkFJTFVSRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIiwgLmRlc2NyID0gImRlYWN0aXZhdGlvbiByZWFzb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNsaV9vdXRwdXQiLCAudmFsID0gQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQgfSwgeyAubmFtZSA9ICJmaWxlX2FsbW9zdF9mdWxsIiwgLnZhbCA9IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnNvbGVfcmVkaXJlY3Rpb24iLCAudmFsID0gQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OIH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQgfSwgeyAubmFtZSA9ICJmaWxlX3VzZWRfcGVyY2VudCIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0ZJTEVfVVNFRF9QRVJDRU5UIH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfY2ZnIiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHIH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfc3RhdHMiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9TVEFUUyB9LCB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9idWZmZXIiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkYXRhIiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfREFUQSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19jbGlfaW5wdXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkYXRhIiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DTElfT1VUUFVUX0lEX0RBVEEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19jbGlfb3V0cHV0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaG9zdF9kbWFfcnhfcXVldWVfc2l6ZSIsIC5kZXNjciA9ICJSWCBRdWV1ZSBzaXplIG9mIHRoZSBob3N0IERNQSAgICAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcsIGhvc3RfZG1hX3J4X3F1ZXVlX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSIsIC5kZXNjciA9ICJUWCBRdWV1ZSBzaXplIG9mIHRoZSBob3N0IERNQSAgICAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcsIGhvc3RfZG1hX3R4X3F1ZXVlX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYXZzX2NvbnRyb2wiLCAuZGVzY3IgPSAiQVZTIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcsIGF2c19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSIsIC5kZXNjciA9ICJUaGlzIGlzIGEgZmFsbGJhY2sgb3B0aW9uIGlmIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCB0aGUgbmV3IGZpcm13YXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnLCB1c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSIsIC5kZXNjciA9ICJUaGlzIGlzIGEgZmFsbGJhY2sgb3B0aW9uIGlmIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCB0aGUgbmV3IGZpcm13YXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnLCB1c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZyA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2RldmljZV9jZmciLCAuZGVzY3IgPSAiRGVidWcgcGFyYW1ldGVycyBmb3IgZGV2aWNlIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfZGV2aWNlX2NmZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2ZpbGVfYWxtb3N0X2Z1bGwgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAudmFsID0gQkNNT0xUX0RFQlVHX0tFWV9JRF9SRVNFUlZFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19zdGFydF9hcGlfY2FwdHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19zdG9wX2FwaV9jYXB0dXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbm5lY3Rpb25fY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAiY29ubmVjdGlvbl9lc3RhYmxpc2hlZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQgfSwgeyAubmFtZSA9ICJjb25uZWN0aW9uX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJkZHJfdGVzdF9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0REUl9URVNUX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAiZGV2aWNlX2tlZXBfYWxpdmUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfS0VFUF9BTElWRSB9LCB7IC5uYW1lID0gImRldmljZV9yZWFkeSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSB9LCB7IC5uYW1lID0gImRpc2Nvbm5lY3Rpb25fY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAiaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURSB9LCB7IC5uYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAic3dfZXJyb3IiLCAudmFsID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FUlJPUiB9LCB7IC5uYW1lID0gInN3X2V4Y2VwdGlvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VYQ0VQVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9TWVNURU1fTU9ERSB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZV9pbnRlcnZhbCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwgfSwgeyAubmFtZSA9ICJrZWVwYWxpdmVfdG9sZXJhbmNlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UgfSwgeyAubmFtZSA9ICJmaXJtd2FyZV9zd192ZXJzaW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04gfSwgeyAubmFtZSA9ICJob3N0X3N3X3ZlcnNpb24iLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OIH0sIHsgLm5hbWUgPSAiY2hpcF9yZXZpc2lvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OIH0sIHsgLm5hbWUgPSAic3RhdGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUgfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRyB9LCB7IC5uYW1lID0gIm5uaV9zcGVlZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9OTklfU1BFRUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEgfSwgeyAubmFtZSA9ICJlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZIH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbl9zaGFwaW5nIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORyB9LCB7IC5uYW1lID0gImNoaXBfdGVtcGVyYXR1cmUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9URU1QRVJBVFVSRSB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX2VuYWJsZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUgfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9HUElPX1BJTiB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZIH0sIHsgLm5hbWUgPSAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl84MDIxX0FTX1RPRF9GT1JNQVQgfSwgeyAubmFtZSA9ICJlcG9uX3NoYXBlcl9tb2RlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fU0hBUEVSX01PREUgfSwgeyAubmFtZSA9ICJlbWJlZGRlZF9pbWFnZV9saXN0IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QgfSwgeyAubmFtZSA9ICJjaGlwX3ZvbHRhZ2UiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFIH0sIHsgLm5hbWUgPSAiZXBvbl90b2Rfc3RyaW5nIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORyB9LCB7IC5uYW1lID0gInhncG9uX251bV9vZl9vbnVzIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTIH0sIHsgLm5hbWUgPSAiZGV2aWNlX2lwX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MgfSwgeyAubmFtZSA9ICJkZXZpY2VfdWRwX3BvcnQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUIH0sIHsgLm5hbWUgPSAidG9kX3VhcnRfYmF1ZHJhdGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUgfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYTAiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DSElQX1JFVklTSU9OX0EwIH0sIHsgLm5hbWUgPSAiYjAiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DSElQX1JFVklTSU9OX0IwIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiIsIC5kZXNjciA9ICJSZXZpc2lvbiBvZiB0aGUgQkNNNjg2MjAgZGV2aWNlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGFuZGFsb25lIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9TVEFOREFMT05FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZWFzb24iLCAudmFsID0gQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZHJfdGVzdCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX0REUl9URVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9kZHJfdGVzdF9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VxdWVuY2VfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfU0VRVUVOQ0VfTlVNQkVSIH0sIHsgLm5hbWUgPSAidGltZV9zdGFtcCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmlybXdhcmVfc3dfdmVyc2lvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9GSVJNV0FSRV9TV19WRVJTSU9OIH0sIHsgLm5hbWUgPSAic3lzdGVtX21vZGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUgfSwgeyAubmFtZSA9ICJubmlfc3BlZWQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfTk5JX1NQRUVEIH0sIHsgLm5hbWUgPSAiY2hpcF9yZXZpc2lvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9DSElQX1JFVklTSU9OIH0sIHsgLm5hbWUgPSAidG9kX2VuYWJsZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFIH0sIHsgLm5hbWUgPSAidG9kX2dwaW9fcGluIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9HUElPX1BJTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9kZXZpY2VfcmVhZHkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9kaXNjb25uZWN0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcXVlbmNlX251bWJlciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIgfSwgeyAubmFtZSA9ICJ0aW1lX3N0YW1wIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfaG9zdF9rZWVwX2FsaXZlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFIH0sIHsgLm5hbWUgPSAiYmxvY2tfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSIH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUiB9LCB7IC5uYW1lID0gIm1vcmVfZGF0YSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfTU9SRV9EQVRBIH0sIHsgLm5hbWUgPSAiZGF0YSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGEgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbWFnZV90eXBlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSB9LCB7IC5uYW1lID0gImltYWdlX3NpemUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9TSVpFIH0sIHsgLm5hbWUgPSAiY3JjMzIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMiB9LCB7IC5uYW1lID0gImltYWdlX25hbWUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJib290bG9hZGVyIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9CT09UTE9BREVSIH0sIHsgLm5hbWUgPSAiYXBwbGljYXRpb24iLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OIH0sIHsgLm5hbWUgPSAiaXR1X3Bvbl9vbnVfZmlybXdhcmUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0lUVV9QT05fT05VX0ZJUk1XQVJFIH0sIHsgLm5hbWUgPSAiZXBvbl9vbnVfZmlybXdhcmUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0VQT05fT05VX0ZJUk1XQVJFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSIsIC5kZXNjciA9ICJEZXZpY2UgSW1hZ2UgVHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0b3RhbF9jb3VudCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfVE9UQUxfQ09VTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfS0VZX0lEX1JFU0VSVkVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zcGVlZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJnYnBzXzEiLCAudmFsID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEgfSwgeyAubmFtZSA9ICJnYnBzXzJwNSIsIC52YWwgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMlA1IH0sIHsgLm5hbWUgPSAiZ2Jwc18xMCIsIC52YWwgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTAgfSwgeyAubmFtZSA9ICJnYnBzXzEycDUiLCAudmFsID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEyUDUgfSwgeyAubmFtZSA9ICJnYnBzXzEwX2dfbXV4IiwgLnZhbCA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xMF9HX01VWCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zcGVlZCA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zcGVlZCIsIC5kZXNjciA9ICJOZXR3b3JrIGludGVyZmFjZSBzcGVlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3BlZWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3NwZWVkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZpcnN0X2hhbGYiLCAuZGVzY3IgPSAiSW50ZXJmYWNlIHNwZWVkIGZvciB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgTk5JIHBvcnRzIG9uIHRoZSBzeXN0ZW0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkLCBmaXJzdF9oYWxmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NwZWVkIH0sIHsgLm5hbWUgPSAic2Vjb25kX2hhbGYiLCAuZGVzY3IgPSAiSW50ZXJmYWNlIHNwZWVkIGZvciB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIE5OSSBwb3J0cyBvbiB0aGUgc3lzdGVtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX25uaV9zcGVlZCwgc2Vjb25kX2hhbGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3BlZWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX25uaV9zcGVlZCIsIC5kZXNjciA9ICJEZXZpY2UgTk5JIFNwZWVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ubmlfc3BlZWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX25uaV9zcGVlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1vZGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9SRVNFVF9JRF9NT0RFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3Jlc2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9yZXNldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9yZXNldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZXZpY2UiLCAudmFsID0gQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0RFVklDRSB9LCB7IC5uYW1lID0gImhvc3QiLCAudmFsID0gQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0hPU1QgfSwgeyAubmFtZSA9ICJhbGwiLCAudmFsID0gQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0FMTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3Jlc2V0X21vZGUiLCAuZGVzY3IgPSAiT3B0aW9ucyBmb3IgdGhlIHJlc2V0IG9wZXJhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3Jlc2V0X21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3Jlc2V0X21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjcHUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfQ1BVIH0sIHsgLm5hbWUgPSAicmFzXzAiLCAudmFsID0gQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzAgfSwgeyAubmFtZSA9ICJyYXNfMSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9ydW5fZGRyX3Rlc3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlzY29ubmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEIH0sIHsgLm5hbWUgPSAiY29ubmVjdGluZyIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkcgfSwgeyAubmFtZSA9ICJyZWFkeSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZIH0sIHsgLm5hbWUgPSAid2FpdGluZ19mb3JfZGV2aWNlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfV0FJVElOR19GT1JfREVWSUNFIH0sIHsgLm5hbWUgPSAidGVzdGluZ19kZHIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TVEFURV9URVNUSU5HX0REUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgb3ZlcmFsbCBzdGF0ZSBvZiB0aGUgaG9zdCdzIGNvbm5lY3Rpb24gdG8gdGhlIGRldmljZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidGFza19uYW1lIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfVEFTS19OQU1FIH0sIHsgLm5hbWUgPSAiZmlsZV9uYW1lIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FIH0sIHsgLm5hbWUgPSAibGluZV9udW1iZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9MSU5FX05VTUJFUiB9LCB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfc3dfZXJyb3IgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjcHVfaWQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfQ1BVX0lEIH0sIHsgLm5hbWUgPSAidGV4dCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9URVhUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3N3X2V4Y2VwdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVuaWNhc3RfZGlzYWJsZSIsIC52YWwgPSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9ESVNBQkxFIH0sIHsgLm5hbWUgPSAidW5pY2FzdF9lbmFibGUiLCAudmFsID0gQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX1VOSUNBU1RfRU5BQkxFIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2VuYWJsZSIsIC52YWwgPSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfQlJPQURDQVNUX0VOQUJMRSB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9kaXNhYmxlIiwgLnZhbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRElTQUJMRSB9LCB7IC5uYW1lID0gImRpc2FibGVfZGlzY292ZXJ5IiwgLnZhbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9ESVNBQkxFX0RJU0NPVkVSWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wiLCAuZGVzY3IgPSAiRGlzYWJsZSBTZXJpYWwgTnVtYmVyIENvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2xfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZHJ2X2ljZl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpZHgwIiwgLnZhbCA9IEJDTU9MVF9EUlZfSUNGX0lEX0lEWDAgfSwgeyAubmFtZSA9ICJpZHgxIiwgLnZhbCA9IEJDTU9MVF9EUlZfSUNGX0lEX0lEWDEgfSwgeyAubmFtZSA9ICJpZHgyIiwgLnZhbCA9IEJDTU9MVF9EUlZfSUNGX0lEX0lEWDIgfSwgeyAubmFtZSA9ICJpZHgzIiwgLnZhbCA9IEJDTU9MVF9EUlZfSUNGX0lEX0lEWDMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kcnZfaWNmX2lkID0geyAubmFtZSA9ICJiY21vbHRfZHJ2X2ljZl9pZCIsIC5kZXNjciA9ICJkcnZfaWNmX2lkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Rydl9pY2ZfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZHJ2X2ljZl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kcnZfc2diX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImlkeDAiLCAudmFsID0gQkNNT0xUX0RSVl9TR0JfSURfSURYMCB9LCB7IC5uYW1lID0gImlkeDEiLCAudmFsID0gQkNNT0xUX0RSVl9TR0JfSURfSURYMSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rydl9zZ2JfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kcnZfc2diX2lkIiwgLmRlc2NyID0gImRydl9zZ2JfaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZHJ2X3NnYl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kcnZfc2diX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RzX3ZsYW5fYWN0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlbW92ZSIsIC52YWwgPSBCQ01PTFRfRFNfVkxBTl9BQ1RJT05fUkVNT1ZFIH0sIHsgLm5hbWUgPSAidHJhbnNwYXJlbnQiLCAudmFsID0gQkNNT0xUX0RTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHNfdmxhbl9hY3Rpb24gPSB7IC5uYW1lID0gImJjbW9sdF9kc192bGFuX2FjdGlvbiIsIC5kZXNjciA9ICJEUyBWTEFOIGFjdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kc192bGFuX2FjdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kc192bGFuX2FjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90ZmJfdHJhcF9iZWhhdmlvcl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkcm9wIiwgLnZhbCA9IEJDTU9MVF9URkJfVFJBUF9CRUhBVklPUl9EUk9QIH0sIHsgLm5hbWUgPSAiZm9yd2FyZF9ubmkiLCAudmFsID0gQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0ZPUldBUkRfTk5JIH0sIHsgLm5hbWUgPSAiZm9yd2FyZF9jcHUiLCAudmFsID0gQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0ZPUldBUkRfQ1BVIH0sIHsgLm5hbWUgPSAic25vb3AiLCAudmFsID0gQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX1NOT09QIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IgPSB7IC5uYW1lID0gImJjbW9sdF90ZmJfdHJhcF9iZWhhdmlvciIsIC5kZXNjciA9ICJURkIgVHJhcCBCZWhhdmlvciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90ZmJfdHJhcF9iZWhhdmlvciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90ZmJfdHJhcF9iZWhhdmlvcl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90ZmJfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncG9uIiwgLnZhbCA9IEJDTU9MVF9URkJfTU9ERV9HUE9OIH0sIHsgLm5hbWUgPSAieGdwb24iLCAudmFsID0gQkNNT0xUX1RGQl9NT0RFX1hHUE9OIH0sIHsgLm5hbWUgPSAiZXBvbiIsIC52YWwgPSBCQ01PTFRfVEZCX01PREVfRVBPTiB9LCB7IC5uYW1lID0gInhlcG9uIiwgLnZhbCA9IEJDTU9MVF9URkJfTU9ERV9YRVBPTiB9LCB7IC5uYW1lID0gImNvZXgiLCAudmFsID0gQkNNT0xUX1RGQl9NT0RFX0NPRVggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90ZmJfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RmYl9tb2RlIiwgLmRlc2NyID0gIlRGQiBNb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RmYl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RmYl9tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xpbV9zZWNfbW9kZV91cF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0ZWsiLCAudmFsID0gQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9URUsgfSwgeyAubmFtZSA9ICJwZXJfbGxpZCIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1BFUl9MTElEIH0sIHsgLm5hbWUgPSAibnR0IiwgLnZhbCA9IEJDTU9MVF9MSU1fU0VDX01PREVfVVBfTlRUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGltX3NlY19tb2RlX3VwID0geyAubmFtZSA9ICJiY21vbHRfbGltX3NlY19tb2RlX3VwIiwgLmRlc2NyID0gIkxJTSBTRUMgTW9kZSBVcCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9saW1fc2VjX21vZGVfdXApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbGltX3NlY19tb2RlX3VwX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xpbV9zZWNfbW9kZV9kbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0ZWsiLCAudmFsID0gQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9URUsgfSwgeyAubmFtZSA9ICJwZXJfbGxpZCIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1BFUl9MTElEIH0sIHsgLm5hbWUgPSAibnR0IiwgLnZhbCA9IEJDTU9MVF9MSU1fU0VDX01PREVfRE5fTlRUIH0sIHsgLm5hbWUgPSAiY2Vwb24iLCAudmFsID0gQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9DRVBPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xpbV9zZWNfbW9kZV9kbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2xpbV9zZWNfbW9kZV9kbiIsIC5kZXNjciA9ICJMSU0gU0VDIE1vZGUgRG4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbGltX3NlY19tb2RlX2RuKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xpbV9zZWNfbW9kZV9kbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94aW1fc2VjX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWRfMCIsIC52YWwgPSBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzAgfSwgeyAubmFtZSA9ICJwZXJfbGxpZCIsIC52YWwgPSBCQ01PTFRfWElNX1NFQ19NT0RFX1BFUl9MTElEIH0sIHsgLm5hbWUgPSAicmVzZXJ2ZWRfMiIsIC52YWwgPSBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzIgfSwgeyAubmFtZSA9ICJjZXBvbiIsIC52YWwgPSBCQ01PTFRfWElNX1NFQ19NT0RFX0NFUE9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGltX3NlY19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfeGltX3NlY19tb2RlIiwgLmRlc2NyID0gIlhJTSBTRUMgTW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94aW1fc2VjX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGltX3NlY19tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2hzY19yYW1fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGxjX3QxIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0xMQ19UMSB9LCB7IC5uYW1lID0gImxsY190MiIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9MTENfVDIgfSwgeyAubmFtZSA9ICJsbGNfdDMiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fTExDX1QzIH0sIHsgLm5hbWUgPSAiZ3JwX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0dSUF9UMiB9LCB7IC5uYW1lID0gImdycF90MyIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9HUlBfVDMgfSwgeyAubmFtZSA9ICJzaHBfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fU0hQX1QxIH0sIHsgLm5hbWUgPSAic2hwX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1NIUF9UMiB9LCB7IC5uYW1lID0gInNocF90MyIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9TSFBfVDMgfSwgeyAubmFtZSA9ICJwcmZfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fUFJGX1QxIH0sIHsgLm5hbWUgPSAicHJmX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1BSRl9UMiB9LCB7IC5uYW1lID0gInByZl90MyIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9QUkZfVDMgfSwgeyAubmFtZSA9ICJjcmVfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fQ1JFX1QxIH0sIHsgLm5hbWUgPSAiY3JlX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0NSRV9UMiB9LCB7IC5uYW1lID0gImNyZV90MyIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9DUkVfVDMgfSwgeyAubmFtZSA9ICJlbHUiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fRUxVIH0sIHsgLm5hbWUgPSAicHRyX3QxIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1BUUl9UMSB9LCB7IC5uYW1lID0gInB0cl90MiIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9QVFJfVDIgfSwgeyAubmFtZSA9ICJhZ3Jfc2hwX3QxIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0FHUl9TSFBfVDEgfSwgeyAubmFtZSA9ICJhZW0iLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fQUVNIH0sIHsgLm5hbWUgPSAiYWxsX2xsYyIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9BTExfTExDIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaHNjX3JhbSA9IHsgLm5hbWUgPSAiYmNtb2x0X2hzY19yYW0iLCAuZGVzY3IgPSAiSFNDIFJBTSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9oc2NfcmFtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2hzY19yYW1fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsbGlkX3VwIiwgLnZhbCA9IEJDTU9MVF9MSU1fUkFNX0xMSURfVVAgfSwgeyAubmFtZSA9ICJwZXJfb251X3N0YXQiLCAudmFsID0gQkNNT0xUX0xJTV9SQU1fUEVSX09OVV9TVEFUIH0sIHsgLm5hbWUgPSAiZmVjX3VwX2Z1bGxfcyIsIC52YWwgPSBCQ01PTFRfTElNX1JBTV9GRUNfVVBfRlVMTF9TIH0sIHsgLm5hbWUgPSAiZmVjX3VwX2RhdGEiLCAudmFsID0gQkNNT0xUX0xJTV9SQU1fRkVDX1VQX0RBVEEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9saW1fcmFtID0geyAubmFtZSA9ICJiY21vbHRfbGltX3JhbSIsIC5kZXNjciA9ICJMSU0gUkFNIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xpbV9yYW0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbGltX3JhbV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sa3lfcmFtX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInR4X2tleV9yYW0iLCAudmFsID0gQkNNT0xUX0xLWV9SQU1fVFhfS0VZX1JBTSB9LCB7IC5uYW1lID0gInR4X2tleV9idWZmZXIiLCAudmFsID0gQkNNT0xUX0xLWV9SQU1fVFhfS0VZX0JVRkZFUiB9LCB7IC5uYW1lID0gInJ4X2tleV9yYW0iLCAudmFsID0gQkNNT0xUX0xLWV9SQU1fUlhfS0VZX1JBTSB9LCB7IC5uYW1lID0gInJ4X2tleV9idWZmZXIiLCAudmFsID0gQkNNT0xUX0xLWV9SQU1fUlhfS0VZX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xreV9yYW0gPSB7IC5uYW1lID0gImJjbW9sdF9sa3lfcmFtIiwgLmRlc2NyID0gIkxLWSBSQU0iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbGt5X3JhbSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sa3lfcmFtX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21pY19yYW1fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmFuZ2UiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fUkFOR0UgfSwgeyAubmFtZSA9ICJsbGlkIiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX0xMSUQgfSwgeyAubmFtZSA9ICJpbmRleCIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9JRFggfSwgeyAubmFtZSA9ICJncmFudF9taXNzIiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX0dSQU5UX01JU1MgfSwgeyAubmFtZSA9ICJncmFudF9pZCIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9HUkFOVF9JRCB9LCB7IC5uYW1lID0gInR4X2l2IiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX1RYX0lWIH0sIHsgLm5hbWUgPSAicnhfaXYiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fUlhfSVYgfSwgeyAubmFtZSA9ICJ0eF9wb3J0X3N0YXQiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fVFhfUE9SVF9TVEFUIH0sIHsgLm5hbWUgPSAicnhfcG9ydF9zdGF0IiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX1JYX1BPUlRfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21pY19yYW0gPSB7IC5uYW1lID0gImJjbW9sdF9taWNfcmFtIiwgLmRlc2NyID0gIk1JQyBSQU0iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWljX3JhbSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9taWNfcmFtX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hwY3NybV9yYW1fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2FwdHVyZV9maWZvIiwgLnZhbCA9IEJDTU9MVF9YUENTUk1fUkFNX0NBUFRVUkVfRklGTyB9LCB7IC5uYW1lID0gImZlY19kZWNvZGUiLCAudmFsID0gQkNNT0xUX1hQQ1NSTV9SQU1fRkVDX0RFQ09ERSB9LCB7IC5uYW1lID0gImZlY19zdGF0cyIsIC52YWwgPSBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfU1RBVFMgfSwgeyAubmFtZSA9ICJmZWNfZW5xdWV1ZSIsIC52YWwgPSBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfRU5RVUVVRSB9LCB7IC5uYW1lID0gImlkbGVfaW5zZXJ0IiwgLnZhbCA9IEJDTU9MVF9YUENTUk1fUkFNX0lETEVfSU5TRVJUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeHBjc3JtX3JhbSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hwY3NybV9yYW0iLCAuZGVzY3IgPSAiWFBDU1JNIFJBTSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94cGNzcm1fcmFtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hwY3NybV9yYW1fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWQiLCAuZGVzY3IgPSAiYWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZXQiLCAuZGVzY3IgPSAiZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZWxnIiwgLmRlc2NyID0gImVsZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgZWxnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZGJhX3BvcnQiLCAuZGVzY3IgPSAiZGJhIHBvcnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGRiYV9wb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAic2diIiwgLmRlc2NyID0gInNnYiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgc2diKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZHJ2X3NnYl9pZCB9LCB7IC5uYW1lID0gImljZiIsIC5kZXNjciA9ICJpY2YiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGljZiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rydl9pY2ZfaWQgfSwgeyAubmFtZSA9ICJ0ZmJfdHJhcF9iZWhhdmlvciIsIC5kZXNjciA9ICJ0ZmIgdHJhcCBiZWhhdmlvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgdGZiX3RyYXBfYmVoYXZpb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90ZmJfdHJhcF9iZWhhdmlvciB9LCB7IC5uYW1lID0gInRmYl9tb2RlIiwgLmRlc2NyID0gInRmYiBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB0ZmJfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RmYl9tb2RlIH0sIHsgLm5hbWUgPSAibGltX3NlY19tb2RlX3VwIiwgLmRlc2NyID0gImxpbSBzZWMgbW9kZSB1cCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgbGltX3NlY19tb2RlX3VwKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGltX3NlY19tb2RlX3VwIH0sIHsgLm5hbWUgPSAibGltX3NlY19tb2RlX2RuIiwgLmRlc2NyID0gImxpbSBzZWMgbW9kZSBkbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgbGltX3NlY19tb2RlX2RuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGltX3NlY19tb2RlX2RuIH0sIHsgLm5hbWUgPSAieGltX3NlY19tb2RlIiwgLmRlc2NyID0gInhpbSBzZWMgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgeGltX3NlY19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGltX3NlY19tb2RlIH0sIHsgLm5hbWUgPSAiZGJhX3JhbSIsIC5kZXNjciA9ICJkYmEgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBkYmFfcmFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGJhX3JhbSB9LCB7IC5uYW1lID0gImhzY19yYW0iLCAuZGVzY3IgPSAiaHNjIHJhbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgaHNjX3JhbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2hzY19yYW0gfSwgeyAubmFtZSA9ICJsaW1fcmFtIiwgLmRlc2NyID0gImxpbSByYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGxpbV9yYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9saW1fcmFtIH0sIHsgLm5hbWUgPSAibGt5X3JhbSIsIC5kZXNjciA9ICJsa3kgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBsa3lfcmFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGt5X3JhbSB9LCB7IC5uYW1lID0gIm1pY19yYW0iLCAuZGVzY3IgPSAibWljIHJhbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgbWljX3JhbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21pY19yYW0gfSwgeyAubmFtZSA9ICJ4cGNzX3JhbSIsIC5kZXNjciA9ICJ4cGNzIHJhbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgeHBjc19yYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94cGNzcm1fcmFtIH0sIHsgLm5hbWUgPSAieGcyZ19pZCIsIC5kZXNjciA9ICJ4ZzJnIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB4ZzJnX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMiLCAuZGVzY3IgPSAiRHVtbXkgU3RydWN0IEZvciBFbWJlZGRlZCBUeXBlcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfTk9ORSB9LCB7IC5uYW1lID0gImluX3Byb2dyZXNzIiwgLnZhbCA9IEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5fUFJPR1JFU1MgfSwgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUyB9LCB7IC5uYW1lID0gImZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19GQUlMVVJFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIiwgLmRlc2NyID0gImVtYmVkZGVkIGltYWdlIHRyYW5zZmVyIHN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHN0cmluZ182NCA9IHsgLm5hbWUgPSAic3RyaW5nWzY0XSIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDY0IiwgLnNpemUgPSBzaXplb2YoY2hhcls2NF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJJTkcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAuZGVzY3IgPSAiVHlwZSBvZiB0aGUgZW1iZWRkZWQgZmlsZSBpbWFnZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCBpbWFnZV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgfSwgeyAubmFtZSA9ICJpbWFnZV9zaXplIiwgLmRlc2NyID0gIlNpemUgb2YgdGhlIGVtYmVkZGVkIGZpbGUgaW1hZ2UuICBVbml0IGlzIGJ5dGVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnksIGltYWdlX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY3JjMzIiLCAuZGVzY3IgPSAiQ1JDIDMyIGNoZWNrc3VtIG9mIGVudGlyZSBmaWxlIGltYWdlIGRhdGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSwgY3JjMzIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJJbWFnZSB0cmFuc2ZlciBzdGF0dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIH0sIHsgLm5hbWUgPSAiaW1hZ2VfbmFtZSIsIC5kZXNjciA9ICJOYW1lIG9mIHRoZSBmaWxlIGltYWdlLiAgTnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBEUG9FIE9OVSBvbmx5LiAgRFBvRSByZXF1aXJlcyB0aGUgd3JpdGUgcmVxdWVzdCBPQU0gY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSwgaW1hZ2VfbmFtZSksIC50eXBlID0gJnN0cmluZ182NCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ID0geyAubmFtZSA9ICJiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkiLCAuZGVzY3IgPSAiRW1iZWRkZWQgaW1hZ2UgZW50cnkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ID0geyAubmFtZSA9ICJiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBlbWJlZGRlZF9pbWFnZV9lbnRyeSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCAubGVuX3NpemUgPSAxLCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5KSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmIiLCAudmFsID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCIH0sIHsgLm5hbWUgPSAiY3RyIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0IiwgLmRlc2NyID0gIkVQT04gRW5jcnlwdGlvbiBpbmZvcm1hdGlvbiBmb3JtYXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmb3JtYXQiLCAuZGVzY3IgPSAiRm9ybWF0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgZm9ybWF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jZmJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5IiwgLmRlc2NyID0gIktleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY2ZiLmtleSkgLSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY2ZiLmtleSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfMTYgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jZmIgPSB7IC5uYW1lID0gImJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jZmIiLCAuZGVzY3IgPSAiRW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgQ0ZCIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgKikwKS0+dS5jZmIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY2ZiX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2NmYl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9hcnJfOCA9IHsgLm5hbWUgPSAidWludDhfdFs4XSIsIC5kZXNjciA9ICJBcnJheSBvZiA4IGVsZW1lbnRzIG9mIHR5cGUgdWludDhfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQ4X3RbOF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY3RyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImtleSIsIC5kZXNjciA9ICJLZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyLCB1LmN0ci5rZXkpIC0gb2Zmc2V0b2YoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyLCB1LmN0ci5rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzE2IH0sIHsgLm5hbWUgPSAic2NpIiwgLmRlc2NyID0gIlNDSSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY3RyLnNjaSkgLSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY3RyLmtleSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2N0ciA9IHsgLm5hbWUgPSAiYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2N0ciIsIC5kZXNjciA9ICJFbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBDVFIiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqKTApLT51LmN0ciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jdHJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY3RyX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3VuaW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInUuY2ZiIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY2ZiKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY2ZiIH0sIHsgLm5hbWUgPSAidS5jdHIiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jdHIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jdHIgfSwgeyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyID0geyAubmFtZSA9ICJiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIiLCAuZGVzY3IgPSAiRW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTiwgLnggPSB7IC51ID0geyAubnVtX2NvbW1vbl9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3VuaW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2Vfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJuYWwiLCAudmFsID0gQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX0lOVEVSTkFMIH0sIHsgLm5hbWUgPSAidHJ4IiwgLnZhbCA9IEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9UUlggfSwgeyAubmFtZSA9ICJiY2RyIiwgLnZhbCA9IEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9CQ0RSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2UgPSB7IC5uYW1lID0gImJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSIsIC5kZXNjciA9ICJlbmVyZ3kgZGV0ZWN0IHNvdXJjZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlzYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fMUdfVFVSQk9fTU9ERV9ESVNBQkxFRCB9LCB7IC5uYW1lID0gImVuYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fMUdfVFVSQk9fTU9ERV9FTkFCTEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl8xZ190dXJib19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl8xZ190dXJib19tb2RlIiwgLmRlc2NyID0gIkVQT04gdHVyYm8gbW9kZS4gIEVuYWJsZXMgZG91YmxlIGRvd25zdHJlYW0gc3BlZWQgKDJHKSBvbiAxRyBFUE9OIE5JcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl8xZ190dXJib19tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaG9zdF9kcml2ZW4iLCAudmFsID0gQkNNT0xUX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX01PREVfSE9TVF9EUklWRU4gfSwgeyAubmFtZSA9ICJlbWJlZGRlZF9kcml2ZW4iLCAudmFsID0gQkNNT0xUX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX01PREVfRU1CRURERURfRFJJVkVOIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUiLCAuZGVzY3IgPSAiRVBPTiBDbG9jayBUcmFuc3BvcnQgTW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSIsIC5kZXNjciA9ICJDbG9jayBUcmFuc3BvcnQgbW9kZSBvbiB0aGlzIE9MVCBQT04gUG9ydC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24sIGVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiRVBPTiBjbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNpZXBvbl9hIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9TSUVQT05fQSB9LCB7IC5uYW1lID0gInNpZXBvbl9iIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9TSUVQT05fQiB9LCB7IC5uYW1lID0gInNpZXBvbl9jIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9TSUVQT05fQyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUiLCAuZGVzY3IgPSAiQ29udHJvbCBmb3IgaG93IHRoZSBEQkEgaGFuZGxlcyByZWNlaXZlZCBNUENQIHJlcG9ydCBmcmFtZXMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19yYXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRlbl90ZW4iLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU4gfSwgeyAubmFtZSA9ICJ0ZW5fb25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fT05FIH0sIHsgLm5hbWUgPSAib25lX29uZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfT05FX09ORSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3JhdGUiLCAuZGVzY3IgPSAiRVBPTiBsaW5rIHJhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3JhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3RhdHVzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9mZiIsIC52YWwgPSBCQ01PTFRfU1RBVFVTX09GRiB9LCB7IC5uYW1lID0gIm9uIiwgLnZhbCA9IEJDTU9MVF9TVEFUVVNfT04gfSwgeyAubmFtZSA9ICJub19jaGFuZ2UiLCAudmFsID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0UgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zdGF0dXNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlua19yYXRlIiwgLmRlc2NyID0gIlRoZSByYXRlIG9mIHRoZSB1bmtub3duIGxpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMsIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIldoZXRoZXIgdGhlIHVua25vd24gbGluayBhbGFybSBpcyByYWlzZWQgb3IgY2xlYXJlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIiwgLmRlc2NyID0gIkRhdGEgb2YgdW5rbm93biBsaW5rLCBpbmNsdWRpbmcgcmF0ZSBhbmQgYWxhcm0gc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGFzZXJfb25fdGltZSIsIC5kZXNjciA9ICJUaGUgbGFzZXIgb24gdGltZSBvZiB0aGUgT05VIHRoYXQgaXMgdmlvbGF0aW5nLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cywgbGFzZXJfb25fdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJsYXNlcl9vZmZfdGltZSIsIC5kZXNjciA9ICJUaGUgbGFzZXIgb2ZmIHRpbWUgb2YgdGhlIE9OVSB0aGF0IGlzIHZpb2xhdGluZy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMsIGxhc2VyX29mZl90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJXaGV0aGVyIHRoZSBsYXNlciBvbi9vZmYgdmlvbGF0aW9uIGFsYXJtIGlzIHJhaXNlZCBvciBjbGVhcmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cywgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMiLCAuZGVzY3IgPSAiRGF0YSBvZiBsYXNlciBvbi9vZmYgdmlvbGF0aW5nIGxpbmssIGluY2x1ZGluZyBhdHRlbXB0ZWQgbGFzZXIgb24gdGltZSwgYXR0ZW1wdGVkIGxhc2VyIG9mZiB0aW1lLCBhbmQgYWxhcm0gc3RhdHVzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5nZV9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmFuZ2UiLCAuZGVzY3IgPSAiVGhlIHJhbmdlIHRoYXQgdGhlIHZpb2xhdGluZyBsaW5rIGF0dGVtcHRlZCB0byByZWdpc3RlciBhdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdlX3N0YXR1cywgcmFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIldoZXRoZXIgdGhlIHJhbmdlIHZpb2xhdGlvbiBhbGFybSBpcyByYWlzZWQgb3IgY2xlYXJlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdlX3N0YXR1cywgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2Vfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfcmFuZ2Vfc3RhdHVzIiwgLmRlc2NyID0gIkRhdGEgb2YgcmFuZ2UgdmlvbGF0aW5nIGxpbmssIGluY2x1ZGluZyB0aGUgcmFuZ2UgaXQgYXR0ZW1wdGVkIHRvIHVzZSwgYW5kIGFsYXJtIHN0YXR1cy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFuZ2Vfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5nZV9zdGF0dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRlbmllZF9sbGlkIiwgLmRlc2NyID0gIkxMSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX3N0YXR1cywgZGVuaWVkX2xsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZGVuaWVkX3JhbmdlIiwgLmRlc2NyID0gIk9OVSBSYW5nZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfc3RhdHVzLCBkZW5pZWRfcmFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9zdGF0dXMsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX3N0YXR1cyIsIC5kZXNjciA9ICJEZXRhaWxzIG9mIFN1c3BlY3RlZCBSb2d1ZSBPTlUgcHJvdmlkZWQgaW4gRGVuaWVkIExpbmsgQWxhcm0iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zdGF0dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIiwgLmRlc2NyID0gIlVua25vd24gTGluayBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIHVua25vd25fbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIH0sIHsgLm5hbWUgPSAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiT3ZlcmhlYWQgUHJvZmlsZSBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIG92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibWF4X2xpbmtfdmlvbGF0aW9uIiwgLmRlc2NyID0gIk1heCBMaW5rIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgbWF4X2xpbmtfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJMTElEIFBvb2wgRW1wdHkgVmlvbGF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJMYXNlciBPbi9PZmYgVmlvbGF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCBsYXNlcl9vbl9vZmZfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyB9LCB7IC5uYW1lID0gInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiU3lzdGVtIFJlc291cmNlIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInJhbmdlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJSYW5nZSBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIHJhbmdlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1cyB9LCB7IC5uYW1lID0gInRkbV9jaGFubmVsc19leGhhdXN0ZWQiLCAuZGVzY3IgPSAiVERNIENoYW5uZWxzIEV4aGF1c3RlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInJvZ3VlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJSb2d1ZSBPTlUgVmlvbGF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCByb2d1ZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zdGF0dXMgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIiwgLmRlc2NyID0gIlVwc3RyZWFtIEJhbmR3aWR0aCBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgYWxsIGFsYXJtcyBvbiBhbiBFUE9OIERlbmllZCBMaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OIH0sIHsgLm5hbWUgPSAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OIH0sIHsgLm5hbWUgPSAibWF4X2xpbmtfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gInJvZ3VlX3Zpb2xhdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9ST0dVRV9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQgfSwgeyAubmFtZSA9ICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VOS05PV05fTElOS19WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub19lbmNyeXB0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9OT19FTkNSWVBUSU9OIH0sIHsgLm5hbWUgPSAiZXBvbl90cmlwbGVfY2h1cm5pbmciLCAudmFsID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fVFJJUExFX0NIVVJOSU5HIH0sIHsgLm5hbWUgPSAiZXBvbl96ZXJvX292ZXJoZWFkX2FlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiRVBPTiBlbmNyeXB0aW9uIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImtleV8wIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzAgfSwgeyAubmFtZSA9ICJrZXlfMSIsIC52YWwgPSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8xIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfY2hvaWNlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9rZXlfY2hvaWNlIiwgLmRlc2NyID0gIkVwb24gS2V5IENob2ljZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRvd25zdHJlYW1fbW9kZSIsIC5kZXNjciA9ICJEb3duc3RyZWFtIE1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcsIGRvd25zdHJlYW1fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIH0sIHsgLm5hbWUgPSAiZG93bnN0cmVhbV9rZXlfY2hvaWNlIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gS2V5IENob2ljZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgZG93bnN0cmVhbV9rZXlfY2hvaWNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfY2hvaWNlIH0sIHsgLm5hbWUgPSAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gRW5jcnlwdGlvbiBJbmZvcm1hdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9tb2RlIiwgLmRlc2NyID0gIlVwc3RyZWFtIE1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcsIHVwc3RyZWFtX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2tleV9jaG9pY2UiLCAuZGVzY3IgPSAiVXBzdHJlYW0gS2V5IENob2ljZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgdXBzdHJlYW1fa2V5X2Nob2ljZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24iLCAuZGVzY3IgPSAiVXBzdHJlYW0gRW5jcnlwdGlvbiBJbmZvcm1hdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgdXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWciLCAuZGVzY3IgPSAiS2V5cyBhbmQgbW9kZSBmb3IgZW5jcnlwdGluZyB0aGUgRVBPTiBsb2dpY2FsIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkb3duc3RyZWFtX29ubHkiLCAudmFsID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9ESVJFQ1RJT05fRE9XTlNUUkVBTV9PTkxZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24iLCAuZGVzY3IgPSAiRVBPTiBFbmNyeXB0aW9uIERpcmVjdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlzYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRU5BQkxFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUiLCAuZGVzY3IgPSAiRVBPTiBGRUMgZW5hYmxlIHN0YXRlLiAgU2VlIGZsYWcgZGVzY3JpcHRpb25zIGZvciByZXN0cmljdGlvbnMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb2FtX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYnJvYWRjb20iLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX1RZUEVfQlJPQURDT00gfSwgeyAubmFtZSA9ICJjdGMiLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX1RZUEVfQ1RDIH0sIHsgLm5hbWUgPSAiZHBvZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9EUE9FIH0sIHsgLm5hbWUgPSAic2llcG9uYSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9TSUVQT05BIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vYW1fdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb2FtX3R5cGUiLCAuZGVzY3IgPSAiVGhlIHR5cGVzIG9mIE9BTSB0byBjaG9vc2UgZnJvbS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vYW1fdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29hbV90eXBlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2FtX3R5cGUiLCAuZGVzY3IgPSAiVGhlIHR5cGUgb2YgT0FNIHRoYXQgaXMgc2VudCB0byBzdGFydCB0aGUga2V5IGV4Y2hhbmdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnLCBvYW1fdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb2FtX3R5cGUgfSwgeyAubmFtZSA9ICJwZXJpb2QiLCAuZGVzY3IgPSAicGVyaW9kIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcsIHBlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJkaXJlY3Rpb24iLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBkaXJlY3Rpb246IERvd25zdHJlYW0gb25seSBvciBCaS1kaXJlY3Rpb25hbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZywgZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyIsIC5kZXNjciA9ICJLZXkgZXhjaGFuZ2UgY29uZmlndXJhdGlvbiB0aGF0IGFwcGxpZXMgdG8gdGhlIEVQT04gbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxhc2VyX29uX3RpbWUiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRvIGFsbG93IGZvciBPTlVzJyBsYXNlci1vbiB0cmFuc2l0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzLCBsYXNlcl9vbl90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxhc2VyX29mZl90aW1lIiwgLmRlc2NyID0gIk51bWJlciBvZiB0aW1lIHF1YW50YSB0byBhbGxvdyBmb3IgT05VcycgbGFzZXItb2ZmIHRyYW5zaXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMsIGxhc2VyX29mZl90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyIsIC5kZXNjciA9ICJFUE9OIGxhc2VyIG92ZXJoZWFkIHBhcmFtZXRlcnMuIChMYXNlciBPbiBhbmQgTGFzZXIgT2ZmIHRpbWVzKSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEZhaWx1cmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSwga2V5X2V4Y2hhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJpbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkIiwgLmRlc2NyID0gIkludmFsaWQgTVBDUCBSZXBvcnQgUmVjZWl2ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSwgaW52YWxpZF9tcGNwX3JlcG9ydF9yZWNlaXZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiLCAuZGVzY3IgPSAiTVBDUCBSZXBvcnQgVGltZW91dCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiwgLmRlc2NyID0gIk9BTSBLZWVwYWxpdmUgVGltZW91dCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlLCBvYW1fa2VlcGFsaXZlX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIG9mIGFsbCBhbGFybXMgb24gYW4gRVBPTiBMaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZV9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9lbmFibGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRSB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdGFydGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RvcHBlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEIH0sIHsgLm5hbWUgPSAibGlua19kZWxldGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVEIH0sIHsgLm5hbWUgPSAibGlua19zcGVlZF9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfU1BFRURfTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJtcGNwX2RlcmVnaXN0ZXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEIH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEIH0sIHsgLm5hbWUgPSAibXBjcF9yZWdfYWNrX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCB9LCB7IC5uYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUIH0sIHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VUIH0sIHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEIH0sIHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEIH0sIHsgLm5hbWUgPSAicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX2NoYW5nZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCB7IC5uYW1lID0gInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFIH0sIHsgLm5hbWUgPSAic3RhdGVfZmxhZ3MiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MgfSwgeyAubmFtZSA9ICJsbGlkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQgfSwgeyAubmFtZSA9ICJsYXNlcl9vbl90aW1lX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEgfSwgeyAubmFtZSA9ICJsYXNlcl9vZmZfdGltZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1JBTkdFX1ZBTFVFX1RRIH0sIHsgLm5hbWUgPSAiZGlzdGFuY2UiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRElTVEFOQ0UgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSB9LCB7IC5uYW1lID0gInR1bm5lbF9pZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAibWluX2xhc2VyX292ZXJoZWFkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jb25maWciLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRyB9LCB7IC5uYW1lID0gImVwb25fZW5jcnlwdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04gfSwgeyAubmFtZSA9ICJmZWNfZW5hYmxlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0ZFQ19FTkFCTEUgfSwgeyAubmFtZSA9ICJvYW1faGVhcnRiZWF0X2NvbmZpZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRyB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEggfSwgeyAubmFtZSA9ICJ1YmRfaW5mbyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTyB9LCB7IC5uYW1lID0gImNsb2NrX3RyYW5zcG9ydF9lbmFibGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0VOQUJMRSB9LCB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTIH0sIHsgLm5hbWUgPSAibGlua190eXBlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19kZWxldGVfbGluayBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaW5pdGlhbF9yYW5nZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0lOSVRJQUxfUkFOR0VfVFEgfSwgeyAubmFtZSA9ICJjdXJyZW50X3JhbmdlX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfQ1VSUkVOVF9SQU5HRV9UUSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9ESVNBQkxFRCB9LCB7IC5uYW1lID0gImVuYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfRU5BQkxFRCB9LCB7IC5uYW1lID0gInVzZV9kZWZhdWx0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX1VTRV9ERUZBVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUiLCAuZGVzY3IgPSAiZXBvbiBsaW5rIGZlYyBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidXBzdHJlYW0iLCAuZGVzY3IgPSAiRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mZWNfZW4sIHVwc3RyZWFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSB9LCB7IC5uYW1lID0gImRvd25zdHJlYW0iLCAuZGVzY3IgPSAiRkVDIGVuYWJsZSBzdGF0ZSBmb3IgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZlY19lbiwgZG93bnN0cmVhbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX2VuID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2ZlY19lbiIsIC5kZXNjciA9ICJEb3duc3RyZWFtIGFuZCB1cHN0cmVhbSBGRUMgZW5hYmxlIHN0YXRlIGZvciBhbiBFUE9OIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mZWNfZW4pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19lbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX2VuX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZyYW1lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRVU19OT05FIH0sIHsgLm5hbWUgPSAiZGlzY292ZXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRVU19ESVNDT1ZFUkVEIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX3ByZXZlbnRlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRVU19SRUdJU1RSQVRJT05fUFJFVkVOVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0dXMiLCAuZGVzY3IgPSAiVGhlIGN1cnJlbnQgcmVnaXN0cmF0aW9uIHN0YXR1cyBvZiBhIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm9fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19OT05FIH0sIHsgLm5hbWUgPSAib25lX2dfY2FwYWJsZSIsIC52YWwgPSBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19PTkVfR19DQVBBQkxFIH0sIHsgLm5hbWUgPSAidGVuX2dfY2FwYWJsZSIsIC52YWwgPSBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19URU5fR19DQVBBQkxFIH0sIHsgLm5hbWUgPSAib25lX2dfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX09ORV9HX1dJTkRPVyB9LCB7IC5uYW1lID0gInRlbl9nX3dpbmRvdyIsIC52YWwgPSBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19URU5fR19XSU5ET1cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvID0geyAubmFtZSA9ICJiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbyIsIC5kZXNjciA9ICJNUENQIGRpc2NvdmVyeSBpbmZvIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mb19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX3N0YXR1cyIsIC5kZXNjciA9ICJMaW5rIHN0YXR1cyBmbGFncy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmZvLCBsaW5rX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0dXMgfSwgeyAubmFtZSA9ICJyYXRlIiwgLmRlc2NyID0gIlRoZSByYXRlIGF0IHdoaWNoIHRoZSBsaW5rIG9wZXJhdGVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIHJhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9LCB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiVGhlIExMSUQgb2YgdGhlIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcnlfaW5mbyIsIC5kZXNjciA9ICJGbGFncyBmcm9tIE1QQ1AgZGlzY292ZXJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIG1wY3BfZGlzY292ZXJ5X2luZm8pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvIH0sIHsgLm5hbWUgPSAib251X2xhc2VyX29uX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXIgb24gdGltZSByZXBvcnRlZCBieSBPTlUuICBUaGlzIGlzIHNldCB0byAwIGZvciAxRy8xRyBsaW5rcyBhcyAxRyBNUENQIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBmaWVsZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmZvLCBvbnVfbGFzZXJfb25fdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJvbnVfbGFzZXJfb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXIgb2ZmIHRpbWUgcmVwb3J0ZWQgYnkgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIG9udV9sYXNlcl9vZmZfdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwZW5kaW5nX2dyYW50cyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIHBlbmRpbmdfZ3JhbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiVGhlIGxpbmsncyByYW5nZSB2YWx1ZSBpbiBUUS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmZvLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0dW5uZWxfaWQiLCAuZGVzY3IgPSAiVGhlIHR1bm5lbCBJRCB0byB1c2Ugd2hlbiBzZW5kaW5nIHRyYWZmaWMgdG8gdGhlIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgdHVubmVsX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mbyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19pbmZvIiwgLmRlc2NyID0gIkVQT04gbG9naWNhbCBsaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mb19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mb19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZnJhbWUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfaW5qZWN0X2ZyYW1lIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwZXJpb2QiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9EIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JIH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbGlua19kZWxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicHJldmlvdXNfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfUFJFVklPVVNfUkFURSB9LCB7IC5uYW1lID0gImN1cnJlbnRfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaW5rX2luZm8iLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlbmRfcGVyaW9kIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGlua19pbmZvIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9QUk9URUNUSU9OX1NUQVRVUyB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnhfZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9CWVRFUyB9LCB7IC5uYW1lID0gInJ4X2RhdGFfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gInJ4X29hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTIH0sIHsgLm5hbWUgPSAicnhfb2FtX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X21wY3BfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF91bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9tdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfcmVwb3J0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUkVQT1JUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2Zjc19lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfb3ZlcnNpemVfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09WRVJTSVpFX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfcnVudF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUlVOVF9FUlJPUiB9LCB7IC5uYW1lID0gInJ4X2xpbmVfY29kZV9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfbGluZV9jb2RlX2Vycm9yX21heCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWCB9LCB7IC5uYW1lID0gInR4X2RhdGFfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJ0eF9kYXRhX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNjQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTggfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJ0eF9vYW1fYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUyB9LCB7IC5uYW1lID0gInR4X29hbV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9tcGNwX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9icm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2dhdGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9HQVRFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVEVfRkxBR1NfTk9ORSB9LCB7IC5uYW1lID0gIm1wY3BfcmVnaXN0cmF0aW9uX2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVEVfRkxBR1NfTVBDUF9SRUdJU1RSQVRJT05fQ09NUExFVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MiLCAuZGVzY3IgPSAiRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxhc2Vyb25fdGltZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPTl9USU1FX1RRIH0sIHsgLm5hbWUgPSAibGFzZXJvZmZfdGltZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9SQU5HRV9WQUxVRV9UUSB9LCB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9QRU5ESU5HX0dSQU5UUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua190eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN5c3RlbSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfU1lTVEVNIH0sIHsgLm5hbWUgPSAiZG93bnN0cmVhbV9vbmx5IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfVFlQRV9ET1dOU1RSRUFNX09OTFkgfSwgeyAubmFtZSA9ICJiaWRpcmVjdGlvbmFsIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfVFlQRV9CSURJUkVDVElPTkFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfdHlwZSIsIC5kZXNjciA9ICJFUE9OIExpbmsgVHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tcGNwX2dhdGVfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0ZWtub3Z1cyIsIC52YWwgPSBCQ01PTFRfTVBDUF9HQVRFX01PREVfVEVLTk9WVVMgfSwgeyAubmFtZSA9ICJjdXN0b20iLCAudmFsID0gQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21wY3BfZ2F0ZV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfbXBjcF9nYXRlX21vZGUiLCAuZGVzY3IgPSAiTVBDUCBnYXRlIG1vZGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21wY3BfZ2F0ZV9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21wY3BfZ2F0ZV9tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3Nfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfTVBDUF9SRUdJU1RSQVRJT05fR0FURV9GTEFHU19OT05FIH0sIHsgLm5hbWUgPSAiZm9yY2VfcmVwb3J0IiwgLnZhbCA9IEJDTU9MVF9NUENQX1JFR0lTVFJBVElPTl9HQVRFX0ZMQUdTX0ZPUkNFX1JFUE9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MgPSB7IC5uYW1lID0gImJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzIiwgLmRlc2NyID0gIk1QQ1AgcmVnaXN0cmF0aW9uIGdhdGUgZmxhZ3MuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nYXRlX3BhcmFtZXRlcnNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmxhZ3MiLCAuZGVzY3IgPSAiRmxhZ3MgdG8gc2V0IGZvciB0aGlzIGdhdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMsIGZsYWdzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyB9LCB7IC5uYW1lID0gImRlbGF5X2JlZm9yZV9tcyIsIC5kZXNjciA9ICJEZWxheSBiZWZvcmUgc2VuZGluZyB0aGlzIGdhdGUgaW4gbWlsbGlzZWNvbmRzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzLCBkZWxheV9iZWZvcmVfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZ2F0ZV9zaXplX3RxIiwgLmRlc2NyID0gIlNpemUgb2YgdGhpcyBnYXRlIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzLCBnYXRlX3NpemVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzID0geyAubmFtZSA9ICJiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzIiwgLmRlc2NyID0gIkdhdGUgcGFyYW1ldGVycy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9nYXRlX3BhcmFtZXRlcnNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ2F0ZV9wYXJhbWV0ZXJzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nYXRlX3BhcmFtZXRlcnMsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzKSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIiwgLmRlc2NyID0gIk1QQ1AgcmVnaXN0cmF0aW9uIGdhdGUgbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21wY3BfZ2F0ZV9tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV90ZWtub3Z1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWdfYWNrX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiQW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgYSBsaW5rIHRvIHJlc3BvbmQgd2l0aCBhIHJlZ2lzdGVyIGFjayBhZnRlciBhIHJlZ2lzdGVyIGlzIHNlbnQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIHUudGVrbm92dXMucmVnX2Fja190aW1lb3V0X21zKSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIHUudGVrbm92dXMucmVnX2Fja190aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV90ZWtub3Z1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV90ZWtub3Z1cyIsIC5kZXNjciA9ICJFUE9OIHJlZ2lzdHJhdGlvbiBnYXRlIG1vZGUgVGVrbm92dXMiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKikwKS0+dS50ZWtub3Z1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfdGVrbm92dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9jdXN0b21fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ2F0ZXMiLCAuZGVzY3IgPSAiR2F0ZXMgdG8gc2VuZCBmb3IgUkVHIEFDSy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgdS5jdXN0b20uZ2F0ZXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgdS5jdXN0b20uZ2F0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfY3VzdG9tID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbSIsIC5kZXNjciA9ICJFUE9OIHJlZ2lzdHJhdGlvbiBnYXRlIG1vZGUgQ3VzdG9tIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICopMCktPnUuY3VzdG9tKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9jdXN0b21fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfdW5pb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidS50ZWtub3Z1cyIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgdS50ZWtub3Z1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV90ZWtub3Z1cyB9LCB7IC5uYW1lID0gInUuY3VzdG9tIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCB1LmN1c3RvbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9jdXN0b20gfSwgeyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSIsIC5kZXNjciA9ICJTcGVjaWZpY2F0aW9uIG9mIHRoZSBFUE9OIGdhdGUgbW9kZSBhbmQgYXNzb2NpYXRlZCBwYXJhbWV0ZXJzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTiwgLnggPSB7IC51ID0geyAubnVtX2NvbW1vbl9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmNvbW1vbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3VuaW9uX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2dhdGVfbW9kZSIsIC5kZXNjciA9ICJFUE9OIHJlZ2lzdHJhdGlvbiBnYXRlIG1vZGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCByZWdpc3RyYXRpb25fZ2F0ZV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIH0sIHsgLm5hbWUgPSAicmVwb3J0aW5nX21vZGUiLCAuZGVzY3IgPSAiQ29udHJvbCBmb3IgaG93IHRoZSBEQkEgaGFuZGxlcyByZWNlaXZlZCBNUENQIHJlcG9ydCBmcmFtZXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCByZXBvcnRpbmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlIH0sIHsgLm5hbWUgPSAibWF4X2xpbmtzIiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIGxpbmtzIHRvIHJlZ2lzdGVyIG9uIHRoZSBFUE9OIE5JLiAgQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyBubyBmaXhlZCBsaW1pdC4gVGhpcyBpcyBhbiBhZ2dyZWdhdGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBub24tc3lzdGVtIGxpbmtzIG9uIGEgUE9OLiBUaGlzIGxpbWl0IGFwcGxpZXMgdG8gYm90aCByZWdpc3RlcmVkIGFuZCBub24tcmVnaXN0ZXJlZCBsaW5rcy4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgcmVkdWNlZCBiZWxvdyB0aGUgY291bnQgb2YgbGlua3MgY3VycmVudGx5IGFsbG9jYXRlZCwgbm9yIGlzIGl0IHZhbGlkIHRvIGluY3JlYXNlIGl0IGFib3ZlIHRoZSBzdW0gb2YgdGhlIHBlciBSUCBtYWNfbGlua3MgbGltaXRzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgbWF4X2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBFUE9OIGxvZ2ljYWwgbGluayByZWdpc3RyYXRpb24gYW5kIHJlcG9ydGluZy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAicmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hZGRfbGluayBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9NQUNfQUREUkVTUyB9LCB7IC5uYW1lID0gInJhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfYWRkX211bHRpY2FzdF9saW5rIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAid29ya2luZ19saW5rX2luZm8iLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibm9fcmVwb3J0cyIsIC5kZXNjciA9ICJObyBSZXBvcnRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlLCBub19yZXBvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiVGhlIGxpc3Qgb2YgYWxhcm1zIGRlZmluZWQgZm9yIGFuIEVQT04gTkkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRSB9LCB7IC5uYW1lID0gImxsaWRfcXVhcmFudGluZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCB9LCB7IC5uYW1lID0gIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCB9LCB7IC5uYW1lID0gIm5vX3JlcG9ydHMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUyB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSB9LCB7IC5uYW1lID0gInJvZ3VlX3NjYW5fY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUk9HVUVfU0NBTl9DT01QTEVURSB9LCB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQUNfQUREUkVTUyB9LCB7IC5uYW1lID0gImVwb25fbmlfZW4iLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTklfRU4gfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUiB9LCB7IC5uYW1lID0gIm10dV8xZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHIH0sIHsgLm5hbWUgPSAibXR1XzEwZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRyB9LCB7IC5uYW1lID0gIm1pbmltdW1fZmliZXJfbGVuZ3RoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSCB9LCB7IC5uYW1lID0gIm1heGltdW1fZmliZXJfbGVuZ3RoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCB9LCB7IC5uYW1lID0gImdyYW50X3NwYWNpbmdfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0dSQU5UX1NQQUNJTkdfVFEgfSwgeyAubmFtZSA9ICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TIH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUgfSwgeyAubmFtZSA9ICJhbGxfbGlua3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUyB9LCB7IC5uYW1lID0gImVuY3J5cHRpb25fY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRyB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHIH0sIHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2NmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRyB9LCB7IC5uYW1lID0gImRyb3Bkb3duX3dlaWdodHMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMgfSwgeyAubmFtZSA9ICJhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSB9LCB7IC5uYW1lID0gImFwcHJveGltYXRlX3RkbV91c2FnZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfVERNX1VTQUdFIH0sIHsgLm5hbWUgPSAibm9fcmVwb3J0c19zb2FrX3RpbWUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX05PX1JFUE9SVFNfU09BS19USU1FIH0sIHsgLm5hbWUgPSAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSIH0sIHsgLm5hbWUgPSAiZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEgfSwgeyAubmFtZSA9ICJvbnVfdXBncmFkZV9wYXJhbXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUyB9LCB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4iLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzFHX0VOIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlzYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJlbmFibGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX0VOQUJMRUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0ZWRfd29ya2luZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9URUNURURfV09SS0lORyB9LCB7IC5uYW1lID0gInByb3RlY3RlZF9zdGFuZGJ5IiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZIH0sIHsgLm5hbWUgPSAicHJvY2Vzc2luZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9DRVNTSU5HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUiLCAuZGVzY3IgPSAiRW5hYmxlIHN0YXRlIG9mIHRoZSBFUE9OIE5JLiAgSW5pdGlhbGx5IHRoZSBvbmx5IGVuYWJsZSBzdGF0ZXMgZGVmaW5lZCBhcmUgYGRpc2FibGVkJyBhbmQgYGVuYWJsZWQnLCBidXQgdGhpcyBtYXkgbGF0ZXIgYmUgZXh0ZW5kZWQgdG8gaW5jbHVkZSBkaWZmZXJlbnQgZGVncmVlcyBvZiBlbmFibGVtZW50LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnLCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlIiwgLmRlc2NyID0gIlVwc3RyZWFtIGVuY3J5cHRpb24gbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcsIHVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBOSSBhcyBhIHdob2xlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncmFudGVkX2xpbmsiLCAudmFsID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTksgfSwgeyAubmFtZSA9ICJ0cmlnZ2VyX3dpZHRoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCB9LCB7IC5uYW1lID0gInRyaWdnZXJfZGVsYXkiLCAudmFsID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX0RFTEFZIH0sIHsgLm5hbWUgPSAic2FtcGxlX3BlcmlvZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGxpZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xMSUQgfSwgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUgfSwgeyAubmFtZSA9ICJsaW5rX21hYyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9SQU5HRV9WQUxVRV9UUSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2xsaWRfcXVhcmFudGluZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1wY3BfdGltZXN0YW1wIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfTVBDUF9USU1FU1RBTVAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfTk9fUkVQT1JUU19JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9ub19yZXBvcnRzIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXJhbmdlX2RlbHRhIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX3JlcmFuZ2VfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibW9kZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTU9ERSB9LCB7IC5uYW1lID0gImxsaWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcm9ndWVfbGxpZF9zY2FuIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmV0dXJuX2luZF9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9SRVRVUk5fSU5EX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGxpZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MTElEIH0sIHsgLm5hbWUgPSAibGlua19tYWMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTElOS19NQUMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQgfSwgeyAubmFtZSA9ICJicm9hZGNvbSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT00gfSwgeyAubmFtZSA9ICJjdGMiLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0NUQyB9LCB7IC5uYW1lID0gImRhc2FuIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EQVNBTiB9LCB7IC5uYW1lID0gImt0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9LVCB9LCB7IC5uYW1lID0gImRwb2UiLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0UgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlIiwgLmRlc2NyID0gIkVQT04gT0FNIEV4dGVuc2lvbiBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsbF9saW5rcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkkgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfdG90YWwiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMIH0sIHsgLm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMgfSwgeyAubmFtZSA9ICJmZWNfemVyb2VzX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJmZWNfb25lc19jb3JyZWN0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsbF9saW5rcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJnb29kX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMgfSwgeyAubmFtZSA9ICJvdmVyc3pfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVMgfSwgeyAubmFtZSA9ICJub25fZmVjX2dvb2RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJub25fZmVjX2dvb2RfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0JZVEVTIH0sIHsgLm5hbWUgPSAiZmVjX2dvb2RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZlY19nb29kX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0JZVEVTIH0sIHsgLm5hbWUgPSAiZmVjX2ZyYW1lc19leGNfZXJycyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfRlJBTUVTX0VYQ19FUlJTIH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3Nfbm9fZXJycyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTIH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3NfY29ycl9lcnJzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUyB9LCB7IC5uYW1lID0gImZlY19ibGtzX3VuY29ycl9lcnJzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX1VOQ09SUl9FUlJTIH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVMgfSwgeyAubmFtZSA9ICJmZWNfY29ycl96ZXJvZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfWkVST0VTIH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJfb25lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTIH0sIHsgLm5hbWUgPSAidW5kZXJzel9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVMgfSwgeyAubmFtZSA9ICJlcnJvcnN6X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9rIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX09LIH0sIHsgLm5hbWUgPSAidW5kZWZpbmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX1VOREVGSU5FRCB9LCB7IC5uYW1lID0gIm5vdF9mb3VuZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9OT1RfRk9VTkQgfSwgeyAubmFtZSA9ICJub19hY2Nlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfTk9fQUNDRVNTIH0sIHsgLm5hbWUgPSAiZnVsbCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9GVUxMIH0sIHsgLm5hbWUgPSAiaWxsZWdhbF9vcGVyYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfSUxMRUdBTF9PUEVSQVRJT04gfSwgeyAubmFtZSA9ICJ1bmtub3duX2lkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX1VOS05PV05fSUQgfSwgeyAubmFtZSA9ICJiYWRfYmxvY2siLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfQkFEX0JMT0NLIH0sIHsgLm5hbWUgPSAidGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9USU1FT1VUIH0sIHsgLm5hbWUgPSAiYnVzeSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9CVVNZIH0sIHsgLm5hbWUgPSAiaW5jb21wYXRpYmxlX2ZpbGUiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfSU5DT01QQVRJQkxFX0ZJTEUgfSwgeyAubmFtZSA9ICJjb3JydXB0ZWRfZmlsZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9DT1JSVVBURURfRklMRSB9LCB7IC5uYW1lID0gImVycm9yX25vdF9kZWZpbmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX05PVF9ERUZJTkVEIH0sIHsgLm5hbWUgPSAiZXJyb3JfYWxsb2NfZXhjZWVkZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfQUxMT0NfRVhDRUVERUQgfSwgeyAubmFtZSA9ICJlcnJvcl9pbGxlZ2FsX29wIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX0lMTEVHQUxfT1AgfSwgeyAubmFtZSA9ICJlcnJvcl9maWxlX2V4aXN0cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FUlJPUl9GSUxFX0VYSVNUUyB9LCB7IC5uYW1lID0gImVuZF93cml0aW5nX252cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfV1JJVElOR19OVlMgfSwgeyAubmFtZSA9ICJlbmRfY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VORF9DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJlbmRfcGFyYW1fZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX1BBUkFNX0VSUk9SIH0sIHsgLm5hbWUgPSAiZW5kX2NtZF91bnN1cHBvcnRlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfQ01EX1VOU1VQUE9SVEVEIH0sIHsgLm5hbWUgPSAibGFzdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9MQVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBPTlUgUmVzcG9uc2UgQ29kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9hbV9leHRlbnNpb25fdHlwZSIsIC5kZXNjciA9ICJPQU0gRXh0ZW5zaW9uIFR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCBvYW1fZXh0ZW5zaW9uX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19icm9hZGNvbV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNwb25zZV90aW1lb3V0X21zIiwgLmRlc2NyID0gIlRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5icm9hZGNvbS5yZXNwb25zZV90aW1lb3V0X21zKSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5icm9hZGNvbS5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfYnJvYWRjb20iLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBQYXJhbWV0ZXJzIEJyb2FkY29tIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKikwKS0+dS5icm9hZGNvbSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19icm9hZGNvbV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19icm9hZGNvbV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19jdGNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzcG9uc2VfdGltZW91dF9tcyIsIC5kZXNjciA9ICJUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgT0xUIHdpbGwgd2FpdCBmb3IgdGhlIE9OVSB0byByZXNwb25kLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuY3RjLnJlc3BvbnNlX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmN0Yy5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2N0YyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2N0YyIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMgQ1RDIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKikwKS0+dS5jdGMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfY3RjX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2N0Y19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kYXNhbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNwb25zZV90aW1lb3V0X21zIiwgLmRlc2NyID0gIlRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kYXNhbi5yZXNwb25zZV90aW1lb3V0X21zKSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kYXNhbi5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZGFzYW4iLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBQYXJhbWV0ZXJzIERhc2FuIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKikwKS0+dS5kYXNhbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kYXNhbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kYXNhbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19rdF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNwb25zZV90aW1lb3V0X21zIiwgLmRlc2NyID0gIlRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5rdC5yZXNwb25zZV90aW1lb3V0X21zKSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5rdC5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfa3QiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBQYXJhbWV0ZXJzIEtUIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKikwKS0+dS5rdCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19rdF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19rdF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kcG9lX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3BvbnNlX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcykgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZS5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImJsb2NrX3NpemUiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGJ5dGUgcGVyIGRhdGEgYmxvY2suIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lLmJsb2NrX3NpemUpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJmaW5hbF9hY2tfcmVzcG9uc2VfdGltZW91dCIsIC5kZXNjciA9ICJUaW1lb3V0IGZvciB0aGUgZmluYWwgQUNLIHJlc3BvbnNlLiAgVGhlIERQb0Ugc3RhbmRhcmQgMS4wIHNwZWNpZmllcyB0aGlzIHNob3VsZCBiZSBhdCBsZWFzdCAxNSBzZWNvbmRzLiAgVW5pdCBpcyBzZWNvbmRzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZS5maW5hbF9hY2tfcmVzcG9uc2VfdGltZW91dCkgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZS5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rwb2UgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kcG9lIiwgLmRlc2NyID0gIkVQT04gT05VIFVwZ3JhZGUgUGFyYW1ldGVycyBEUG9FIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKikwKS0+dS5kcG9lKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rwb2VfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZHBvZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc191bmlvbl9maWVsZHNbXSA9IHsgeyB9LCB7IC5uYW1lID0gInUuYnJvYWRjb20iLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5icm9hZGNvbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tIH0sIHsgLm5hbWUgPSAidS5jdGMiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5jdGMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19jdGMgfSwgeyAubmFtZSA9ICJ1LmRhc2FuIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZGFzYW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kYXNhbiB9LCB7IC5uYW1lID0gInUua3QiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5rdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0IH0sIHsgLm5hbWUgPSAidS5kcG9lIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rwb2UgfSwgeyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBQYXJhbWV0ZXJzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sIC54ID0geyAudSA9IHsgLm51bV9jb21tb25fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmNvbW1vbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19maWVsZHMsIC5jbGFzc2lmaWVyX2lkeCA9IDAsIC51bmlvbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc191bmlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9TVUNDRVNTIH0sIHsgLm5hbWUgPSAib251X3Jlc3BvbnNlX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX1JFU1BPTlNFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJvbnVfZXJyb3JfcmVzcG9uc2UiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX0VSUk9SX1JFU1BPTlNFIH0sIHsgLm5hbWUgPSAic3luY19lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9TWU5DX0VSUk9SIH0sIHsgLm5hbWUgPSAiY29tbWl0X2ZhaWxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9DT01NSVRfRkFJTEVEIH0sIHsgLm5hbWUgPSAiaW50ZXJuYWwiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfSU5URVJOQUwgfSwgeyAubmFtZSA9ICJwYXJzZV9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9QQVJTRV9FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIiwgLmRlc2NyID0gIkVQT04gT05VIFVwZ3JhZGUgUmV0dXJuIENvZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cywgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gImVycm9yX2NvZGUiLCAuZGVzY3IgPSAiVXBncmFkZSBzdGF0dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cywgZXJyb3JfY29kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgfSwgeyAubmFtZSA9ICJvbnVfcmV0dXJuX2NvZGUiLCAuZGVzY3IgPSAiUmVzcG9uc2UgY29kZSBmcm9tIHRoZSBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cywgb251X3JldHVybl9jb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGVwb25fb251X3VwZ3JhZGVfc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzKSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmVjX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9GRUNfU1RBVEUgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUyB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTIH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVMgfSwgeyAubmFtZSA9ICJnYXRlX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTIH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmVjX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUgfSwgeyAubmFtZSA9ICJzeW5jX3RpbWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQllURVMgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTggfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NyB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUyB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMgfSwgeyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVMgfSwgeyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJlcG9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTIH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SIH0sIHsgLm5hbWUgPSAiY3JjXzhfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUiB9LCB7IC5uYW1lID0gIm91dF9vZl9zbG90IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QgfSwgeyAubmFtZSA9ICJvdmVyc2l6ZV9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SIH0sIHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JVTlRfRVJST1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRlZmF1bHRfZmVjX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFIH0sIHsgLm5hbWUgPSAicmFtYW5fbW9kZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFIH0sIHsgLm5hbWUgPSAidHVyYm9fMmdfbW9kZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVMgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTIH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gImdhdGVfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUgfSwgeyAubmFtZSA9ICJzeW5jX3RpbWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRIH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTggfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUyB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMgfSwgeyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUyB9LCB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMgfSwgeyAubmFtZSA9ICJyZXBvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTIH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmY3NfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUiB9LCB7IC5uYW1lID0gImNyY184X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUiB9LCB7IC5uYW1lID0gIm91dF9vZl9zbG90IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCB9LCB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUiB9LCB7IC5uYW1lID0gInJ1bnRfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ191c19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidW5wcm90ZWN0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TVEFURV9VTlBST1RFQ1RFRCB9LCB7IC5uYW1lID0gInByb3RlY3RlZF9zdGFuZGJ5IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkgfSwgeyAubmFtZSA9ICJwcm90ZWN0ZWRfd29ya2luZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlIiwgLmRlc2NyID0gIkluZGljYXRlcyB3aGV0aGVyIGxpbmtzIGFyZSB1bnByb3RlY3RlZCwgcHJvdGVjdGVkIHN0YW5kYnksIG9yIHByb3RlY3RlZCB3b3JraW5nLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub19wcm90ZWN0aW9uX3N3dGljaGluZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX05PX1BST1RFQ1RJT05fU1dUSUNISU5HIH0sIHsgLm5hbWUgPSAibGluZV9jYXJkX3Byb3RlY3Rpb25fc3dpdGNoaW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTElORV9DQVJEX1BST1RFQ1RJT05fU1dJVENISU5HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlIiwgLmRlc2NyID0gIkVQT04gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX1BST1RFQ1RJT05fU1dJVENISU5HX0RFVEVDVElPTl9PUFRJT05TX05PTkUgfSwgeyAubmFtZSA9ICJzdGFuZGJ5X2xvc19kZXRlY3Rpb24iLCAudmFsID0gQkNNT0xUX1BST1RFQ1RJT05fU1dJVENISU5HX0RFVEVDVElPTl9PUFRJT05TX1NUQU5EQllfTE9TX0RFVEVDVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zID0geyAubmFtZSA9ICJiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgRGV0ZWN0aW9uIE9wdGlvbnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9uc19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlcmFuZ2Vfbm9uZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19SRVJBTkdJTkdfT1BUSU9OU19SRVJBTkdFX05PTkUgfSwgeyAubmFtZSA9ICJyZXJhbmdlX3NpbmdsZV9sb2dpY2FsX2xpbmsiLCAudmFsID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9TSU5HTEVfTE9HSUNBTF9MSU5LIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9hbGxfbG9naWNhbF9saW5rcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19SRVJBTkdJTkdfT1BUSU9OU19SRVJBTkdFX0FMTF9MT0dJQ0FMX0xJTktTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMiLCAuZGVzY3IgPSAiQ3JpdGVyaWEgZm9yIGxvZ2ljYWwgbGluayBzZWxlY3Rpb24gZHVyaW5nIHJlLXJhbmdpbmcgcHJvY2VzcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19waW5fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGluMCIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMCB9LCB7IC5uYW1lID0gInBpbjEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEgfSwgeyAubmFtZSA9ICJwaW4yIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yIH0sIHsgLm5hbWUgPSAicGluMyIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMyB9LCB7IC5uYW1lID0gInBpbjQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQgfSwgeyAubmFtZSA9ICJwaW41IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41IH0sIHsgLm5hbWUgPSAicGluNiIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElONiB9LCB7IC5uYW1lID0gInBpbjciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjcgfSwgeyAubmFtZSA9ICJwaW44IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44IH0sIHsgLm5hbWUgPSAicGluOSIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOOSB9LCB7IC5uYW1lID0gInBpbjEwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMCB9LCB7IC5uYW1lID0gInBpbjExIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMSB9LCB7IC5uYW1lID0gInBpbjEyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMiB9LCB7IC5uYW1lID0gInBpbjEzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMyB9LCB7IC5uYW1lID0gInBpbjE0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xNCB9LCB7IC5uYW1lID0gInBpbjE1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xNSB9LCB7IC5uYW1lID0gInBpbjE2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xNiB9LCB7IC5uYW1lID0gInBpbjE3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xNyB9LCB7IC5uYW1lID0gInBpbjE4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xOCB9LCB7IC5uYW1lID0gInBpbjE5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xOSB9LCB7IC5uYW1lID0gInBpbjIwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yMCB9LCB7IC5uYW1lID0gInBpbjIxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yMSB9LCB7IC5uYW1lID0gInBpbjIyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yMiB9LCB7IC5uYW1lID0gInBpbjIzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yMyB9LCB7IC5uYW1lID0gInBpbjI0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yNCB9LCB7IC5uYW1lID0gInBpbjI1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yNSB9LCB7IC5uYW1lID0gInBpbjI2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yNiB9LCB7IC5uYW1lID0gInBpbjI3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yNyB9LCB7IC5uYW1lID0gInBpbjI4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yOCB9LCB7IC5uYW1lID0gInBpbjI5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4yOSB9LCB7IC5uYW1lID0gInBpbjMwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zMCB9LCB7IC5uYW1lID0gInBpbjMxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zMSB9LCB7IC5uYW1lID0gInBpbjMyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zMiB9LCB7IC5uYW1lID0gInBpbjMzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zMyB9LCB7IC5uYW1lID0gInBpbjM0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zNCB9LCB7IC5uYW1lID0gInBpbjM1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zNSB9LCB7IC5uYW1lID0gInBpbjM2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zNiB9LCB7IC5uYW1lID0gInBpbjM3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zNyB9LCB7IC5uYW1lID0gInBpbjM4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zOCB9LCB7IC5uYW1lID0gInBpbjM5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zOSB9LCB7IC5uYW1lID0gInBpbjQwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40MCB9LCB7IC5uYW1lID0gInBpbjQxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40MSB9LCB7IC5uYW1lID0gInBpbjQyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40MiB9LCB7IC5uYW1lID0gInBpbjQzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40MyB9LCB7IC5uYW1lID0gInBpbjQ0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40NCB9LCB7IC5uYW1lID0gInBpbjQ1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40NSB9LCB7IC5uYW1lID0gInBpbjQ2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40NiB9LCB7IC5uYW1lID0gInBpbjQ3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40NyB9LCB7IC5uYW1lID0gInBpbjQ4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40OCB9LCB7IC5uYW1lID0gInBpbjQ5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU40OSB9LCB7IC5uYW1lID0gInBpbjUwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41MCB9LCB7IC5uYW1lID0gInBpbjUxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41MSB9LCB7IC5uYW1lID0gInBpbjUyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41MiB9LCB7IC5uYW1lID0gInBpbjUzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41MyB9LCB7IC5uYW1lID0gInBpbjU0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41NCB9LCB7IC5uYW1lID0gInBpbjU1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41NSB9LCB7IC5uYW1lID0gInBpbjU2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41NiB9LCB7IC5uYW1lID0gInBpbjU3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41NyB9LCB7IC5uYW1lID0gInBpbjU4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41OCB9LCB7IC5uYW1lID0gInBpbjU5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU41OSB9LCB7IC5uYW1lID0gInBpbjYwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42MCB9LCB7IC5uYW1lID0gInBpbjYxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42MSB9LCB7IC5uYW1lID0gInBpbjYyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42MiB9LCB7IC5uYW1lID0gInBpbjYzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42MyB9LCB7IC5uYW1lID0gInBpbjY0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42NCB9LCB7IC5uYW1lID0gInBpbjY1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42NSB9LCB7IC5uYW1lID0gInBpbjY2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42NiB9LCB7IC5uYW1lID0gInBpbjY3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42NyB9LCB7IC5uYW1lID0gInBpbjY4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42OCB9LCB7IC5uYW1lID0gInBpbjY5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42OSB9LCB7IC5uYW1lID0gInBpbjcwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43MCB9LCB7IC5uYW1lID0gInBpbjcxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43MSB9LCB7IC5uYW1lID0gInBpbjcyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43MiB9LCB7IC5uYW1lID0gInBpbjczIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43MyB9LCB7IC5uYW1lID0gInBpbjc0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43NCB9LCB7IC5uYW1lID0gInBpbjc1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43NSB9LCB7IC5uYW1lID0gInBpbjc2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43NiB9LCB7IC5uYW1lID0gInBpbjc3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43NyB9LCB7IC5uYW1lID0gInBpbjc4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43OCB9LCB7IC5uYW1lID0gInBpbjc5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU43OSB9LCB7IC5uYW1lID0gInBpbjgwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44MCB9LCB7IC5uYW1lID0gInBpbjgxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44MSB9LCB7IC5uYW1lID0gInBpbjgyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44MiB9LCB7IC5uYW1lID0gInBpbjgzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44MyB9LCB7IC5uYW1lID0gInBpbjg0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44NCB9LCB7IC5uYW1lID0gInBpbjg1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44NSB9LCB7IC5uYW1lID0gInBpbjg2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44NiB9LCB7IC5uYW1lID0gInBpbjg3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44NyB9LCB7IC5uYW1lID0gInBpbjg4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44OCB9LCB7IC5uYW1lID0gInBpbjg5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU44OSB9LCB7IC5uYW1lID0gInBpbjkwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45MCB9LCB7IC5uYW1lID0gInBpbjkxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45MSB9LCB7IC5uYW1lID0gInBpbjkyIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45MiB9LCB7IC5uYW1lID0gInBpbjkzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45MyB9LCB7IC5uYW1lID0gInBpbjk0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45NCB9LCB7IC5uYW1lID0gInBpbjk1IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45NSB9LCB7IC5uYW1lID0gInBpbjk2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45NiB9LCB7IC5uYW1lID0gInBpbjk3IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45NyB9LCB7IC5uYW1lID0gInBpbjk4IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45OCB9LCB7IC5uYW1lID0gInBpbjk5IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45OSB9LCB7IC5uYW1lID0gInBpbjEwMCIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMTAwIH0sIHsgLm5hbWUgPSAicGluMTAxIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDEgfSwgeyAubmFtZSA9ICJwaW4xMDIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwMiB9LCB7IC5uYW1lID0gInBpbjEwMyIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMTAzIH0sIHsgLm5hbWUgPSAicGluMTA0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDQgfSwgeyAubmFtZSA9ICJwaW4xMDUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwNSB9LCB7IC5uYW1lID0gInBpbjEwNiIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMTA2IH0sIHsgLm5hbWUgPSAidW5jb25maWd1cmVkIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwaW9fcGluIiwgLmRlc2NyID0gIkdQSU8gcGluIG51bWJlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX3BpbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncGlvX3Bpbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX3BvbGFyaXR5X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFjdGl2ZV9sb3ciLCAudmFsID0gQkNNT0xUX0dQSU9fUE9MQVJJVFlfQUNUSVZFX0xPVyB9LCB7IC5uYW1lID0gImFjdGl2ZV9oaWdoIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19wb2xhcml0eSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwaW9fcG9sYXJpdHkiLCAuZGVzY3IgPSAiR1BJTyBQb2xhcml0eSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX3BvbGFyaXR5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwaW9fcG9sYXJpdHlfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3R5cGUiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzY2hlbWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIHByb3RlY3Rpb25fdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgb3B0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgfSwgeyAubmFtZSA9ICJyZXJhbmdlX29wdGlvbnMiLCAuZGVzY3IgPSAiUmUtcmFuZ2luZyBhbGdvcml0aG0gc2VsZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIHJlcmFuZ2Vfb3B0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2F0dGVtcHRzIiwgLmRlc2NyID0gIk51bWJlciBvZiB0aW1lcyB0byByZSByYW5nZSBkdXJpbmcgYSBzd2l0Y2giLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgcmVyYW5nZV9hdHRlbXB0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJlcmFuZ2VfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiSW50ZXJ2YWwgYmV0d2VlbiByZS1yYW5nZSBhdHRlbXB0cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgcmVyYW5nZV9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzeW5jX2dhdGVfZHVyYXRpb24iLCAuZGVzY3IgPSAiRHVyYXRpb24gb2Ygc3luYyBnYXRlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCBzeW5jX2dhdGVfZHVyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZ3Bpb19pbnB1dCIsIC5kZXNjciA9ICJDb25maWd1cmVzIHN0YXRlIG9uIFBPTiAod29ya2luZy9zdGFuZGJ5KSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCBncGlvX2lucHV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSwgeyAubmFtZSA9ICJncGlvX2lucHV0X3BvbGFyaXR5IiwgLmRlc2NyID0gIkdQSU8gSW5wdXQgUG9sYXJpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgZ3Bpb19pbnB1dF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcG9sYXJpdHkgfSwgeyAubmFtZSA9ICJncGlvX291dHB1dCIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgc3RhdGUgb24gUE9OICh3b3JraW5nL3N0YW5kYnkpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIGdwaW9fb3V0cHV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSwgeyAubmFtZSA9ICJncGlvX291dHB1dF9wb2xhcml0eSIsIC5kZXNjciA9ICJHUElPIE91dHB1dCBQb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCBncGlvX291dHB1dF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcG9sYXJpdHkgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiRVBPTiBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9ycF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYmFzZV9sbGlkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NfZW4iLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTiB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY19nbnRfbGVuX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfR05UX0xFTl9UUSB9LCB7IC5uYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTVBDUF9SRUdfUEVSX0RJU0NfV0lORE9XIH0sIHsgLm5hbWUgPSAibWF4X2xpbmtzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MgfSwgeyAubmFtZSA9ICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfREVGQVVMVF9VUFNUUkVBTV9CQU5EV0lEVEggfSwgeyAubmFtZSA9ICJyYXRlX29mX3JlZnJhY3Rpb24iLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9ycF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9ycF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcnBfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkgfSwgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9ycF9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9ycF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcnBfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTE2ID0geyAubmFtZSA9ICJiY21vbHRfdThfbGlzdF91MTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdThfbGlzdF91MTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAubGVuX3NpemUgPSAyLCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YodWludDhfdCkgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZnJhbWVfb2N0ZXRzIiwgLmRlc2NyID0gIkZyYW1lIG9jdGV0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkLCBmcmFtZV9vY3RldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNiB9LCB7IC5uYW1lID0gIm1hc2tfb2N0ZXRzIiwgLmRlc2NyID0gIk1hc2sgb2N0ZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQsIG1hc2tfb2N0ZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MTYgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgPSB7IC5uYW1lID0gImJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQiLCAuZGVzY3IgPSAiRXRoZXJuZXQgZnJhbWUsIG1hc2tlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmcmFtZV9vY3RldHMiLCAuZGVzY3IgPSAiRnJhbWUgb2N0ZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCwgZnJhbWVfb2N0ZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MTYgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIiwgLmRlc2NyID0gIkV0aGVybmV0IGZyYW1lLCB1bm1hc2tlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2V4dF9pcnFfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXh0X2lycTAiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTAgfSwgeyAubmFtZSA9ICJleHRfaXJxMSIsIC52YWwgPSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRMSB9LCB7IC5uYW1lID0gImV4dF9pcnEyIiwgLnZhbCA9IEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEyIH0sIHsgLm5hbWUgPSAiZXh0X2lycTMiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTMgfSwgeyAubmFtZSA9ICJleHRfaXJxNCIsIC52YWwgPSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRNCB9LCB7IC5uYW1lID0gImV4dF9pcnE1IiwgLnZhbCA9IEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE1IH0sIHsgLm5hbWUgPSAidW5jb25maWd1cmVkIiwgLnZhbCA9IEJDTU9MVF9FWFRfSVJRX1VOQ09ORklHVVJFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V4dF9pcnEgPSB7IC5uYW1lID0gImJjbW9sdF9leHRfaXJxIiwgLmRlc2NyID0gIkV4dGVybmFsIElSUSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9leHRfaXJxKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2V4dF9pcnFfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGJlZm9yZSBhbGwgYnVyc3RzIGZvciB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUsIGFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGFmdGVyIGFsbCBidXJzdHMgZm9yIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSwgYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lID0geyAubmFtZSA9ICJiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJFeHRlbmRlZCBHdWFyZCBUaW1lIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzMyID0geyAubmFtZSA9ICJzdHJpbmdbMzJdIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMzIiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzMyXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWpvciIsIC5kZXNjciA9ICJNYWpvciAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24sIG1ham9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlub3IiLCAuZGVzY3IgPSAiTWlub3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24sIG1pbm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmV2aXNpb24iLCAuZGVzY3IgPSAiUmV2aXNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24sIHJldmlzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2hleCB9LCB7IC5uYW1lID0gIm1vZGVsIiwgLmRlc2NyID0gIk1vZGVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uLCBtb2RlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWlsZF90aW1lIiwgLmRlc2NyID0gIkZpcm13YXJlIFNXIGJ1aWxkIHRpbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24sIGJ1aWxkX3RpbWUpLCAudHlwZSA9ICZzdHJpbmdfMzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uID0geyAubmFtZSA9ICJiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiIsIC5kZXNjciA9ICJGaXJtd2FyZSBTVyBWZXJzaW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGwiLCAudmFsID0gQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fQUxMIH0sIHsgLm5hbWUgPSAicGVyX3ZpZCIsIC52YWwgPSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfVklEIH0sIHsgLm5hbWUgPSAicGVyX2Zsb3ciLCAudmFsID0gQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fUEVSX0ZMT1cgfSwgeyAubmFtZSA9ICJ2aWRfcGx1c19mbG93IiwgLnZhbCA9IEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX1ZJRF9QTFVTX0ZMT1cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiIsIC5kZXNjciA9ICJGbHVzaCBNQUMgdGFibGUgb3B0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibG93ZXIiLCAudmFsID0gQkNNT0xUX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTl9MT1dFUiB9LCB7IC5uYW1lID0gImhpZ2hlciIsIC52YWwgPSBCQ01PTFRfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OX0hJR0hFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC5kZXNjciA9ICJGcmVxdWVuY3kgYWRqdXN0bWVudCBkaXJlY3Rpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZG93bnN0cmVhbSIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0RPV05TVFJFQU0gfSwgeyAubmFtZSA9ICJ1cHN0cmVhbSIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX1VQU1RSRUFNIH0sIHsgLm5hbWUgPSAiYmlkaXJlY3Rpb25hbCIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0JJRElSRUNUSU9OQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24gPSB7IC5uYW1lID0gImJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgSUQgZGlyZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ2VtX3BvcnRfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bmljYXN0IiwgLnZhbCA9IEJDTU9MVF9HRU1fUE9SVF9UWVBFX1VOSUNBU1QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3QiLCAudmFsID0gQkNNT0xUX0dFTV9QT1JUX1RZUEVfTVVMVElDQVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dlbV9wb3J0X3R5cGUiLCAuZGVzY3IgPSAiR0VNIHBvcnQgdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9nZW1fcG9ydF90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dlbV9wb3J0X3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0aW9uIiwgLmRlc2NyID0gIkdFTSBwb3J0IGRpcmVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiwgZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uIH0sIHsgLm5hbWUgPSAidHlwZSIsIC5kZXNjciA9ICJHRU0gcG9ydCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uLCB0eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfdHlwZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkdFTSBwb3J0IGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9BQ1RJVkFURSB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9ERUFDVElWQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIiwgLmRlc2NyID0gIkdFTSBwb3J0IG9wZXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpcmVjdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OIH0sIHsgLm5hbWUgPSAidmFsdWUiLCAudmFsID0gQkNNT0xUX0dQSU9fQ0ZHX0lEX1ZBTFVFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncGlvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncGlvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAudmFsID0gQkNNT0xUX0dQSU9fS0VZX0lEX1JFU0VSVkVEIH0sIHsgLm5hbWUgPSAiZ3Bpb19pZCIsIC52YWwgPSBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bpb19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwaW9fa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fcGluX2Rpcl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbnB1dCIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fRElSX0lOUFVUIH0sIHsgLm5hbWUgPSAib3V0cHV0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9ESVJfT1VUUFVUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW5fZGlyID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19waW5fZGlyIiwgLmRlc2NyID0gIkdQSU8gUElOIERpcmVjdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX3Bpbl9kaXIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb19waW5fZGlyX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fdmFsdWVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2xlYXIiLCAudmFsID0gQkNNT0xUX0dQSU9fVkFMVUVfQ0xFQVIgfSwgeyAubmFtZSA9ICJzZXQiLCAudmFsID0gQkNNT0xUX0dQSU9fVkFMVUVfU0VUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb192YWx1ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwaW9fdmFsdWUiLCAuZGVzY3IgPSAiR1BJTyBWYWx1ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX3ZhbHVlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwaW9fdmFsdWVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUgfSwgeyAubmFtZSA9ICJzbGEiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX3VzZWQiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEIH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfYWxsb2NhdGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEIH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtX29mX2N5Y2xlcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19nZXRfc3RhdHMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3NldF9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlIiwgLmRlc2NyID0gIkdQT04gQWxsb2MgV2l0aCBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMzIgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInVudGFnZ2VkX2Zsb3ciLCAuZGVzY3IgPSAiSWYgZW5hYmxlZCwgdGhpcyBHRU0gcG9ydCB3aWxsIGV4cGVjdCB1cHN0cmVhbSB0cmFmZmljIHRvIGJlIHVudGFnZ2VkIGFuZCBkb3duc3RyZWFtIHRyYWZmaWMgdG8gdXNlIGEgY3VzdG9tIFZMQU4gdGFnLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZywgdW50YWdnZWRfZmxvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJ1bnRhZ2dlZF92aWQiLCAuZGVzY3IgPSAiVGhlIFZMQU4gSUQgdG8gdXNlIHdoZW4gYWRkaW5nIE1BQyB0YWJsZSBlbnRyaWVzIGZvciB1bnRhZ2dlZCB0cmFmZmljLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZywgdW50YWdnZWRfdmlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnIiwgLmRlc2NyID0gIkdQT04gRGVidWcgRmxvdyBDb25maWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fZ2VtX2lkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5sZW5fc2l6ZSA9IDEsIC5tYXhfc2l6ZSA9IDE2IH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSB9LCB7IC5uYW1lID0gImRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wgfSwgeyAubmFtZSA9ICJkZWJ1Z19mbG93X2NvbmZpZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfREVCVUdfRkxPV19DT05GSUcgfSwgeyAubmFtZSA9ICJtYWNfdGFibGVfZW50cnlfbGltaXQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfc2V0X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMgfSwgeyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm90X2NvbmZpZ3VyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQgfSwgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9JTkFDVElWRSB9LCB7IC5uYW1lID0gInByb2Nlc3NpbmciLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfUFJPQ0VTU0lORyB9LCB7IC5uYW1lID0gImFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSIsIC5kZXNjciA9ICJHUE9OIEdFTSBQb3J0IFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImdlbV9pZCIsIC5kZXNjciA9ICJHRU0gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgZ2VtX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5kZXNjciA9ICJHUE9OIEdFTSBQb3J0IFdpdGggU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDEyOCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLCAubGVuX3NpemUgPSAyLCAubWF4X3NpemUgPSAyNTYgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzY2FuX21hY190YWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIml3Zl9tb2RlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUgfSwgeyAubmFtZSA9ICJ1c190cGlkX3Blcl9mbG93IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVyB9LCB7IC5uYW1lID0gInVzX290YWdfZGlyZWN0X3RwaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEIH0sIHsgLm5hbWUgPSAidXNfb3RhZ19kaXJlY3RfcGJpdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQgfSwgeyAubmFtZSA9ICJkc190cGlkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRCB9LCB7IC5uYW1lID0gIm1hY190YWJsZV9jb25maWd1cmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJtYWNfdGFibGVfY291bnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09VTlQgfSwgeyAubmFtZSA9ICJmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGVhcm5fdW50YWdnZWRfZmxvd192aWRzIiwgLmRlc2NyID0gIldoZW4gYSBNQUMvVklEIGlzIGxlYXJuZWQgb24gYW4gdW50YWdnZWQgZmxvdywgbGVhcm4gdGhlIHJlY2VpdmVkIE1BQyBhZGRyZXNzIHdpdGggYm90aCB0aGUgdW50YWdnZWQgVklEIGFuZCB0aGUgcmVjZWl2ZWQgVklEIChldmVuIHRob3VnaCBpdCB3aWxsIGJlIGludmFsaWQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcsIGxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjIiwgLmRlc2NyID0gIklmIHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAsIGxlYXJuaW5nIGV2ZW50cyBvbiB1bnRhZ2dlZCBmbG93cyB3aWxsIG9ubHkgYmUgZW5hYmxlZCBmb3IgTiBtaWxsaXNlY29uZHMgZXZlcnkgc2Vjb25kLiAgRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAgd291bGQgbWVhbiBsZWFybmluZyBpcyBvbmx5IGVuYWJsZWQgZm9yIDElIG9mIHRoZSB0b3RhbCB0aW1lLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcsIHVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWciLCAuZGVzY3IgPSAiT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIFwidW50YWdnZWQgZmxvd1wiIGZlYXR1cmUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdlbV9wb3J0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQgfSwgeyAubmFtZSA9ICJwYml0X2NvbnRyb2wiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJmbG93X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYXBwaW5nX21ldGhvZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCB9LCB7IC5uYW1lID0gIm1hcHBpbmdfdGFnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHIH0sIHsgLm5hbWUgPSAidmxhbl9hY3Rpb24iLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAidmxhbl9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfQ09OVFJPTCB9LCB7IC5uYW1lID0gInZpZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRCB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2ZsdXNoX21hY190YWJsZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FnZWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRCB9LCB7IC5uYW1lID0gIm1hY19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0RST1BQRUQgfSwgeyAubmFtZSA9ICJtYWNfbW92ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19NT1ZFIH0sIHsgLm5hbWUgPSAibmV3X21hYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lEIH0sIHsgLm5hbWUgPSAic3RhdGljIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MgfSwgeyAubmFtZSA9ICJ2bGFuIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib2xkX2Zsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRCB9LCB7IC5uYW1lID0gIm5ld19mbG93X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfTkVXX0ZMT1dfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX0ZMT1dfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUyB9LCB7IC5uYW1lID0gImVudHJpZXMiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3NjYW5fbWFjX3RhYmxlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZHNfaGl0X2V2ZW50IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVCB9LCB7IC5uYW1lID0gImRzX21pc3NfZXZlbnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQgfSwgeyAubmFtZSA9ICJkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSB9LCB7IC5uYW1lID0gIm5ld19tYWNfZGlzY292ZXJlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RJU0NPVkVSRUQgfSwgeyAubmFtZSA9ICJtb3ZlX2V2ZW50IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQgfSwgeyAubmFtZSA9ICJuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEIH0sIHsgLm5hbWUgPSAibWFjX2xlYXJuaW5nIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcgfSwgeyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04gfSwgeyAubmFtZSA9ICJ2bGFuX3RhZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcgfSwgeyAubmFtZSA9ICJ0cGlkX2luZGV4IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl91c19mbG93X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3VzX2Zsb3dfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3JtYWwiLCAudmFsID0gQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX05PUk1BTCB9LCB7IC5uYW1lID0gImVuaGFuY2VkIiwgLnZhbCA9IEJDTU9MVF9LRVlfRVhDSEFOR0VfTU9ERV9FTkhBTkNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUiLCAuZGVzY3IgPSAiS2V5IGV4Y2hhbmdlIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImludGVydmFsIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBwcm9jZXNzIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UsIGludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlXFxkaXNhYmxlIHBlcmlvZGljIHByb2Nlc3Mgb2YgS2V5IEV4Y2hhbmdlIGZvciBhY3RpdmUgT05VcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJLZXkgZXhjaGFuZ2UgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSB9LCB7IC5uYW1lID0gImVuY3J5cHRlZF9wb3J0c19vbmx5IiwgLmRlc2NyID0gIlBlcmZvcm0ga2V5IGV4Y2hhbmdlIG9ubHkgdG8gT05VcyB3aXRoIEdFTSBwb3J0cyB0aGF0IGhhdmUgZG93bnN0cmVhbSBlbmNyeXB0aW9uIGVuYWJsZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlLCBlbmNyeXB0ZWRfcG9ydHNfb25seSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2tleV9leGNoYW5nZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIkdQT04gS2V5IEV4Y2hhbmdlICIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2tleV9leGNoYW5nZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2tleV9leGNoYW5nZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ2bGFuIiwgLmRlc2NyID0gIlRoZSBWTEFOIElEIG9mIHRoZSBlbnRyeS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCB2bGFuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIGZsb3cgSUQgYXNzaWduZWQgdG8gdHJhZmZpYyB0aGF0IG1hdGNoZXMgdGhpcyBNQUMgdGFibGUgZW50cnkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRoZSBNQUMgZW50cnkgaXMgc3RhdGljLiAgU3RhdGljIGVudHJpZXMgZG9uJ3QgYWdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgSUQgb2YgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgYXBwbGllcyB0byBhdXRvbWF0aWNhbGx5LWxlYXJuZWQgZW50cmllcy4gIE1hbnVhbGx5LWFkZGVkIGVudHJpZXMgd2lsbCBoYXZlIHRoZSB2YWx1ZSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIlRoZSBPTlUgSUQgZm9yIHRoZSB0cmFmZmljIHRoYXQgY3JlYXRlZCB0aGlzIHRhYmxlIGVudHJ5LiAgVGhpcyBvbmx5IHZhbGlkIGlmIGdlbV9wb3J0X2lkIGlzIHZhbGlkLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBiZSBzZXQgdG8gQkNNT0xUX0dQT05fT05VX0lEX0lOVkFMSUQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQiLCAuZGVzY3IgPSAiR1BPTiBNQUMgdGFibGUgc2NhbiByZXN1bHQgZm9yIGEgc2luZ2xlIE1BQyB0YWJsZSBlbnRyeS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCAubGVuX3NpemUgPSAyLCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0KSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiY3B1X3BhY2tldHNfZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImxvcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MgfSwgeyAubmFtZSA9ICJvbnVfZGlzY292ZXJlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FIH0sIHsgLm5hbWUgPSAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCB9LCB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIHsgLm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGxvYW0iLCAudmFsID0gQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUyB9LCB7IC5uYW1lID0gImF2YWlsYWJsZV9iYW5kd2lkdGgiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEggfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUyB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUyB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUyB9LCB7IC5uYW1lID0gInBvbl9kaXN0YW5jZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFIH0sIHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSB9LCB7IC5uYW1lID0gInByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJFQVNTSUdORURfRVFVQUxJWkFUSU9OX0RFTEFZIH0sIHsgLm5hbWUgPSAiZXFkX2N5Y2xlc19udW1iZXIiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMIH0sIHsgLm5hbWUgPSAiZHNfZmVjX21vZGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFIH0sIHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTCB9LCB7IC5uYW1lID0gImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwgfSwgeyAubmFtZSA9ICJsb3NfYWxhcm1fdGhyZXNob2xkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xEIH0sIHsgLm5hbWUgPSAibG9zX2luaXRpYWxfdmFsdWUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFIH0sIHsgLm5hbWUgPSAib251X2FsYXJtc190aHJlc2hvbGRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMgfSwgeyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IgfSwgeyAubmFtZSA9ICJwbG9hbV9hY2tfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04gfSwgeyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04gfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2UiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORyB9LCB7IC5uYW1lID0gImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJkYmEiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQgfSwgeyAubmFtZSA9ICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUyB9LCB7IC5uYW1lID0gInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX2FsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCB9LCB7IC5uYW1lID0gImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gInVzX2JhbmR3aWR0aF9saW1pdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUIH0sIHsgLm5hbWUgPSAiYWxsX29udXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTIH0sIHsgLm5hbWUgPSAiYWxsX21jYXN0X2dlbV9wb3J0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUyB9LCB7IC5uYW1lID0gImRlYnVnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9ERUJVRyB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TIH0sIHsgLm5hbWUgPSAicHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFNfQ19XQUlUX0JFRk9SRV9ERUFDVElWQVRJT05fVElNRU9VVCB9LCB7IC5uYW1lID0gImJpcDMyX2luZGljYXRpb25fY29udHJvbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVycm9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9saXN0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9jcHVfcGFja2V0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2RlYnVnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSIsIC5kZXNjciA9ICJOdW1iZXIgb2YgR2VtIHBvcnRzIHBlciBPTlUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGVidWcsIG51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2RlYnVnID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyIsIC5kZXNjciA9ICJHUE9OIE5JIERlYnVnIHBhcmFtZXRlcnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2RlYnVnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9sb3NfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2xvc19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfbG9zX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfbG9zIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvc19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFIH0sIHsgLm5hbWUgPSAib251X2xpc3QiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX0xJU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Jlc2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3Jlc2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcmVzZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUgfSwgeyAubmFtZSA9ICJtZWFzdXJlbWVudF9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAiaXNfZGVsaW5lYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTiB9LCB7IC5uYW1lID0gImlzX2VkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQgfSwgeyAubmFtZSA9ICJyeF9kYXRhIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX29udV9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX0NSQ19FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAic2Vjb25kX3Jhbmdpbmdfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc2V0X29udV9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUiB9LCB7IC5uYW1lID0gImVuZXJneV9kZXRlY3Rfc2lnbmFsIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUyB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEIH0sIHsgLm5hbWUgPSAiYmlwOF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMgfSwgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfZ2VtX3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUyB9LCB7IC5uYW1lID0gInJ4X2dlbV9kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQgfSwgeyAubmFtZSA9ICJyeF9nZW1faWRsZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JRExFIH0sIHsgLm5hbWUgPSAicnhfZ2VtX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJyeF9nZW1faWxsZWdhbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMIH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEIH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCB9LCB7IC5uYW1lID0gInJ4X3Bsb2FtcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUyB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19lcnJvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUiB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQgfSwgeyAubmFtZSA9ICJyeF9jcHUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSSB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HIH0sIHsgLm5hbWUgPSAicnhfY3JjX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9rZXlfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X2ZyYWdtZW50c19lcnJvcnMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVFNfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAidHhfZ2VtIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNIH0sIHsgLm5hbWUgPSAidHhfcGxvYW1zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TIH0sIHsgLm5hbWUgPSAidHhfZ2VtX2ZyYWdtZW50cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMgfSwgeyAubmFtZSA9ICJ0eF9jcHUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUgfSwgeyAubmFtZSA9ICJ0eF9vbWNpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfT01DSSB9LCB7IC5uYW1lID0gInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCB9LCB7IC5uYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUyB9LCB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdmlkX21pc3MiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUIH0sIHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidG9kX3N0cmluZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORyB9LCB7IC5uYW1lID0gInNmYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDIH0sIHsgLm5hbWUgPSAicnRjX29mZnNldF9zZWMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDIH0sIHsgLm5hbWUgPSAicnRjX29mZnNldF9uc2VjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV90b2RfcmVxdWVzdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC5kZXNjciA9ICJQZXJmb3JtIHNpbmdsZSBrZXkgZXhjaGFuZ2UgZHVyaW5nIGFjdGl2YXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAicGFzc3dvcmRfYXV0aGVudGljYXRpb24iLCAuZGVzY3IgPSAiUGVyZm9ybSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBkdXJpbmcgYWN0aXZhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiwgcGFzc3dvcmRfYXV0aGVudGljYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSIsIC5kZXNjciA9ICJEZWFjdGl2YXRlIE9OVSBkdWUgdG8gcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiwgZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJHUE9OIE9OVSBhY3RpdmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvc2kiLCAuZGVzY3IgPSAiTG9zcyBvZiBzaWduYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBsb3NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9maSIsIC5kZXNjciA9ICJMb3NzIG9mIGZyYW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgbG9maSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImxvYW1pIiwgLmRlc2NyID0gIkxvc3Mgb2YgUExPQU0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBsb2FtaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRnaSIsIC5kZXNjciA9ICJEeWluZyBHYXNwIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgZGdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJUcmFuc21pc3Npb24gaW50ZXJmZXJlbmNlIEFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRvd2kiLCAuZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgZG93aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiU3RhcnQgVVAgRmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiU2lnbmFsIEZhaWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiU2lnbmFsIERlZ3JhZGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgc2RpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGZpIiwgLmRlc2NyID0gIkRlYWN0aXZhdGlvbiBGYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgZGZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9haSIsIC5kZXNjciA9ICJMb3NzIG9mIGFjayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvYWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2tpIiwgLmRlc2NyID0gImxvc3Mgb2Yga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgbG9raSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiR1BPTiBPTlUgYWxhcm0gc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsb3NpIiwgLmRlc2NyID0gIkxPU2kiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtcywgbG9zaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImxvZmkiLCAuZGVzY3IgPSAiTE9GaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zLCBsb2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9hbWkiLCAuZGVzY3IgPSAiTE9BTWkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtcywgbG9hbWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXMgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hbGFybXMiLCAuZGVzY3IgPSAiR1BPTiBPTlUgYWxhcm1zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2FsYXJtcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvc2kiLCAuZGVzY3IgPSAiVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9TaSBhbGFybSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2ZpIiwgLmRlc2NyID0gIlRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPRmkgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzLCBsb2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9hbWkiLCAuZGVzY3IgPSAiVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9BTWkgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzLCBsb2FtaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAuZGVzY3IgPSAiR1BPTiBPTlUgYWxhcm1zIHRocmVzaG9sZHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImRmaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJIH0sIHsgLm5hbWUgPSAiZGdpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0kgfSwgeyAubmFtZSA9ICJkb3dpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJIH0sIHsgLm5hbWUgPSAiZXJyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIgfSwgeyAubmFtZSA9ICJpbnZhbGlkX2RicnVfcmVwb3J0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVggfSwgeyAubmFtZSA9ICJsb2FpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0FJIH0sIHsgLm5hbWUgPSAibG9raSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9LSSB9LCB7IC5uYW1lID0gIm1lbWkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUkgfSwgeyAubmFtZSA9ICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0gfSwgeyAubmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV9lbmFibGVfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9wdGljYWxfcmVmbGVjdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OIH0sIHsgLm5hbWUgPSAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJwZWUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSB9LCB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSB9LCB7IC5uYW1lID0gInBzdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNUIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicmVpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUkgfSwgeyAubmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzZGkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSB9LCB7IC5uYW1lID0gInNmaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdWZpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJIH0sIHsgLm5hbWUgPSAidGl3aSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiZXJfaW50ZXJ2YWwiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gInBhc3N3b3JkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUEFTU1dPUkQgfSwgeyAubmFtZSA9ICJhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQVVUT19QQVNTV09SRF9MRUFSTklORyB9LCB7IC5uYW1lID0gInVzX2ZlYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQyB9LCB7IC5uYW1lID0gIm9tY2lfcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCB9LCB7IC5uYW1lID0gImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMIH0sIHsgLm5hbWUgPSAiYWVzX2VuY3J5cHRpb25fa2V5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUVTX0VOQ1JZUFRJT05fS0VZIH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSB9LCB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGlvbl9yZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OIH0sIHsgLm5hbWUgPSAiYWxsX2dlbV9wb3J0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMgfSwgeyAubmFtZSA9ICJhbGxfYWxsb2NzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUyB9LCB7IC5uYW1lID0gIm9udV9wc190eXBlX2MiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DIH0sIHsgLm5hbWUgPSAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3dlcl9sZXZlbF9hY3Rpb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSyB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFIH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2NwdV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgfSwgeyAubmFtZSA9ICJjYWxjX2NyYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMgfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY3B1X3BhY2tldHMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2RmaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9kZmlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfZGZpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2RnaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kZ2lfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9kZ2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfZGdpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kZ2lfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFIH0sIHsgLm5hbWUgPSAibmV3X2VxZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2Rvd2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfZG93aSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9kb3dpX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZXFkLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZXFkIiwgLmRlc2NyID0gIkVRRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZXFkLCBlcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZXFkIiwgLmRlc2NyID0gIkdQT04gT05VIEVRRCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV9lcWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcWQpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9lcnJfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYmlwOF9lcnJvcnMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0VSUl9JRF9CSVA4X0VSUk9SUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Vycl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2Vycl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9lcnIgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Vycl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9lcnJfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9vbnVfaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90LCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSAyNTYgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfa2V5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRURfSURfTkVXX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfa2V5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSB9LCB7IC5uYW1lID0gInJlY2VpdmVkX2tleSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfaW5kZXgiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0VYUEVDVEVEX0lOREVYIH0sIHsgLm5hbWUgPSAiYWN0dWFsX2luZGV4IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2FpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9sb2FpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2FpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2xvYWlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0xPS0lfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2xva2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbG9raSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9sb2tpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X21lbWlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGxvYW1fYnVmZmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X21lbWlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9tZW1pX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X21lbWkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X21lbWlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0sgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb21jaV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJnZW1fcG9ydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0dFTV9QT1JUIH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAib3BlcmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X29udV9hbGFybSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIHsgLm5hbWUgPSAicGFzc3dvcmQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3BlZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3BlZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9wZWUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3BlZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9wZWVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBsb2FtIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcGxvYW1fcGFja2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiZXN0aW1hdGVkX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbGRfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFIH0sIHsgLm5hbWUgPSAicmVhc29uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wc3RfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGlua19udW1iZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9MSU5LX05VTUJFUiB9LCB7IC5uYW1lID0gImsxIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEgfSwgeyAubmFtZSA9ICJrMiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0syIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3BzdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3BzdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wbG9hbXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMgfSwgeyAubmFtZSA9ICJlcWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3JlaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX0JJUDhfRVJST1JTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmVpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3JlaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3JlaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3NkaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJiZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NESV9JRF9CRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZGlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zZGlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc2RpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZGlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3NldF9vbnVfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zZmlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiYmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3NmaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX2J5dGVzX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEIH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJiaXA4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVMgfSwgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUiB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgfSwgeyAubmFtZSA9ICJwb3NpdGl2ZV9kcmlmdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCB9LCB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUIH0sIHsgLm5hbWUgPSAicnhfb21jaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJIH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAiYmVyX3JlcG9ydGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCB9LCB7IC5uYW1lID0gInVucmVjZWl2ZWRfYnVyc3QiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVCB9LCB7IC5uYW1lID0gImxjZGdfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0xDREdfRVJST1JTIH0sIHsgLm5hbWUgPSAicmRpX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfQllURVMgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJ0eF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdWZpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zdWZpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdWZpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3N1ZmlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV90aXdpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV90aXdpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV90aXdpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb21jaV9kZXZpY2VfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYmFzZWxpbmUiLCAudmFsID0gQkNNT0xUX09NQ0lfREVWSUNFX0lEX0JBU0VMSU5FIH0sIHsgLm5hbWUgPSAiZXh0ZW5kZWQiLCAudmFsID0gQkNNT0xUX09NQ0lfREVWSUNFX0lEX0VYVEVOREVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb21jaV9kZXZpY2VfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9vbWNpX2RldmljZV9pZCIsIC5kZXNjciA9ICJPTUNJIERldmljZSBJRCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbWNpX2RldmljZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9vbWNpX2RldmljZV9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzcG9uc2VfdGltZW91dF9tcyIsIC5kZXNjciA9ICJUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgT0xUIHdpbGwgd2FpdCBmb3IgdGhlIE9OVSB0byByZXNwb25kLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X3JldHJ5X2NvdW50IiwgLmRlc2NyID0gIk1heGltdW0gcmV0cnkgY291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zLCBtYXhfcmV0cnlfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJvbWNpX2Zvcm1hdCIsIC5kZXNjciA9ICJPTUNJIGZvcm1hdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIG9tY2lfZm9ybWF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb21jaV9kZXZpY2VfaWQgfSwgeyAubmFtZSA9ICJ3aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJXaW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHdpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImFjdGl2YXRlX2NvbW1pdCIsIC5kZXNjciA9ICJBdXRvbWF0aWNhbGx5IGFjdGl2YXRlIHRoZSBuZXcgaW1hZ2UgYW5kIGNvbW1pdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zLCBhY3RpdmF0ZV9jb21taXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZWxheV9mb3JfY29tbWl0X21zIiwgLmRlc2NyID0gIkRlbGF5IHRpbWUgYmVmb3JlIENPTU1JVCBjb21tYW5kLiAgVW5pdCBpcyBtaWxsaXNlY29uZHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgZGVsYXlfZm9yX2NvbW1pdF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiByZS1hdHRlbXB0cyB0byBhY3RpdmF0ZSB0aGUgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIG1heF9hY3RpdmF0aW9uX2F0dGVtcHRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJHUE9OIE9OVSB1cGdyYWRlIHBhcmFtcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9TVUNDRVNTIH0sIHsgLm5hbWUgPSAib251X3Jlc3BvbnNlX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX1JFU1BPTlNFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJvbnVfZXJyb3JfcmVzcG9uc2UiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX0VSUk9SX1JFU1BPTlNFIH0sIHsgLm5hbWUgPSAidGNpX21pc21hdGNoIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1RDSV9NSVNNQVRDSCB9LCB7IC5uYW1lID0gImdldF9pbWFnZV9mYWlsZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfR0VUX0lNQUdFX0ZBSUxFRCB9LCB7IC5uYW1lID0gImFjdGl2YXRpb25fZmFpbGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0FDVElWQVRJT05fRkFJTEVEIH0sIHsgLm5hbWUgPSAiaW50ZXJuYWwiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfSU5URVJOQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSIsIC5kZXNjciA9ICJHUE9OIE9OVSBVcGdyYWRlIFJldHVybiBDb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX05PX0VSUk9SIH0sIHsgLm5hbWUgPSAicHJvY2Vzc2luZ19lcnJvciIsIC52YWwgPSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9QUk9DRVNTSU5HX0VSUk9SIH0sIHsgLm5hbWUgPSAibm90X3N1cHBvcnRlZCIsIC52YWwgPSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9OT1RfU1VQUE9SVEVEIH0sIHsgLm5hbWUgPSAicGFyYW1ldGVyX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1BBUkFNRVRFUl9FUlJPUiB9LCB7IC5uYW1lID0gInVua25vd25fZW50aXR5IiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1VOS05PV05fRU5USVRZIH0sIHsgLm5hbWUgPSAidW5rbm93bl9pbnN0YW5jZSIsIC52YWwgPSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9VTktOT1dOX0lOU1RBTkNFIH0sIHsgLm5hbWUgPSAiZGV2aWNlX2J1c3kiLCAudmFsID0gQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfREVWSUNFX0JVU1kgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlID0geyAubmFtZSA9ICJiY21vbHRfb21jaV9yZXN1bHRfY29kZSIsIC5kZXNjciA9ICJHLjk4OCBPTUNJIFJlc3VsdCBDb2RlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZXJyb3JfY29kZSIsIC5kZXNjciA9ICJFcnJvciBDb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1cywgZXJyb3JfY29kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJGYWlsdXJlIHJlYXNvbiBzcGVjaWZpYyB0byB0aGUgRXJyb3IgQ29kZSBhYm92ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29tY2lfcmVzdWx0X2NvZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIiwgLmRlc2NyID0gIkdQT04gT05VIFVwZ3JhZGUgU3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV91cGdyYWRlX3N0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1cywgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1cykgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29udV9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3RfY29uZmlndXJlZCIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEIH0sIHsgLm5hbWUgPSAiaW5hY3RpdmUiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRSB9LCB7IC5uYW1lID0gImFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRSB9LCB7IC5uYW1lID0gImFjdGl2ZV9zdGFuZGJ5IiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlkgfSwgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAiYXdha2VfZnJlZSIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0FXQUtFX0ZSRUUgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORyB9LCB7IC5uYW1lID0gImxvd19wb3dlcl9kb3plIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX0RPWkUgfSwgeyAubmFtZSA9ICJsb3dfcG93ZXJfc2xlZXAiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfU0xFRVAgfSwgeyAubmFtZSA9ICJsb3dfcG93ZXJfd2F0Y2giLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0ggfSwgeyAubmFtZSA9ICJ1bmF3YXJlIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X29udV9zdGF0ZSIsIC5kZXNjciA9ICJPTlUgc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29udV9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUiLCAuZGVzY3IgPSAiR1BPTiBPTlUgV2l0aCBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV93aXRoX3N0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlLCAubGVuX3NpemUgPSAyLCAubWF4X3NpemUgPSAxMjggfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiZWZvcmUiLCAudmFsID0gQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9CRUZPUkUgfSwgeyAubmFtZSA9ICJhZnRlciIsIC52YWwgPSBCQ01PTFRfUlNTSV9MT0NBVElPTl9TSUdOX0FGVEVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduID0geyAubmFtZSA9ICJiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduIiwgLmRlc2NyID0gInJzc2kgbG9jYXRpb24gc2lnbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvY2F0aW9uIiwgLmRlc2NyID0gInRoZSBwYXR0ZXJuIGFjdGl2YXRpb24gbG9jYXRpb24gaW4gY2xvY2sgY3ljbGVzIHJlbGF0aXZlIChiZWZvcmUpIHRvIHN0YXJ0IG9mIGJ1cnN0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiwgbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2NhdGlvbl9zaWduIiwgLmRlc2NyID0gInRoaXMgYml0IGRldGVybWluZXMgd2hldGhlciB0aGUgbG9jYXRpb24gb2YgdGhlIFJTU0kgaW4gZGF0YSBtb2RlIChjb25maWd1cmVkIGFzIFJTU0kgcGF0dGVybiAxKSB3aWxsIGJlIGJlZm9yZSBvciBhZnRlciB0aGUgYnVyc3Qgc3RhcnQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBsb2NhdGlvbl9zaWduKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduIH0sIHsgLm5hbWUgPSAic3RhcnRfcGF0dGVybiIsIC5kZXNjciA9ICJ0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGN5Y2xlIG9mIHRoZSBwYXR0ZXJuICh3aWxsIGJlIHRyYW5zbWl0dGVkIG9uY2UpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiwgc3RhcnRfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1pZGRsZV9wYXR0ZXJuIiwgLmRlc2NyID0gInRoZSB2YWx1ZSBvZiB0aGUgcGF0dGVybiB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgbWlkZGxlX3JlcGV0aXRpb24gdGltZXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBtaWRkbGVfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxhc3RfcGF0dGVybiIsIC5kZXNjciA9ICJ0aGUgdmFsdWUgb2YgdGhlIGxhc3QgY3ljbGUgb2YgdGhlIHBhdHRlcm4uIHdpbGwgYmUgdHJhbnNtaXR0ZWQgb25jZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24sIGxhc3RfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1pZGRsZV9yZXBlcnRpdGlvbiIsIC5kZXNjciA9ICJ0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBtaWRkbGUgcGF0dGVybiB3aWxsIGJlIHJlcGVhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiwgbWlkZGxlX3JlcGVydGl0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWluaW11bV9idXJzdCIsIC5kZXNjciA9ICJ0aGUgbWluaW11bSBidXJzdCBzaXplIG5lZWRlZCBtZWFzdXJlbWVudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiwgbWluaW11bV9idXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJncG9uIFJTU0kgZ2VuZXJhbCBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfTk9ORSB9LCB7IC5uYW1lID0gImFjdGl2YXRlIiwgLnZhbCA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9BQ1RJVkFURSB9LCB7IC5uYW1lID0gImRpc2FibGUiLCAudmFsID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIiwgLmRlc2NyID0gIk9OVSBwb3N0IGRpc2NvdmVyeSBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImludGVydmFsIiwgLmRlc2NyID0gIlNOIHByb2Nlc3MgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uLCBpbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIlNOIHByb2Nlc3MgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJvbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSIsIC5kZXNjciA9ICJBdXRvbWF0aWMgb3BlcmF0aW9uIGZvbGxvd2luZyBPTlUgZGlzY292ZXJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uLCBvbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24iLCAuZGVzY3IgPSAiR1BPTiBTTiBBY3F1aXNpdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSB9LCB7IC5uYW1lID0gImxhX2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OIH0sIHsgLm5hbWUgPSAiYmNkciIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFIgfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DIH0sIHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMgfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DIH0sIHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMgfSwgeyAubmFtZSA9ICJsYV9yZXN5bmNfcG9sYXJpdHkiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc3luY19wb2xhcml0eSIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZIH0sIHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TIH0sIHsgLm5hbWUgPSAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMgfSwgeyAubmFtZSA9ICJyeF9jb25maWd1cmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlhfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gImVuZXJneV9kZXRlY3QiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkVSR1lfREVURUNUIH0sIHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4gfSwgeyAubmFtZSA9ICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiB9LCB7IC5uYW1lID0gInByZWFtYmxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUgfSwgeyAubmFtZSA9ICJkZWxpbWl0ZXIiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIgfSwgeyAubmFtZSA9ICJndWFyZF9iaXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUyB9LCB7IC5uYW1lID0gInNlcmRlc19jb25maWd1cmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJwbG9fcmFuZ2luZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19SQU5HSU5HIH0sIHsgLm5hbWUgPSAicGxvX2RhdGEiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fREFUQSB9LCB7IC5uYW1lID0gInJzc2lfbm9ybWFsX2NvbmZpZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRyB9LCB7IC5uYW1lID0gInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfUlNTSV9SRVNZTkNfQ09OVFJPTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX3RyeF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl90cnhfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fdHJ4X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fdHJ4X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX3RyeF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWpvciIsIC5kZXNjciA9ICJNYWpvciAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiwgbWFqb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaW5vciIsIC5kZXNjciA9ICJNaW5vciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaG9zdF9zd192ZXJzaW9uLCBtaW5vciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJldmlzaW9uIiwgLmRlc2NyID0gIlJldmlzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24sIHJldmlzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2hleCB9LCB7IC5uYW1lID0gIm1vZGVsIiwgLmRlc2NyID0gIk1vZGVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24sIG1vZGVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImJ1aWxkX3RpbWUiLCAuZGVzY3IgPSAiRmlybXdhcmUgU1cgYnVpbGQgdGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaG9zdF9zd192ZXJzaW9uLCBidWlsZF90aW1lKSwgLnR5cGUgPSAmc3RyaW5nXzMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uID0geyAubmFtZSA9ICJiY21vbHRfaG9zdF9zd192ZXJzaW9uIiwgLmRlc2NyID0gIkhvc3QgU1cgVmVyc2lvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9od19wb25faWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX2lkXzEiLCAuZGVzY3IgPSAiTFNCIDMyIGJpdHMgb2YgUE9OIElELiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaHdfcG9uX2lkLCBwb25faWRfMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwb25faWRfMiIsIC5kZXNjciA9ICJNU0IgMTkgYml0cyBvZiBQT04gSUQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9od19wb25faWQsIHBvbl9pZF8yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2h3X3Bvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2h3X3Bvbl9pZCIsIC5kZXNjciA9ICJIVyBQT04gSUQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfaHdfcG9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2h3X3Bvbl9pZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9od19wb25faWRfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJtZW1vcnlfYWxsb2NhdGlvbl9mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfTUVNT1JZX0FMTE9DQVRJT05fRkFJTFVSRSB9LCB7IC5uYW1lID0gInVuc3VwcG9ydGVkX2ZpbGVfdHlwZSIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1VOU1VQUE9SVEVEX0ZJTEVfVFlQRSB9LCB7IC5uYW1lID0gImNyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0NSQ19FUlJPUiB9LCB7IC5uYW1lID0gImJsb2NrX291dF9vZl9zeW5jIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQkxPQ0tfT1VUX09GX1NZTkMgfSwgeyAubmFtZSA9ICJpbnRlcm5hbF9lcnJvciIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOVEVSTkFMX0VSUk9SIH0sIHsgLm5hbWUgPSAiaW52YWxpZF9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOVkFMSURfU1RBVEUgfSwgeyAubmFtZSA9ICJwcmVtYXR1cmVfdGVybWluYXRpb24iLCAudmFsID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19QUkVNQVRVUkVfVEVSTUlOQVRJT04gfSwgeyAubmFtZSA9ICJhY2tfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0FDS19USU1FT1VUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIiwgLmRlc2NyID0gIkltYWdlIHRyYW5zZmVyIHN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZW5hYmxlZCIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIHdpbGwgbGltaXQgdGhlIHJhdGUgb2YgaW5kaWNhdGlvbnMgc2VudCB0byB0aGUgaG9zdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2luZGljYXRpb25fc2hhcGluZywgZW5hYmxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1heF9yYXRlIiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIGluZGljYXRpb25zIHBlciBzZWNvbmQgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcsIG1heF9yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heF9idXJzdCIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBpbmRpY2F0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHNlbnQgYmFjay10by1iYWNrLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nLCBtYXhfYnVyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nID0geyAubmFtZSA9ICJiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIiwgLmRlc2NyID0gIlJhdGUgbGltaXRpbmcgLyBzaGFwaW5nIGZvciB0aGUgaW5kaWNhdGlvbiBjaGFubmVsLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2l3Zl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpcmVjdF9tYXBwaW5nX21vZGUiLCAudmFsID0gQkNNT0xUX0lXRl9NT0RFX0RJUkVDVF9NQVBQSU5HX01PREUgfSwgeyAubmFtZSA9ICJwZXJfZmxvd19tb2RlIiwgLnZhbCA9IEJDTU9MVF9JV0ZfTU9ERV9QRVJfRkxPV19NT0RFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaXdmX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9pd2ZfbW9kZSIsIC5kZXNjciA9ICJpd2YgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9pd2ZfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9pd2ZfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN5bmNfY29udHJvbCIsIC5kZXNjciA9ICJ1c2VkIGluIG5vcm1hbCBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uLCByZXN5bmNfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19yZXN5bmNfY29udHJvbCIsIC5kZXNjciA9ICJ1c2VkIGluIHJhbmdpbmcgbW9kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcmFuZ2luZyBjeWNsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiwgcmFuZ2luZ19yZXN5bmNfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiTEEgcmVzeW5jIHBhdHRlcm4gY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHN0cmluZ18yMDQ4ID0geyAubmFtZSA9ICJzdHJpbmdbMjA0OF0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyMDQ4IiwgLnNpemUgPSBzaXplb2YoY2hhclsyMDQ4XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2J1ZmZlcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJidWZmIiwgLmRlc2NyID0gImJ1ZmYiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19idWZmZXIsIGJ1ZmYpLCAudHlwZSA9ICZzdHJpbmdfMjA0OCB9LCB7IC5uYW1lID0gIm1zZ190b19yZWFkIiwgLmRlc2NyID0gIm1zZ190b19yZWFkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfYnVmZmVyLCBtc2dfdG9fcmVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2J1ZmZlciIsIC5kZXNjciA9ICJsb2cgYnVmZmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19idWZmZXIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nX2J1ZmZlcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9sb2dfbGV2ZWwiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfTEVWRUwgfSwgeyAubmFtZSA9ICJkZWZhdWx0X2xvZ190eXBlIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUgfSwgeyAubmFtZSA9ICJsb2dfbGV2ZWxfcHJpbnQiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5UIH0sIHsgLm5hbWUgPSAibG9nX2xldmVsX3NhdmUiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1NBVkUgfSwgeyAubmFtZSA9ICJsb2dfdHlwZSIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSB9LCB7IC5uYW1lID0gImxvZ19zdHlsZSIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUgfSwgeyAubmFtZSA9ICJsb2dfbmFtZSIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxvZ19pZCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQgfSwgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9SRVNFUlZFRCB9LCB7IC5uYW1lID0gIm5hbWUiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2VudHJ5X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1zZ19jb3VudCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UIH0sIHsgLm5hbWUgPSAibG9zdF9tc2dfY291bnQiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dfZW50cnlfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2ZpbGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3JhbSIsIC52YWwgPSBCQ01PTFRfTE9HX0ZJTEVfSURfU1JBTSB9LCB7IC5uYW1lID0gImRkciIsIC52YWwgPSBCQ01PTFRfTE9HX0ZJTEVfSURfRERSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2ZpbGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZmlsZV9pZCIsIC5kZXNjciA9ICJsb2cgZmlsZSBpZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZmlsZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZmlsZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfbGV2ZWxfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9fbG9nIiwgLnZhbCA9IEJDTU9MVF9MT0dfTEVWRUxfTk9fTE9HIH0sIHsgLm5hbWUgPSAiZmF0YWwiLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9GQVRBTCB9LCB7IC5uYW1lID0gImVycm9yIiwgLnZhbCA9IEJDTU9MVF9MT0dfTEVWRUxfRVJST1IgfSwgeyAubmFtZSA9ICJ3YXJuaW5nIiwgLnZhbCA9IEJDTU9MVF9MT0dfTEVWRUxfV0FSTklORyB9LCB7IC5uYW1lID0gImluZm8iLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9JTkZPIH0sIHsgLm5hbWUgPSAiZGVidWciLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9ERUJVRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19sZXZlbCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19sZXZlbCIsIC5kZXNjciA9ICJsb2cgbGV2ZWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2xldmVsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ19sZXZlbF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfc3R5bGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9ybWFsIiwgLnZhbCA9IEJDTU9MVF9MT0dfU1RZTEVfTk9STUFMIH0sIHsgLm5hbWUgPSAiYm9sZCIsIC52YWwgPSBCQ01PTFRfTE9HX1NUWUxFX0JPTEQgfSwgeyAubmFtZSA9ICJ1bmRlcmxpbmUiLCAudmFsID0gQkNNT0xUX0xPR19TVFlMRV9VTkRFUkxJTkUgfSwgeyAubmFtZSA9ICJibGluayIsIC52YWwgPSBCQ01PTFRfTE9HX1NUWUxFX0JMSU5LIH0sIHsgLm5hbWUgPSAicmV2ZXJzZV92aWRlbyIsIC52YWwgPSBCQ01PTFRfTE9HX1NUWUxFX1JFVkVSU0VfVklERU8gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfc3R5bGUgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfc3R5bGUiLCAuZGVzY3IgPSAibG9nIHN0eWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19zdHlsZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfc3R5bGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfTE9HX1RZUEVfTk9ORSB9LCB7IC5uYW1lID0gInByaW50IiwgLnZhbCA9IEJDTU9MVF9MT0dfVFlQRV9QUklOVCB9LCB7IC5uYW1lID0gInNhdmUiLCAudmFsID0gQkNNT0xUX0xPR19UWVBFX1NBVkUgfSwgeyAubmFtZSA9ICJib3RoIiwgLnZhbCA9IEJDTU9MVF9MT0dfVFlQRV9CT1RIIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfdHlwZSIsIC5kZXNjciA9ICJsb2cgdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSIH0sIHsgLm5hbWUgPSAid3JhcF9hcm91bmQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQgfSwgeyAubmFtZSA9ICJjbGVhcl9hZnRlcl9yZWFkIiwgLnZhbCA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0NMRUFSX0FGVEVSX1JFQUQgfSwgeyAubmFtZSA9ICJlbmFibGVfbG9nIiwgLnZhbCA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0cgfSwgeyAubmFtZSA9ICJsb2dfbmFtZXMiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dnZXJfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX2NsZWFyX2xvZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9LRVlfSURfUkVTRVJWRUQgfSwgeyAubmFtZSA9ICJmaWxlX2lkIiwgLnZhbCA9IEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaW5lc19pbl9sb2ciLCAudmFsID0gQkNNT0xUX0xPR0dFUl9TVEFUX0lEX0xJTkVTX0lOX0xPRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRyb3AiLCAudmFsID0gQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RST1AgfSwgeyAubmFtZSA9ICJkZWZhdWx0X2Zsb3ciLCAudmFsID0gQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RFRkFVTFRfRkxPVyB9LCB7IC5uYW1lID0gInZpZCIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfVklEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2sgPSB7IC5uYW1lID0gImJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayIsIC5kZXNjciA9ICJNQUMgdGFibGUgbWlzcyBmYWxsYmFjayIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFja19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3JtYWwiLCAudmFsID0gQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX05PUk1BTCB9LCB7IC5uYW1lID0gIm1vdmUiLCAudmFsID0gQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX01PVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlIiwgLmRlc2NyID0gIk1BQyB0YWJsZSBMZWFybmluZyBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtaXNzX2ZhbGxiYWNrIiwgLmRlc2NyID0gIkJlaGF2aW9yIGZvciBkb3duc3RyZWFtIHRyYWZmaWMgd2hlbiBNQUMgdGFibGUgbG9va3VwIGZhaWxzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIG1pc3NfZmFsbGJhY2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayB9LCB7IC5uYW1lID0gImRlZmF1bHRfZmxvd19pZCIsIC5kZXNjciA9ICJGbG93IElEIGFzc2lnbmVkIHRvIHVwc3RyZWFtIHRyYWZmaWMgb24gYSBNQUMgdGFibGUgbWlzcyBpZiBtaXNzX2ZhbGxiYWNrIGlzIHNldCB0byBkZWZhdWx0X2Zsb3cuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgZGVmYXVsdF9mbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImFnaW5nX3RpbWUiLCAuZGVzY3IgPSAiQWdpbmcgdGltZSBpbiBzZWNvbmRzLiAgSWYgbm8gdHJhZmZpYyBpcyBzZWVuIGZvciBhIGdpdmVuIE1BQyBhZGRyZXNzIC8gVklEIGZvciB0aGlzIGxlbmd0aCBvZiB0aW1lLCB0aGUgZW50cnkgd2lsbCBhZ2UgYW5kIHRoZSBob3N0IHdpbGwgYmUgbm90aWZpZWQgdmlhIGluZGljYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYWdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJsZWFybmluZ19tb2RlIiwgLmRlc2NyID0gIkxlYXJuaW5nIHRhYmxlIG1vZGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgbGVhcm5pbmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlIH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX21hY19sZWFybmluZyIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCBuZXcgTUFDIHRhYmxlIGVudHJpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgdGhlIGZpcnN0IHRpbWUgYSBuZXcgTUFDIGFkZHJlc3MvVklEIGNvbWJpbmF0aW9uIGlzIHNlZW4uICBJZiBkaXNhYmxlZCwgbm8gYWN0aW9ucyBhcmUgdGFrZW4gYXV0b21hdGljYWxseSBleGNlcHQgbm90aWZ5aW5nIHRoZSBob3N0IHZpYSBpbmRpY2F0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGF1dG9tYXRpY19tYWNfbGVhcm5pbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX21hY19hZ2luZyIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCBNQUMgdGFibGUgZW50cmllcyBhcmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhZ2UuICBJZiBkaXNhYmxlZCwgbm8gYWN0aW9ucyBhcmUgdGFrZW4gYXV0b21hdGljYWxseSBleGNlcHQgbm90aWZ5aW5nIHRoZSBob3N0IHZpYSBpbmRpY2F0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGF1dG9tYXRpY19tYWNfYWdpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX21hY19tb3ZlIiwgLmRlc2NyID0gIk9ubHkgYXBwbGljYWJsZSBpZiBsZWFybmluZ19tb2RlIGlzIG1vdmUuICBJZiBlbmFibGVkLCBNQUMgdGFibGUgZW50cmllcyBhcmUgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW4gYSBNQUMgbW92ZSBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBJZiBkaXNhYmxlZCwgbm8gYWN0aW9ucyBhcmUgdGFrZW4gYXV0b21hdGljYWxseSBleGNlcHQgbm90aWZ5aW5nIHRoZSBob3N0IHZpYSBpbmRpY2F0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGF1dG9tYXRpY19tYWNfbW92ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfc3RhdGljX21vZGUiLCAuZGVzY3IgPSAiSWYgZW5hYmxlZCwgYWxsIE1BQyBlbnRyaWVzIHRoYXQgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgdmlhIGF1dG9tYXRpY19tYWNfbGVhcm5pbmcgYW5kIGF1dG9tYXRpY19tYWNfbW92ZSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RhdGljIChub3QgYWdpbmcpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGF1dG9tYXRpY19zdGF0aWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBNYWNBZGRyZXNzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcywgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCA9IHsgLm5hbWUgPSAiYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgTWFjQWRkcmVzcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IDIwNDggfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvdXRlcl92aWQiLCAudmFsID0gQkNNT0xUX01BUFBJTkdfVEFHX01FVEhPRF9PVVRFUl9WSUQgfSwgeyAubmFtZSA9ICJpbm5lcl92aWQiLCAudmFsID0gQkNNT0xUX01BUFBJTkdfVEFHX01FVEhPRF9JTk5FUl9WSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgPSB7IC5uYW1lID0gImJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QiLCAuZGVzY3IgPSAiTWFwcGluZyB0YWcgbWV0aG9kIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2Rfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdGF0dXNfY2hhbmdlZCIsIC52YWwgPSBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRVU19DSEFOR0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlbW90ZV9sb29wYmFjayIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0sgfSwgeyAubmFtZSA9ICJsaW5lX2xvb3BiYWNrIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX0xJTkVfTE9PUEJBQ0sgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9NQUNfQUREUkVTUyB9LCB7IC5uYW1lID0gIm5uaV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUyB9LCB7IC5uYW1lID0gIm5uaV9iYWNrdXBfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTIH0sIHsgLm5hbWUgPSAiYWN0aXZlX25uaSIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9BQ1RJVkVfTk5JIH0sIHsgLm5hbWUgPSAibm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUyB9LCB7IC5uYW1lID0gImF1dG9zd2l0Y2giLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCB9LCB7IC5uYW1lID0gImZsb3dfY29udHJvbCIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX2Nvbm5lY3Rpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicHJpbWFyeSIsIC52YWwgPSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fUFJJTUFSWSB9LCB7IC5uYW1lID0gImJhY2t1cCIsIC52YWwgPSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fQkFDS1VQIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfY29ubmVjdGlvbiIsIC5kZXNjciA9ICJOTkkgQ29ubmVjdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfY29ubmVjdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ubmlfY29ubmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJpdmFsZW50X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZhbHNlIiwgLnZhbCA9IEJDTU9MVF9UUklWQUxFTlRfRkFMU0UgfSwgeyAubmFtZSA9ICJ0cnVlIiwgLnZhbCA9IEJDTU9MVF9UUklWQUxFTlRfVFJVRSB9LCB7IC5uYW1lID0gIm5vdF9hcHBsaWNhYmxlIiwgLnZhbCA9IEJDTU9MVF9UUklWQUxFTlRfTk9UX0FQUExJQ0FCTEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cml2YWxlbnQgPSB7IC5uYW1lID0gImJjbW9sdF90cml2YWxlbnQiLCAuZGVzY3IgPSAiVHJpdmFsZW50IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyaXZhbGVudCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cml2YWxlbnRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX3N0YXR1cyIsIC5kZXNjciA9ICJUaGUgbG9jYWwgYW5kIHJlbW90ZSBwYXJ0bmVycyBhcmUgYWJsZWQgYW5kIHJlYWR5IHRvIHRyYW5zbWl0L3JlY2VpdmUgdHJhZmZpYy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9saW5rX3N0YXR1cywgbGlua19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cml2YWxlbnQgfSwgeyAubmFtZSA9ICJzaWduYWxfZGV0ZWN0ZWQiLCAuZGVzY3IgPSAiU2VyZGVzIGNvbnRyb2xsZXIgaGFzIGRldGVjdGVkIGVuZXJneSBvbiB0aGUgbGluZS4gIGRlYnVnZ2luZyBwdXJwb3NlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2xpbmtfc3RhdHVzLCBzaWduYWxfZGV0ZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cml2YWxlbnQgfSwgeyAubmFtZSA9ICJwbWRfbG9ja2VkIiwgLmRlc2NyID0gIkluZGljYXRlcyBQTUQgbG9ja2VkLiAgZGVidWdnaW5nIHB1cnBvc2UuICBJZiB0aGlzIGlzIHRydWUsIGJ1dCB0aGUgbGlua3Mgc3RhdHVzIGlzIG5vdCwgdGhhdCBtZWFucyB0aGUgdHJhbnNjZWl2ZXIgaXMgbm90IGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfbGlua19zdGF0dXMsIHBtZF9sb2NrZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cml2YWxlbnQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfbGlua19zdGF0dXMiLCAuZGVzY3IgPSAiTk5JIExpbmsgU3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9saW5rX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX2xpbmtfc3RhdHVzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnhfdmdhIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EgfSwgeyAubmFtZSA9ICJyeF9wZiIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYgfSwgeyAubmFtZSA9ICJyeF9sZnBmIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGIH0sIHsgLm5hbWUgPSAicnhfZGZlMSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSB9LCB7IC5uYW1lID0gInJ4X2RmZTIiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIgfSwgeyAubmFtZSA9ICJyeF9kZmUzIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzIH0sIHsgLm5hbWUgPSAicnhfZGZlNCIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCB9LCB7IC5uYW1lID0gInJ4X2RmZTUiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUgfSwgeyAubmFtZSA9ICJ0eF9wcmUiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSB9LCB7IC5uYW1lID0gInR4X21haW4iLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX01BSU4gfSwgeyAubmFtZSA9ICJ0eF9wb3N0MSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MiIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MyIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDMgfSwgeyAubmFtZSA9ICJ0eF9hbXAiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3NlcmRlc19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAiaW5zdGFuY2UiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc2VyZGVzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF9mcmFtZXNfNjQiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTggfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUyB9LCB7IC5uYW1lID0gInJ4X2dvb2RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3VuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9icm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfZmNzX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X2NvbnRyb2xfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3BhdXNlX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfcGZjX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX29wY29kZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFIH0sIHsgLm5hbWUgPSAicnhfdW5zdXBwb3J0ZWRfZGEiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBIH0sIHsgLm5hbWUgPSAicnhfYWxpZ25tZW50X2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UgfSwgeyAubmFtZSA9ICJyeF9jb2RlX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9vdmVyc2l6ZWRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfamFiYmVyX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X210dV9jaGVja19lcnJvcnMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9wcm9taXNjdW91c19mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3ZsYW5fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2RvdWJsZV92bGFuX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdHJ1bmNhdGVkX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3VuZGVyc2l6ZV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9mcmFnbWVudGVkX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9ydW50X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNjQiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTggfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X2dvb2RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X3VuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9icm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfcGF1c2VfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9wZmNfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfamFiYmVyX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2Zjc19lcnJvcnMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlMgfSwgeyAubmFtZSA9ICJ0eF9jb250cm9sX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9vdmVyc2l6ZV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2ZyYWdtZW50ZWRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2Vycm9yX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRVJST1JfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfdmxhbl9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZG91YmxlX3ZsYW5fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9ydW50X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF91bmRlcnJ1bl9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUyB9LCB7IC5uYW1lID0gImxpbmsiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LIH0sIHsgLm5hbWUgPSAicHJldmlvdXNfYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFIH0sIHsgLm5hbWUgPSAibmV3X2FjdGl2ZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19BQ1RJVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXR1c19jaGFuZ2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZW5kX3BlcmlvZCIsIC5kZXNjciA9ICJUaGUgcGVyaW9kIGF0IHdoaWNoIHRvIHNlbmQgT0FNIGluZm8gZnJhbWVzLCBhbmQgZXhwZWN0IGluZm8gcmVzcG9uc2VzIG9uIHRoaXMgbGluayAoaW4gc2Vjb25kcykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZywgc2VuZF9wZXJpb2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAidHJhbnNtaXRfZnJhbWUiLCAuZGVzY3IgPSAiVHJhbnNtaXQgZnJhbWUgb2N0ZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZywgdHJhbnNtaXRfZnJhbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNiB9LCB7IC5uYW1lID0gImlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZSIsIC5kZXNjciA9ICJJZ25vcmVkIHJlY2VpdmUgZnJhbWUgdGVtcGxhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCBpZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgfSwgeyAubmFtZSA9ICJyZWNlaXZlX3RpbWVvdXQiLCAuZGVzY3IgPSAiVGhlIHRpbWUgKGluIHNlY29uZHMpIHRvIHJlcG9ydCBPQU0gdGltZW91dCBhZnRlciB0aGUgbGFzdCByZWNlaXZlZCBPQU0gZnJhbWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZywgcmVjZWl2ZV90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1heGltdW1fcmVjZWl2ZV9zaXplIiwgLmRlc2NyID0gIk1heGltdW0gc2l6ZSBvZiByZWNlaXZlZCBmcmFtZXMuICBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gemVybyB3aWxsIGNhdXNlIGFsbCBPQU0gZnJhbWVzIHRvIGJlIGRyb3BwZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZywgbWF4aW11bV9yZWNlaXZlX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyIsIC5kZXNjciA9ICJPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vZG5fY2xhc3Nfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibjEiLCAudmFsID0gQkNNT0xUX09ETl9DTEFTU19OMSB9LCB7IC5uYW1lID0gIm4yIiwgLnZhbCA9IEJDTU9MVF9PRE5fQ0xBU1NfTjIgfSwgeyAubmFtZSA9ICJlMSIsIC52YWwgPSBCQ01PTFRfT0ROX0NMQVNTX0UxIH0sIHsgLm5hbWUgPSAiZTIiLCAudmFsID0gQkNNT0xUX09ETl9DTEFTU19FMiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29kbl9jbGFzcyA9IHsgLm5hbWUgPSAiYmNtb2x0X29kbl9jbGFzcyIsIC5kZXNjciA9ICJPRE4gQ2xhc3MiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb2RuX2NsYXNzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29kbl9jbGFzc19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyZSIsIC52YWwgPSBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9DT05GSUdVUkUgfSwgeyAubmFtZSA9ICJyZW1vdmUiLCAudmFsID0gQkNNT0xUX09NQ0lfUE9SVF9JRF9PUEVSQVRJT05fUkVNT1ZFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24iLCAuZGVzY3IgPSAiT01DSSBQb3J0IElEIG9wZXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb251X29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfT05VX09QRVJBVElPTl9JTkFDVElWRSB9LCB7IC5uYW1lID0gImFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkUgfSwgeyAubmFtZSA9ICJkaXNhYmxlIiwgLnZhbCA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0RJU0FCTEUgfSwgeyAubmFtZSA9ICJlbmFibGUiLCAudmFsID0gQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkgfSwgeyAubmFtZSA9ICJhd2FrZV9mcmVlIiwgLnZhbCA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FXQUtFX0ZSRUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfb251X29wZXJhdGlvbiIsIC5kZXNjciA9ICJPTlUgb3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29udV9vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb251X29wZXJhdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWxfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaW5jcmVhc2UiLCAudmFsID0gQkNNT0xUX09OVV9QT1dFUl9MRVZFTF9JTkNSRUFTRSB9LCB7IC5uYW1lID0gImRlY3JlYXNlIiwgLnZhbCA9IEJDTU9MVF9PTlVfUE9XRVJfTEVWRUxfREVDUkVBU0UgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgPSB7IC5uYW1lID0gImJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwiLCAuZGVzY3IgPSAiT05VIFBvd2VyIGxldmVsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29udV9wb3dlcl9sZXZlbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWxfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaWxvd3Bvd2VyIiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGFueSBPTlUgb24gdGhpcyBOSSBtYXkgc3BlbmQgaW4gYSBsb3cgcG93ZXIgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uLCBpbG93cG93ZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiaWF3YXJlIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIGV2ZXJ5IE9OVSBvbiBoaXMgTkkgbXVzdCBzcGVuZCBpbiBhbiBhd2FyZSBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24sIGlhd2FyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpdHJhbnNpbml0IiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHJlcXVpcmVkIGJ5IGFueSBPTlUgb24gdGhpcyBOSSB0byBwb3dlciB1cCBpdHMgdHJhbnNtaXR0ZXIgb25seSBmcm9tIGEgbG93IHBvd2VyIHN0YXRlIGluIHVuaXRzIG9mIDEyNXVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiwgaXRyYW5zaW5pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJpdHhpbml0IiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHJlcXVpcmVkIGJ5IGFueSBPTlUgb24gdGhpcyBOSSB0byBwb3dlciB1cCBpdHMgdHJhbnNjZWl2ZXIgKHRyYW5zbWl0dGVyICsgcmVjZWl2ZXIpIGZyb20gYSBsb3cgcG93ZXIgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uLCBpdHhpbml0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImlyeG9mZiIsIC5kZXNjciA9ICJUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBhbnkgT05VIG9uIHRoaXMgTkkgbWF5IHNwZW5kIHdpdGggaXRzIHJlY2VpdmVyIGRpc2FibGVkIGluIHVuaXRzIG9mIDEyNXVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiwgaXJ4b2ZmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxvd19wb3dlcl9jbG9iaSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG5vbi1jb250aWd1b3VzIG1pc3NpbmcgYWxsb2NhdGlvbnMgdG8gYWxsb3cgYmVmb3JlIHJhaXNpbmcgdGhlIExPU2kvTE9GaS9MT0JpIGFsYXJtcyBvbiBhbnkgT05VIG9uIHRoaXMgTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uLCBsb3dfcG93ZXJfY2xvYmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgT05VIHBvd2VyIG1hbmFnZW1lbnQgZmVhdHVyZS4gVGhlc2Ugc2hvdWxkIG1hdGNoIHRoZSBwYXJhbWV0ZXJzIHNlbnQgdG8gdGhlIE9OVSB2aWEgT01DSS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInRzb3VyY2UiLCAuZGVzY3IgPSAiVHNvdXJjZSB0aW1lciBpbiBtc2VjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24sIHRzb3VyY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAidHRhcmdldCIsIC5kZXNjciA9ICJUdGFyZ2V0IHRpbWVyIGluIG1zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiwgdHRhcmdldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9yZXF1aXJlZCIsIC5kZXNjciA9ICJpcyByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBwYXJ0IG9mIHRoZSB0dW5pbmcgaW4gcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uLCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9yZXF1aXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJvbnUgdHVuaW5nIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90Y19wcm90b2NvbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0Y19sYXllcl9wcm90b2NvbF9nXzk4N19wXzMiLCAudmFsID0gQkNNT0xUX1RDX1BST1RPQ09MX1RDX0xBWUVSX1BST1RPQ09MX0dfOTg3X1BfMyB9LCB7IC5uYW1lID0gInRjX2xheWVyX3Byb3RvY29sX2dfOTg5X3BfMyIsIC52YWwgPSBCQ01PTFRfVENfUFJPVE9DT0xfVENfTEFZRVJfUFJPVE9DT0xfR185ODlfUF8zIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdGNfcHJvdG9jb2wgPSB7IC5uYW1lID0gImJjbW9sdF90Y19wcm90b2NvbCIsIC5kZXNjciA9ICJUQyBsYXllciBwcm90b2NvbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90Y19wcm90b2NvbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90Y19wcm90b2NvbF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2lkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFkbWluaXN0cmF0aXZlX2xhYmVsIiwgLmRlc2NyID0gIk1TQiAyOCBiaXQgb2YgdGhlIFBPTiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2lkLCBhZG1pbmlzdHJhdGl2ZV9sYWJlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJkd2xjaF9pZCIsIC5kZXNjciA9ICJMU0IgNCBiaXRzIG9mIHRoZSBQT04gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9pZCwgZHdsY2hfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9wb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcyB0aGUgVFdETSBjaGFubmVsIHRlcm1pbmF0aW9uIHdpdGhpbiBhIGNlcnRhaW4gZG9tYWluIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2lkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlIiwgLmRlc2NyID0gIkluZGljYXRlcyB3aGV0aGVyIHRoZSBUcmFuc21pdCBPcHRpY2FsIExldmVsIChUT0wpIGNvbnRhaW5zIHRoZSBsYXVuY2ggcG93ZXIgb2YgdGhlIE9UTCAoUkU9MCkgb3Igb2YgYSByZWFjaCBleHRlbmRlciAoUkU9MSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29wZXJhdGlvbl9jb250cm9sLCByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm9kbl9jbGFzcyIsIC5kZXNjciA9ICJJZGVudGlmaWVzIHRoZSBub21pbmFsIG9wdGljYWwgcGFyYW1ldGVycyBvZiB0aGUgdHJhbnNjZWl2ZXIgYWNjb3JkaW5nIHRvIHRoZSBPRE4gT3B0aWNhbCBQYXRoIExvc3MgKE9QTCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29wZXJhdGlvbl9jb250cm9sLCBvZG5fY2xhc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vZG5fY2xhc3MgfSwgeyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgZG93bnN0cmVhbSBGRUMuIERlZmF1bHQgaXMgRW5hYmxlLiBBdHRyaWJ1dGUgY2FuIGJlIHNldCBvbmx5IHdoZW4gUE9OIE5JIHN0YXRlIGlzIEluYWN0aXZlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIGRzX2ZlY19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInByb3RvY29sIiwgLmRlc2NyID0gIldoZW4gc3lzdGVtIG1vZGUgaXMgTkdQT04yLCB0aGlzIHBhcmFtZXRlciBJbmRpY2F0ZSB0aGUgVEMgbGF5ZXIgcHJvdG9jb2w6IElUVS1UIEcuOTg5LjMgb3IgSVRVLVQgRy45ODcuMyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIHByb3RvY29sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdGNfcHJvdG9jb2wgfSwgeyAubmFtZSA9ICJkc19saW5rX3R5cGUiLCAuZGVzY3IgPSAiT3B0aWNhbCBsaW5rIHR5cGUgKFVuc3BlY2lmaWVkLCBBLCBCLCBCb3RoKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIGRzX2xpbmtfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xpbmtfdHlwZSB9LCB7IC5uYW1lID0gInBvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVzIHRoZSBUV0RNIGNoYW5uZWwgdGVybWluYXRpb24gd2l0aGluIGEgY2VydGFpbiBkb21haW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29wZXJhdGlvbl9jb250cm9sLCBwb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWQgfSwgeyAubmFtZSA9ICJjIiwgLmRlc2NyID0gIlRyYW5zbWl0IG9wdGljYWwgbGV2ZWwgKFRPTCkgcmVmZXJlbmNlIHBvaW50IGluZGljYXRvcjogUy9SLUNHIG9yIFMvUi1DUCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIGMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vcGVyYXRpb25fY29udHJvbCA9IHsgLm5hbWUgPSAiYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIiwgLmRlc2NyID0gIk9wZXJhdGlvbiBDb250cm9sIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29wZXJhdGlvbl9jb250cm9sKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJnZW1fcG9ydF9ub3RfYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX0dFTV9QT1JUX05PVF9BQ1RJVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yID0geyAubmFtZSA9ICJiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciIsIC5kZXNjciA9ICJQYWNrZXQgSW5qZWN0aW9uIEVycm9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wYWNrZXRfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjcHUiLCAudmFsID0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSB9LCB7IC5uYW1lID0gIm9tY2kiLCAudmFsID0gQkNNT0xUX1BBQ0tFVF9UWVBFX09NQ0kgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3BhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3BhY2tldF90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3BhY2tldF90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX05PTkUgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9pbmNvbnNpc3RlbmN5IiwgLnZhbCA9IEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9JTkNPTlNJU1RFTkNZIH0sIHsgLm5hbWUgPSAicGFzc3dvcmRfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX01JU01BVENIIH0sIHsgLm5hbWUgPSAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fdGltZW91dCIsIC52YWwgPSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNIH0sIHsgLm5hbWUgPSAibG9zX2V2ZW50IiwgLnZhbCA9IEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9MT1NfRVZFTlQgfSwgeyAubmFtZSA9ICJkaXNhYmxlX2V2ZW50IiwgLnZhbCA9IEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9ESVNBQkxFX0VWRU5UIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJQYXNzd29yZCBhdXRoZW50aWNhdGlvbiBmYWlsIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbnRlcnZhbCIsIC5kZXNjciA9ICJpbnRlcnZhbCBpbiBtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgPSB7IC5uYW1lID0gImJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIiwgLmRlc2NyID0gIlBlcmlvZGljIFN0YW5kYnkgUE9OIG1vbml0b3JpbmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb2xhcml0eV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsb3ciLCAudmFsID0gQkNNT0xUX1BPTEFSSVRZX0xPVyB9LCB7IC5uYW1lID0gImhpZ2giLCAudmFsID0gQkNNT0xUX1BPTEFSSVRZX0hJR0ggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb2xhcml0eSA9IHsgLm5hbWUgPSAiYmNtb2x0X3BvbGFyaXR5IiwgLmRlc2NyID0gIlBvbGFyaXR5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3BvbGFyaXR5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3BvbGFyaXR5X3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWxfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9sbGluZ19kaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9QT0xMSU5HX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAidXNfNTAwIiwgLnZhbCA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX1VTXzUwMCB9LCB7IC5uYW1lID0gIm1zXzEiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfMSB9LCB7IC5uYW1lID0gIm1zXzIiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfMiB9LCB7IC5uYW1lID0gIm1zXzQiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfNCB9LCB7IC5uYW1lID0gIm1zXzgiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfOCB9LCB7IC5uYW1lID0gIm1zXzE2IiwgLnZhbCA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzE2IH0sIHsgLm5hbWUgPSAiYXV0b21hdGljIiwgLnZhbCA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImJjbW9sdF9wb2xsaW5nX2ludGVydmFsIiwgLmRlc2NyID0gIlBvbGxpbmcgSW50ZXJ2YWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9sbGluZ19pbnRlcnZhbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJiYW5kd2lkdGhfa2JwcyIsIC5kZXNjciA9ICJSYXRlIGluIGticHMsIDAgaXMgZGlzYWJsZWQsIElmIHJhdGUgaXMgPjFHIHRoZW4gdXNlIDI1NmticHMgaW5jcmVtZW50cywgaWYgcmF0ZSBpcyA8IDFHIHRoZW4gdXNlIDY0a2JwcyBpbmNyZW1lbnRzLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyLCBiYW5kd2lkdGhfa2JwcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtYnNfa0IiLCAuZGVzY3IgPSAiTWF4aW11bSBCdXJzdCBTaXplIGluIEtCIDogcmFuZ2UgaXMgMktCIHRvIDRNQiBpbiAxS0IgaW5jcmVtZW50cy4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciwgbWJzX2tCKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiLCAuZGVzY3IgPSAiUG9ydCBMZXZlbCBTaGFwZXIgQ29uZmlndXJhdGlvbjoiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXJfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FsbG9jX3NsYV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjYnJfcnRfYnciLCAuZGVzY3IgPSAiQ0JSIFJlYWwgVGltZSBCYW5kd2lkdGggd2hpY2ggcmVxdWlyZSBzaGFwaW5nIG9mIHRoZSBiYW5kd2lkdGggYWxsb2NhdGlvbnMgaW4gYSBmaW5lIGdyYW51bGFyaXR5LiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIGNicl9ydF9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjYnJfbnJ0X2J3IiwgLmRlc2NyID0gIkZpeGVkIEJhbmR3aWR0aCB3aXRoIG5vIGNyaXRpY2FsIHJlcXVpcmVtZW50IG9mIHNoYXBpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIGNicl9ucnRfYncpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZ3VhcmFudGVlZF9idyIsIC5kZXNjciA9ICJEeW5hbWljIGJhbmR3aWR0aCB3aGljaCB0aGUgT0xUIGlzIGNvbW1pdHRlZCB0byBhbGxvY2F0ZSB1cG9uIGRlbWFuZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgZ3VhcmFudGVlZF9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtYXhpbXVtX2J3IiwgLmRlc2NyID0gIk1heGltdW0gYWxsb2NhdGVkIGJhbmR3aWR0aCBhbGxvd2VkIGZvciB0aGlzIGFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBtYXhpbXVtX2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkiLCAuZGVzY3IgPSAiQWxsb2MgSUQgYWRkaXRpb25hbCBCVyBlbGlnaWJpbGl0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgfSwgeyAubmFtZSA9ICJjYnJfcnRfY29tcGVuc2F0aW9uIiwgLmRlc2NyID0gIlNldCB0byBUcnVlIGZvciBBbGxvY0lEIHdpdGggQ0JSIFJUIEJhbmR3aWR0aCB0aGF0IHJlcXVpcmVzIGNvbXBlbnNhdGlvbiBmb3Igc2tpcHBlZCBhbGxvY2F0aW9ucyBkdXJpbmcgcXVpZXQgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBjYnJfcnRfY29tcGVuc2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiY2JyX3J0X2FwX2luZGV4IiwgLmRlc2NyID0gIkFsbG9jYXRpb24gUHJvZmlsZSBpbmRleCBmb3IgQ0JSIFJUIEJhbmR3aWR0aCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgY2JyX3J0X2FwX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiY2JyX25ydF9hcF9pbmRleCIsIC5kZXNjciA9ICJBbGxvY2F0aW9uIFByb2ZpbGUgaW5kZXggZm9yIENCUiBub24tUlQgQmFuZHdpZHRoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBjYnJfbnJ0X2FwX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYWxsb2NfdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHRoZSBhbGxvYyBJRCAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIGFsbG9jX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY190eXBlIH0sIHsgLm5hbWUgPSAid2VpZ2h0IiwgLmRlc2NyID0gIkFsbG9jIElEIFdlaWdodCB1c2VkIGluIGNhc2Ugb2YgRXh0ZW5kZWQgREJBIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIHdlaWdodCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInByaW9yaXR5IiwgLmRlc2NyID0gIkFsbG9jIElEIFByaW9yaXR5IHVzZWQgaW4gY2FzZSBvZiBFeHRlbmRlZCBEQkEgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgcHJpb3JpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2FsbG9jX3NsYSIsIC5kZXNjciA9ICJQT04gQWxsb2MgU0xBIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2FsbG9jX3NsYV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNicl9idyIsIC5kZXNjciA9ICJUb3RhbCBCVyBhdmFpbGFibGUgZm9yIENCUiByZWFsLXRpbWUgdHJhZmZpYyAoYnl0ZXMvc2VjKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoLCBjYnJfYncpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAidG90YWxfYnciLCAuZGVzY3IgPSAiVG90YWwgQlcgYXZhaWxhYmxlIGZvciBndWFyYW50ZWVkIHRyYWZmaWMgKGJ5dGVzL3NlYykiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoLCB0b3RhbF9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJuZXh0X29udV90b3RhbF9idyIsIC5kZXNjciA9ICJUb3RhbCBCVyBhdmFpbGFibGUgZm9yIGd1YXJhbnRlZWQgdHJhZmZpYyBhZnRlciBuZXcgT05VIGlzIGFkZGVkIChieXRlcy9zZWMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGgsIG5leHRfb251X3RvdGFsX2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGgiLCAuZGVzY3IgPSAiUE9OIGF2YWlsYWJsZSBiYW5kd2lkdGgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RiYV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSIsIC5kZXNjciA9ICJPTlUgc3RhdHVzIHJlcG9ydCBibG9jayBzaXplIGluIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fZGJhLCBzcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImRiYV9tb2RlIiwgLmRlc2NyID0gIkRCQSBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fZGJhLCBkYmFfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RiYV9tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RiYSA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9kYmEiLCAuZGVzY3IgPSAiUE9OIERCQSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fZGJhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kYmFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RiYV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWF4X2xvZ19kaXN0YW5jZSIsIC5kZXNjciA9ICJNYXggbG9naWNhbCBkaXN0YW5jZSBvZiBhbiBPTlUgb24gdGhlIFBPTiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2Rpc3RhbmNlLCBtYXhfbG9nX2Rpc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heF9kaWZmX3JlYWNoIiwgLmRlc2NyID0gIk1heCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjbG9zZXN0IGFuZCBmYXJ0aGVzdCBPTlUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kaXN0YW5jZSwgbWF4X2RpZmZfcmVhY2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2Rpc3RhbmNlIiwgLmRlc2NyID0gIlBPTiBEaXN0YW5jZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fZGlzdGFuY2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kaXN0YW5jZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZHJpZnRfY29udHJvbF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkcmlmdF9pbnRlcnZhbCIsIC5kZXNjciA9ICJJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgZm9yIE9OVSB0cmFuc21pc3Npb24gZHJpZnQgbW9uaXRvcmluZyAoMCA9IGRpc2FibGVkKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sLCBkcmlmdF9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJkcmlmdF9saW1pdCIsIC5kZXNjciA9ICJET1dpIHRocmVzaG9sZCBpbiBiaXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCwgZHJpZnRfbGltaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0cmFuc21pc3Npb25fY29udHJvbF9saW1pdCIsIC5kZXNjciA9ICJUSVdpIHRocmVzaG9sZCBpbiBiaXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCwgdHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZHJpZnRfY29udHJvbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIiwgLmRlc2NyID0gIlBPTiBEcmlmdCBDb250cm9sIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgcG9uX29udV9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfcG9uX29udV9pZCkgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvbl9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaW5hY3RpdmUiLCAudmFsID0gQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkUgfSwgeyAubmFtZSA9ICJhY3RpdmVfd29ya2luZyIsIC52YWwgPSBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfV09SS0lORyB9LCB7IC5uYW1lID0gImFjdGl2ZV9zdGFuZGJ5IiwgLnZhbCA9IEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX29wZXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9vcGVyYXRpb24iLCAuZGVzY3IgPSAiUE9OIE9wZXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fb3BlcmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Bvbl9vcGVyYXRpb25fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUiLCAuZGVzY3IgPSAiTWF4IGFsbG9jYXRpb24gc2l6ZSBmb3IgUExTIHRyYW5zbWlzc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3Bvd2VyX2xldmVsLCBwbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJPTlUgZGVmYXVsdCBwb3dlciBsZXZlbCBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcG93ZXJfbGV2ZWwgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fcG93ZXJfbGV2ZWwiLCAuZGVzY3IgPSAiUE9OIFBvd2VyIExldmVsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcG93ZXJfbGV2ZWxfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Bvd2VyX2xldmVsX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX09QVElPTlNfTk9ORSB9LCB7IC5uYW1lID0gInN3aWZ0X3BvcHVwIiwgLnZhbCA9IEJDTU9MVF9QT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfT1BUSU9OU19TV0lGVF9QT1BVUCB9LCB7IC5uYW1lID0gImRlYnVnX2Zhc3RfcmFuZ2luZyIsIC52YWwgPSBCQ01PTFRfUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX09QVElPTlNfREVCVUdfRkFTVF9SQU5HSU5HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyIsIC5kZXNjciA9ICJQT04gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgT3B0aW9ucyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidGltZW91dCIsIC5kZXNjciA9ICJMT1Mgc3dpdGNoIG92ZXIgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZywgdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJncGlvX3BpbiIsIC5kZXNjciA9ICJHUElPIHBpbiBmb3IgaW5wdXQvb3V0cHV0IHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCBncGlvX3BpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH0sIHsgLm5hbWUgPSAib3B0aW9ucyIsIC5kZXNjciA9ICJPcHRpb25zIHRvIGNvbnRyb2wgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIHByb2Nlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZywgb3B0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nID0geyAubmFtZSA9ICJiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIiwgLmRlc2NyID0gIkdQT04gcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAicHJvY2Vzc2luZyIsIC52YWwgPSBCQ01PTFRfUE9OX1NUQVRFX1BST0NFU1NJTkcgfSwgeyAubmFtZSA9ICJhY3RpdmVfd29ya2luZyIsIC52YWwgPSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9XT1JLSU5HIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfU1RBTkRCWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9zdGF0ZSIsIC5kZXNjciA9ICJQT04gc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Bvbl9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3N0YXR1cywgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfSwgeyAubmFtZSA9ICJsb3Nfc3RhdHVzIiwgLmRlc2NyID0gIkxPUyBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9zdGF0dXMsIGxvc19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfcG9uX3N0YXR1cyIsIC5kZXNjciA9ICJQT04gU3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2xfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0IiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9MRVZFTExJTkdfQ09OVFJPTF9ESVJFQ1QgfSwgeyAubmFtZSA9ICJkZWNyZWFzZSIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfREVDUkVBU0UgfSwgeyAubmFtZSA9ICJpbmNyZWFzZSIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfSU5DUkVBU0UgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIiwgLmRlc2NyID0gInBvd2VyIGxldmVsbGluZyBjb250cm9sIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9lbmFibGVkIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1BPV0VSX01BTkFHRU1FTlRfRU5BQkxFRCB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfZGlzYWJsZWQiLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fUE9XRVJfTUFOQUdFTUVOVF9ESVNBQkxFRCB9LCB7IC5uYW1lID0gInNsZWVwX3JlcXVlc3RfYXdha2UiLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9BV0FLRSB9LCB7IC5uYW1lID0gInNsZWVwX3JlcXVlc3RfZG96ZSIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9TTEVFUF9SRVFVRVNUX0RPWkUgfSwgeyAubmFtZSA9ICJzbGVlcF9yZXF1ZXN0X3NsZWVwIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfU0xFRVAgfSwgeyAubmFtZSA9ICJzbGVlcF9yZXF1ZXN0X3dhdGNoIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfV0FUQ0ggfSwgeyAubmFtZSA9ICJ0ZXJpX2V4cGlyZWQiLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fVEVSSV9FWFBJUkVEIH0sIHsgLm5hbWUgPSAidGFsZXJ0ZWRfZXhwaXJlZCIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9UQUxFUlRFRF9FWFBJUkVEIH0sIHsgLm5hbWUgPSAiYWxhcm0iLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fQUxBUk0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiIsIC5kZXNjciA9ICJUaGUgcmVhc29uIHRoYXQgYSBwb3dlciBtYW5hZ2VtZW50IHN0YXRlIGNoYW5nZSBvY2N1cnJlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwcmJzXzciLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzcgfSwgeyAubmFtZSA9ICJwcmJzXzkiLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzkgfSwgeyAubmFtZSA9ICJwcmJzXzExIiwgLnZhbCA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18xMSB9LCB7IC5uYW1lID0gInByYnNfMTUiLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzE1IH0sIHsgLm5hbWUgPSAicHJic18yMyIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfMjMgfSwgeyAubmFtZSA9ICJwcmJzXzMxIiwgLnZhbCA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18zMSB9LCB7IC5uYW1lID0gInByYnNfNTgiLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzU4IH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19wb2x5bm9taWFsID0geyAubmFtZSA9ICJiY21vbHRfcHJic19wb2x5bm9taWFsIiwgLmRlc2NyID0gIlBSQlMgUG9seW5vbWlhbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcHJic19wb2x5bm9taWFsX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlbGZfc3luYyIsIC52YWwgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfU0VMRl9TWU5DIH0sIHsgLm5hbWUgPSAiaW5pdGlhbF9zZWVkX21vZGUiLCAudmFsID0gQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX0lOSVRJQUxfU0VFRF9NT0RFIH0sIHsgLm5hbWUgPSAiaW5pdGlhbF9zZWVkX21vZGVfMiIsIC52YWwgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfSU5JVElBTF9TRUVEX01PREVfMiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfcHJic19jaGVja2VyX21vZGUiLCAuZGVzY3IgPSAiUFJCUyBjaGVja2VyIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcHJic19jaGVja2VyX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcHJic19jaGVja2VyX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9seW5vbSIsIC5kZXNjciA9ICJQUkJTIHBvbHlub20gdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZywgcG9seW5vbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfcG9seW5vbWlhbCB9LCB7IC5uYW1lID0gIm1vZGUiLCAuZGVzY3IgPSAiUFJCUyBMT0NLIHN0YXRlIG1hY2hpbmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnLCBtb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX21vZGUgfSwgeyAubmFtZSA9ICJkYXRhX2ludmVydCIsIC5kZXNjciA9ICJJbnZlcnQgb3Igbm8gaW52ZXJ0IGZvciByZWNlaXZlZCBQUkJTIGRhdGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcsIGRhdGFfaW52ZXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgdGhlIFVTIFBSQlMgY2hlY2tlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZywgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyIsIC5kZXNjciA9ICJQUkJTIGNoZWNrZXIgY29uZmlnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb2x5bm9tIiwgLmRlc2NyID0gIlBSQlMgcG9seW5vbSB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcsIHBvbHlub20pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3BvbHlub21pYWwgfSwgeyAubmFtZSA9ICJlcnJvcl9pbnNlcnQiLCAuZGVzY3IgPSAiMCB0byAxIHRyYW5zaXRpb24gb24gdGhpcyBzaWduYWwgd2lsbCBpbnNlcnQgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgTVNCIGJpdCBvZiB0aGUgZGF0YSBidXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcsIGVycm9yX2luc2VydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImludmVydCIsIC5kZXNjciA9ICJJbnZlcnQgb3Igbm8gaW52ZXJ0IGZvciB0cmFuc21pdHRlZCBQUkJTIGRhdGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZywgaW52ZXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgdGhlIERTIFBSQlMgZ2VuZXJhdG9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIiwgLmRlc2NyID0gIlBSQlMgR2VuZXJhdG9yIGNvbmZpZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3ByYnNfbG9ja19zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bmxvY2tlZCIsIC52YWwgPSBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX1VOTE9DS0VEIH0sIHsgLm5hbWUgPSAibG9ja2VkIiwgLnZhbCA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfTE9DS0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19sb2NrX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfcHJic19sb2NrX3N0YXRlIiwgLmRlc2NyID0gIlBSQlMgTG9jayBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcHJic19sb2NrX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsb2NrX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSBvZiB0aGUgUFJCUyBsb2NrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX3N0YXR1cywgbG9ja19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSB9LCB7IC5uYW1lID0gImVycm9yX2NvdW50cyIsIC5kZXNjciA9ICJUaGUgYml0IGVycm9ycyBvYnNlcnZlZCBkdXJpbmcgdGhlIFBSQlMgdGVzdC4gIFRoaXMgZmllbGQgaXMgY2xlYXIgb24gcmVhZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfc3RhdHVzLCBlcnJvcl9jb3VudHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJUaGF0IHN0YXRlIG9mIHRoZSBQUkJTIHRlc3QsIGxvY2sgc3RhdGUsIGFuZCBlcnJvciBjb3VudGVycy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcHJic19zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlzYWJsZWQiLCAudmFsID0gQkNNT0xUX1JBTUFOX01JVElHQVRJT05fTU9ERV9ESVNBQkxFRCB9LCB7IC5uYW1lID0gInJhbmRvbSIsIC52YWwgPSBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX1JBTkRPTSB9LCB7IC5uYW1lID0gImZpeGVkIiwgLnZhbCA9IEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfRklYRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUiLCAuZGVzY3IgPSAiUmFtYW4gbWl0aWdhdGlvbiBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJ3YWl0IHN0YXRlIDEgd2luZG93IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uLCB3YWl0X3N0YXRlXzFfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ3YWl0X3N0YXRlXzJfd2luZG93X3NpemUiLCAuZGVzY3IgPSAid2FpdCBzdGF0ZSAyIHdpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiwgd2FpdF9zdGF0ZV8yX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid2FpdF9hZnRlcl9yZXN5bmNfNCIsIC5kZXNjciA9ICJ3YWl0IGFmdGVyIHJlc3luYyA0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiwgd2FpdF9hZnRlcl9yZXN5bmNfNCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAicmFuZ2luZyBjb250cm9sIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gInJhbmdpbmdfYWNrX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fUkFOR0lOR19BQ0tfVElNRU9VVCB9LCB7IC5uYW1lID0gInBsb2FtX2RhdGFfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fUExPQU1fREFUQV9NSVNNQVRDSCB9LCB7IC5uYW1lID0gInBsb2FtX3R5cGVfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fUExPQU1fVFlQRV9NSVNNQVRDSCB9LCB7IC5uYW1lID0gInBsb2FtX29udV9pZF9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9PTlVfSURfTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJkcmlmdF9leGNlZWRlZCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9EUklGVF9FWENFRURFRCB9LCB7IC5uYW1lID0gIm5vX3Bsb2FtX3JlY2VpdmVkIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PX1BMT0FNX1JFQ0VJVkVEIH0sIHsgLm5hbWUgPSAibG9zIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0xPUyB9LCB7IC5uYW1lID0gImFsYXJtcyIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9BTEFSTVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJSYW5naW5nIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZnRlcl9pbml0IiwgLmRlc2NyID0gImFmdGVyIGluaXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIGFmdGVyX2luaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhZnRlcl9ub19lZCIsIC5kZXNjciA9ICJhZnRlciBubyBlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgYWZ0ZXJfbm9fZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhZnRlcl9lZCIsIC5kZXNjciA9ICJhZnRlciBlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgYWZ0ZXJfZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhZnRlcl9ub19kZWwiLCAuZGVzY3IgPSAiYWZ0ZXIgbm8gZGVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBhZnRlcl9ub19kZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhZnRlcl9yYW5naW5nX2FjY2VzcyIsIC5kZXNjciA9ICJhZnRlciByYW5naW5nIGFjY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtZWRfdmFsIiwgLmRlc2NyID0gIm1lZCB2YWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIG1lZF92YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyA9IHsgLm5hbWUgPSAiYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAicmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZnRlcl9ub19lZCIsIC5kZXNjciA9ICJhZnRlciBubyBlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wsIGFmdGVyX25vX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYWZ0ZXJfZWQiLCAuZGVzY3IgPSAiYWZ0ZXIgZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sLCBhZnRlcl9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX3Jlc2V0XzMiLCAuZGVzY3IgPSAiYWZ0ZXIgcmVzZXQgMyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wsIGFmdGVyX3Jlc2V0XzMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sIiwgLmRlc2NyID0gInJhbmdpbmcgcnNzaSBjb250cm9sIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImF1dG9tYXRpYyIsIC52YWwgPSBCQ01PTFRfUkVHSVNUUkFUSU9OX0JFSEFWSU9SX0FVVE9NQVRJQyB9LCB7IC5uYW1lID0gIm5vdGlmeV91bmtub3duIiwgLnZhbCA9IEJDTU9MVF9SRUdJU1RSQVRJT05fQkVIQVZJT1JfTk9USUZZX1VOS05PV04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgPSB7IC5uYW1lID0gImJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IiLCAuZGVzY3IgPSAiUmVnaXN0cmF0aW9uIEJlaGF2aW9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3Jfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9wbG9hbV90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9SRUdJU1RSQVRJT05fUExPQU1fVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9ERUFDVElWQVRJT04gfSwgeyAubmFtZSA9ICJkaXNhYmxlIiwgLnZhbCA9IEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9ESVNBQkxFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBmYWlsIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlIiwgLmRlc2NyID0gInJlcXVlc3QgcmVnaXN0cmF0aW9uIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInNtYV9mbGFnIiwgLmRlc2NyID0gImlzIHJlcXVlc3QgcmVnaXN0cmF0aW9uIGlzIHBhcnQgb2Ygc21hIHByb2Nlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgc21hX2ZsYWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVzdWx0X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN1Y2Nlc3MiLCAudmFsID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTIH0sIHsgLm5hbWUgPSAiZmFpbCIsIC52YWwgPSBCQ01PTFRfUkVTVUxUX0ZBSUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgPSB7IC5uYW1lID0gImJjbW9sdF9yZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Jlc3VsdCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yZXN1bHRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVhcmx5X3JvZ3VlX2RldGVjdGlvbiIsIC52YWwgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VBUkxZX1JPR1VFX0RFVEVDVElPTiB9LCB7IC5uYW1lID0gInNwZWNpYWxfbWFwIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVAgfSwgeyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRVhURU5ERURfR1VBUkRfVElNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2lsZW50X3dpbmRvdyIsIC52YWwgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XIH0sIHsgLm5hbWUgPSAiY3V0X29mZl93aW5kb3ciLCAudmFsID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfQ1VUX09GRl9XSU5ET1cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93ID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyIsIC5kZXNjciA9ICJSb2d1ZSBPTlUgZGV0ZWN0aW9uIG1lYXN1cmVtZW50IHR5cGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsb19zaXplIiwgLmRlc2NyID0gIlBMTyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAsIHBsb19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImFjY2Vzc19zaXplIiwgLmRlc2NyID0gIkFjY2VzcyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAsIGFjY2Vzc19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwIiwgLmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBTcGVjaWFsIE1hcCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiByb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gOCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxnb3JpdGhtX3R5cGUiLCAuZGVzY3IgPSAiVHlwZSBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIGFsZ29yaXRobV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZWFybHlfcm9ndWVfZGV0ZWN0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1lYXN1cmVtZW50X3R5cGUiLCAuZGVzY3IgPSAiU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSkgLSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfSwgeyAubmFtZSA9ICJpbnRlcnZhbCIsIC5kZXNjciA9ICJQZXJpb2RpYyBwcm9jZXNzIHRpbWVyIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwpIC0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIHUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic2Vjb25kX3Jhbmdpbmdfd2luZG93IiwgLmRlc2NyID0gIkRldGVybWluZXMgd2hldGhlciB0aGUgc2Vjb25kIHJhbmdpbmcgd2luZG93IHNob3VsZCBiZSBpbnZva2VkIG9yIG5vdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIHUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLnNlY29uZF9yYW5naW5nX3dpbmRvdykgLSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFsbG9jX3R5cGVfdG9fc2NhbiIsIC5kZXNjciA9ICJBbGxvYyB0eXBlIHRvIHNjYW4gZHVyaW5nIHJvZ3VlIGRldGVjdGlvbi4gIFVudXNlZCwgcHJldmlvdXNseSB1c2VkLCBvciBhbGwgQWxsb2MtSURzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuKSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2NfdHlwZV90b19zY2FuIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9lYXJseV9yb2d1ZV9kZXRlY3Rpb24gPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbiIsIC5kZXNjciA9ICJSb2d1ZSBEZXRlY3Rpb24gQWxnb3JpdGhtIEVhcmx5IFJvZ3VlIERldGVjdGlvbiIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKikwKS0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9lYXJseV9yb2d1ZV9kZXRlY3Rpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9lYXJseV9yb2d1ZV9kZXRlY3Rpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zcGVjaWFsX21hcF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY2Nlc3NlcyIsIC5kZXNjciA9ICJBY2Nlc3NlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5zcGVjaWFsX21hcC5hY2Nlc3NlcykgLSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5zcGVjaWFsX21hcC5hY2Nlc3NlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fc3BlY2lhbF9tYXAgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwIiwgLmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBBbGdvcml0aG0gU3BlY2lhbCBNYXAiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICopMCktPnUuc3BlY2lhbF9tYXApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zcGVjaWFsX21hcF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZXh0ZW5kZWRfZ3VhcmRfdGltZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZGRpdGlvbmFsX2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIGFsbCBPTlVzIG9uIHRoaXMgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSkgLSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2V4dGVuZGVkX2d1YXJkX3RpbWUgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2V4dGVuZGVkX2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIEFsZ29yaXRobSBFeHRlbmRlZCBHdWFyZCBUaW1lIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqKTApLT51LmV4dGVuZGVkX2d1YXJkX3RpbWUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZXh0ZW5kZWRfZ3VhcmRfdGltZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3VuaW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbiB9LCB7IC5uYW1lID0gInUuc3BlY2lhbF9tYXAiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LnNwZWNpYWxfbWFwKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zcGVjaWFsX21hcCB9LCB7IC5uYW1lID0gInUuZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIHUuZXh0ZW5kZWRfZ3VhcmRfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZXh0ZW5kZWRfZ3VhcmRfdGltZSB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0iLCAuZGVzY3IgPSAiVHlwZSBhbmQgYXR0cmlidXRlcyBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmNvbW1vbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdW5pb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnNzaV9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJub3RfcGVyZm9ybWVkIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfTk9UX1BFUkZPUk1FRCB9LCB7IC5uYW1lID0gInJvZ3VlX2N5Y2xlX3N0b3AiLCAudmFsID0gQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9ST0dVRV9DWUNMRV9TVE9QIH0sIHsgLm5hbWUgPSAicnNzaV9lcnJvciIsIC52YWwgPSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfRVJST1IgfSwgeyAubmFtZSA9ICJyc3NpX25vdF9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfTk9UX0NPTVBMRVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0ID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0IiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHByb2Nlc3MuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZGV0ZWN0aW9uX2FsZ29yaXRobSIsIC5kZXNjciA9ICJUeXBlIGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLCBkZXRlY3Rpb25fYWxnb3JpdGhtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC5kZXNjciA9ICJDb25maWd1cmVzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHBlcmlvZGljIHByb2Nlc3MuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29tcGxldGUiLCAudmFsID0gQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAibGxpZF9zdGF0ZV9pc19iYWQiLCAudmFsID0gQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0xMSURfU1RBVEVfSVNfQkFEIH0sIHsgLm5hbWUgPSAibGxpZF9pc19vb3IiLCAudmFsID0gQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0xMSURfSVNfT09SIH0sIHsgLm5hbWUgPSAic2Nhbl9lcnJfbm9yZXMiLCAudmFsID0gQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX05PUkVTIH0sIHsgLm5hbWUgPSAic2Nhbl9lcnJfaW50ZXJuYWwiLCAudmFsID0gQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX0lOVEVSTkFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyIsIC5kZXNjciA9ICJSb2d1ZSBTY2FuIEluZGljYXRpb24gU3RhdHVzICIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1c19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX1JTU0lfTUVBU1VSRU1FTlRfRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gIm5vX2RlbGltaXRlciIsIC52YWwgPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT19ERUxJTUlURVIgfSwgeyAubmFtZSA9ICJub19hY2Nlc3MiLCAudmFsID0gQkNNT0xUX1JTU0lfTUVBU1VSRU1FTlRfRkFJTF9SRUFTT05fTk9fQUNDRVNTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiUlNTSSBtZWFzdXJlbWVudCBmYWlsIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVkX21vZGUiLCAudmFsID0gQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfRURfTU9ERSB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfbW9kZSIsIC52YWwgPSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSX1JFU0VUX01PREUgfSwgeyAubmFtZSA9ICJmYXN0X21vZGUiLCAudmFsID0gQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfRkFTVF9NT0RFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUiLCAuZGVzY3IgPSAic2VyZGVzIHJhbmdpbmcgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJhbmdpbmdfbW9kZSIsIC5kZXNjciA9ICJyYW5naW5nIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uLCByYW5naW5nX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlIH0sIHsgLm5hbWUgPSAibXVsdGlfZWRfbW9kZSIsIC5kZXNjciA9ICJtdWx0aSBlZCBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiwgbXVsdGlfZWRfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQiLCAuZGVzY3IgPSAiYnVyc3QgZW5hYmxlIHN0YXJ0IG9mZnNldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24sIGJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQiLCAuZGVzY3IgPSAiYnVyc3QgZW5hYmxlIGVuZCBvZmZzZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uLCBidXJzdF9lbmFibGVfZW5kX29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlZF9pbnZlcnRpb24iLCAuZGVzY3IgPSAiZWQgaW52ZXJ0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiwgZWRfaW52ZXJ0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NlcmRlc19pbnN0YW5jZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbnN0YW5jZV8wIiwgLnZhbCA9IEJDTU9MVF9TRVJERVNfSU5TVEFOQ0VfSU5TVEFOQ0VfMCB9LCB7IC5uYW1lID0gImluc3RhbmNlXzEiLCAudmFsID0gQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8xIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2luc3RhbmNlID0geyAubmFtZSA9ICJiY21vbHRfc2VyZGVzX2luc3RhbmNlIiwgLmRlc2NyID0gIlNlckRlcyBJbnN0YW5jZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc2VyZGVzX2luc3RhbmNlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInZlbmRvcl9pZCIsIC5kZXNjciA9ICJ2ZW5kb3IgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmlhbF9udW1iZXIsIHZlbmRvcl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfNCB9LCB7IC5uYW1lID0gInZlbmRvcl9zcGVjaWZpYyIsIC5kZXNjciA9ICJ2ZW5kb3Igc3BlY2lmaWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmlhbF9udW1iZXIsIHZlbmRvcl9zcGVjaWZpYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfNCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gImJjbW9sdF9zZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc2VyaWFsX251bWJlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXJfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zaGFwZXJfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsYXllcl8xIiwgLnZhbCA9IEJDTU9MVF9TSEFQRVJfTU9ERV9MQVlFUl8xIH0sIHsgLm5hbWUgPSAibGF5ZXJfMiIsIC52YWwgPSBCQ01PTFRfU0hBUEVSX01PREVfTEFZRVJfMiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NoYXBlcl9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfc2hhcGVyX21vZGUiLCAuZGVzY3IgPSAiU2hhcGVyIE1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc2hhcGVyX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc2hhcGVyX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVudHJ5IiwgLnZhbCA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc29mdHdhcmVfZXJyb3JfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX1JFU0VSVkVEIH0sIHsgLm5hbWUgPSAiaW5kZXgiLCAudmFsID0gQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc29mdHdhcmVfZXJyb3Jfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJhbmR3aWR0aF9LYnBzIiwgLmRlc2NyID0gIkJhbmR3aWR0aCAoS2JwcykiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIsIGJhbmR3aWR0aF9LYnBzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heF9idXJzdF9zaXplX3RxIiwgLmRlc2NyID0gIk1heCBCdXJzdCBTaXplIChUUSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIsIG1heF9idXJzdF9zaXplX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInByaW9yaXR5IiwgLmRlc2NyID0gIlByaW9yaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyLCBwcmlvcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndlaWdodF90cSIsIC5kZXNjciA9ICJXZWlnaHQgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciwgd2VpZ2h0X3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgPSB7IC5uYW1lID0gImJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIiwgLmRlc2NyID0gIlNvbGljaXRlZCBTY2hlZHVsZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORSB9LCB7IC5uYW1lID0gInJhdGVfdGhyZXNob2xkIiwgLnZhbCA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEIH0sIHsgLm5hbWUgPSAicmF0ZV9yYW5nZSIsIC52YWwgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFIH0sIHsgLm5hbWUgPSAidmFsdWVfdGhyZXNob2xkIiwgLnZhbCA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlIiwgLmRlc2NyID0gIkFsbCBwb3NzaWJsZSBzdGF0aXN0aWMgYWxhcm0gdHJpZ2dlciBjb25kaXRpb25zLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIGNvbmRpdGlvbiB0byB0cmlnZ2VyIHRoZSBhbGFybS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHR5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV90aHJlc2hvbGRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmlzaW5nIiwgLmRlc2NyID0gIlJpc2luZyBUaHJlc2hvbGQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV90aHJlc2hvbGQucmlzaW5nKSAtIG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfdGhyZXNob2xkLnJpc2luZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmYWxsaW5nIiwgLmRlc2NyID0gIlRoZSBhbGFybSBpcyBjbGVhcmVkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBwZXIgc2Vjb25kIGJlY29tZXMgbGVzcyB0aGFuIHRoaXMgdGhyZXNob2xkIGxldmVsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nKSAtIG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfdGhyZXNob2xkLnJpc2luZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfdGhyZXNob2xkID0geyAubmFtZSA9ICJiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3RocmVzaG9sZCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQWxhcm0gVHJpZ2dlciBDb25maWd1cmF0aW9uIFJhdGUgdGhyZXNob2xkIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqKTApLT51LnJhdGVfdGhyZXNob2xkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV90aHJlc2hvbGRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3RocmVzaG9sZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfcmFuZ2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidXBwZXIiLCAuZGVzY3IgPSAiVGhlIGFsYXJtIGlzIHJhaXNlZCBpZiB0aGUgc3RhdHMgZGVsdGEgdmFsdWUgcGVyIHNlY29uZCBiZWNvbWVzIGdyZWF0ZXIgdGhhbiB0aGlzIHVwcGVyIGxldmVsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS5yYXRlX3JhbmdlLnVwcGVyKSAtIG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfcmFuZ2UudXBwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibG93ZXIiLCAuZGVzY3IgPSAiVGhlIGFsYXJtIGlzIHJhaXNlZCBpZiB0aGUgc3RhdHMgZGVsdGEgdmFsdWUgcGVyIHNlY29uZCBiZWNvbWVzIGxlc3MgdGhhbiB0aGlzIGxvd2VyIGxldmVsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS5yYXRlX3JhbmdlLmxvd2VyKSAtIG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfcmFuZ2UudXBwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3JhbmdlID0geyAubmFtZSA9ICJiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3JhbmdlIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBBbGFybSBUcmlnZ2VyIENvbmZpZ3VyYXRpb24gUmF0ZSByYW5nZSIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgKikwKS0+dS5yYXRlX3JhbmdlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV9yYW5nZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfcmFuZ2VfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ192YWx1ZV90aHJlc2hvbGRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGltaXQiLCAuZGVzY3IgPSAiVGhlIGFsYXJtIGlzIHJhaXNlZCBpZiB0aGUgc3RhdHMgc2FtcGxlIHZhbHVlIGJlY29tZXMgZ3JlYXRlciB0aGFuIHRoaXMgbGV2ZWwuICBUaGUgYWxhcm0gaXMgY2xlYXJlZCB3aGVuIHRoZSBob3N0IGNsZWFycyB0aGUgc3RhdHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnZhbHVlX3RocmVzaG9sZC5saW1pdCkgLSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS52YWx1ZV90aHJlc2hvbGQubGltaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ192YWx1ZV90aHJlc2hvbGQgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQWxhcm0gVHJpZ2dlciBDb25maWd1cmF0aW9uIFZhbHVlIHRocmVzaG9sZCIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgKikwKS0+dS52YWx1ZV90aHJlc2hvbGQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ192YWx1ZV90aHJlc2hvbGRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ192YWx1ZV90aHJlc2hvbGRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ191bmlvbl9maWVsZHNbXSA9IHsgeyB9LCB7IC5uYW1lID0gInUucmF0ZV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3RocmVzaG9sZCB9LCB7IC5uYW1lID0gInUucmF0ZV9yYW5nZSIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV9yYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV9yYW5nZSB9LCB7IC5uYW1lID0gInUudmFsdWVfdGhyZXNob2xkIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS52YWx1ZV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZCB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIHRyaWdnZXIgY29uZmlndXJhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmNvbW1vbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdW5pb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmVfc29ha190aW1lIiwgLmRlc2NyID0gIkFjdGl2ZSBTb2FrIFRpbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcsIGFjdGl2ZV9zb2FrX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY2xlYXJfc29ha190aW1lIiwgLmRlc2NyID0gIkNsZWFyIFNvYWsgVGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZywgY2xlYXJfc29ha190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnIiwgLmRlc2NyID0gIlN0YXRpc3RpY3MgYWxhcm0gc29ha2luZyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInRyaWdnZXIiLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBhbGFybSB0cmlnZ2VyIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZywgdHJpZ2dlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgfSwgeyAubmFtZSA9ICJzb2FrIiwgLmRlc2NyID0gIlN0YXRpc3RpY3MgYWxhcm0gc29ha2luZyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZywgc29hayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHN0cmluZ18xMDAgPSB7IC5uYW1lID0gInN0cmluZ1sxMDBdIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMTAwIiwgLnNpemUgPSBzaXplb2YoY2hhclsxMDBdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0ciIsIC5kZXNjciA9ICJTdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0cl8xMDAsIHN0ciksIC50eXBlID0gJnN0cmluZ18xMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwID0geyAubmFtZSA9ICJiY21vbHRfc3RyXzEwMCIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDEwMCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zdHJfMTAwKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHN0cmluZ18xMDAwID0geyAubmFtZSA9ICJzdHJpbmdbMTAwMF0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAxMDAwIiwgLnNpemUgPSBzaXplb2YoY2hhclsxMDAwXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMDBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RyIiwgLmRlc2NyID0gIlN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RyXzEwMDAsIHN0ciksIC50eXBlID0gJnN0cmluZ18xMDAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMDAgPSB7IC5uYW1lID0gImJjbW9sdF9zdHJfMTAwMCIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDEwMDAiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RyXzEwMDApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMDBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMDBfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiBzdHJpbmdfMjAwMCA9IHsgLm5hbWUgPSAic3RyaW5nWzIwMDBdIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMjAwMCIsIC5zaXplID0gc2l6ZW9mKGNoYXJbMjAwMF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJJTkcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yMDAwX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0ciIsIC5kZXNjciA9ICJTdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0cl8yMDAwLCBzdHIpLCAudHlwZSA9ICZzdHJpbmdfMjAwMCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yMDAwID0geyAubmFtZSA9ICJiY21vbHRfc3RyXzIwMDAiLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyMDAwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0cl8yMDAwKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yMDAwX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yMDAwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzI1NiA9IHsgLm5hbWUgPSAic3RyaW5nWzI1Nl0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyNTYiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzI1Nl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJJTkcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yNTZfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RyIiwgLmRlc2NyID0gIlN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RyXzI1Niwgc3RyKSwgLnR5cGUgPSAmc3RyaW5nXzI1NiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yNTYgPSB7IC5uYW1lID0gImJjbW9sdF9zdHJfMjU2IiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMjU2IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0cl8yNTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1Nl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdHIiLCAuZGVzY3IgPSAiU3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdHJfNjQsIHN0ciksIC50eXBlID0gJnN0cmluZ182NCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NCA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0cl82NCIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDY0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0cl82NCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfNjRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N3X2Vycm9yX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZpcnN0X2Vycm9yX3RpbWVfdXMiLCAuZGVzY3IgPSAiVGltZXN0YW1wIChpbiB1cykgd2hlbiBoaXMgZXJyb3IgZmlyc3Qgb2NjdXJyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBmaXJzdF9lcnJvcl90aW1lX3VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImxhc3RfZXJyb3JfdGltZV91cyIsIC5kZXNjciA9ICJUaW1lc3RhbXAgKGluIHVzKSB3aGVuIGhpcyBlcnJvciBsYXN0IG9jY3VycmVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zd19lcnJvciwgbGFzdF9lcnJvcl90aW1lX3VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImxpbmVfbnVtYmVyIiwgLmRlc2NyID0gIkxpbmUgTnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zd19lcnJvciwgbGluZV9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZXJyb3JfY291bnRlciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZXJyb3IgaGFzIG9jY3VycmVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zd19lcnJvciwgZXJyb3JfY291bnRlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpbnN0YW5jZSIsIC5kZXNjciA9ICJJbnN0YW5jZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3dfZXJyb3IsIGluc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImZpbGVuYW1lIiwgLmRlc2NyID0gIkZpbGVuYW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zd19lcnJvciwgZmlsZW5hbWUpLCAudHlwZSA9ICZzdHJpbmdfNjQgfSwgeyAubmFtZSA9ICJ0YXNrX25hbWUiLCAuZGVzY3IgPSAiVGFzayBOYW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zd19lcnJvciwgdGFza19uYW1lKSwgLnR5cGUgPSAmc3RyaW5nXzY0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3dfZXJyb3IgPSB7IC5uYW1lID0gImJjbW9sdF9zd19lcnJvciIsIC5kZXNjciA9ICJTVyBFcnJvciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zd19lcnJvciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zd19lcnJvcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zd19lcnJvcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9TV0lUQ0hfT1ZFUl9UWVBFX0NfT05VX1NUQVRFX0FDVElWRSB9LCB7IC5uYW1lID0gImFjdGl2ZV9zdGFuZGJ5IiwgLnZhbCA9IEJDTU9MVF9TV0lUQ0hfT1ZFUl9UWVBFX0NfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUiLCAuZGVzY3IgPSAiU3dpdGNoIG92ZXIgdHlwZSBjIG9udSBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3lzdGVtX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZ3Bvbl9fMTZfeCIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fMTZfWCB9LCB7IC5uYW1lID0gImdwb25fXzhfeCIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YIH0sIHsgLm5hbWUgPSAiZ3Bvbl9fNF94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1ggfSwgeyAubmFtZSA9ICJlcG9uX18xNl94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YIH0sIHsgLm5hbWUgPSAieGdwb25fMV9fOF94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1ggfSwgeyAubmFtZSA9ICJlcG9uX184X3hfY29leGlzdGVuY2VfdGRtYSIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUEgfSwgeyAubmFtZSA9ICJhZV84X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0FFXzhfWCB9LCB7IC5uYW1lID0gImVwb25fXzhfeF8xMF9nIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRyB9LCB7IC5uYW1lID0gImdwb25fOF94Z3Bvbl80X3hfY29leGlzdGVuY2UiLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgfSwgeyAubmFtZSA9ICJlcG9uX184X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWCB9LCB7IC5uYW1lID0gImVwb25fXzRfeCIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YIH0sIHsgLm5hbWUgPSAiZXBvbl9fNF94X2NvZXhpc3RlbmNlX3RkbWEiLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF9DT0VYSVNURU5DRV9URE1BIH0sIHsgLm5hbWUgPSAiZXBvbl9fNF94XzEwX2ciLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HIH0sIHsgLm5hbWUgPSAieGdzX18yX3hfMTBfZyIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRyB9LCB7IC5uYW1lID0gIm5ncG9uMl9fMl94XzEwX2ciLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0cgfSwgeyAubmFtZSA9ICJuZ3BvbjJfXzhfeF8yX3BfNV9nIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HIH0sIHsgLm5hbWUgPSAieGdwb25fMV9fNF94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX180X1ggfSwgeyAubmFtZSA9ICJlcG9uX18yX3hfMTBfZyIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3N5c3RlbV9tb2RlIiwgLmRlc2NyID0gIlN5c3RlbSB3b3JraW5nIG1vZGUgKEdQT04vRVBPTiBldGMuKSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zeXN0ZW1fbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zeXN0ZW1fbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJleHBhbmRlZF9zcGVjdHJ1bV93aWRlX2JhbmQiLCAudmFsID0gQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX1dJREVfQkFORCB9LCB7IC5uYW1lID0gImV4cGFuZGVkX3NwZWN0cnVtX3JlZHVjZWRfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fUkVEVUNFRF9CQU5EIH0sIHsgLm5hbWUgPSAiZXhwYW5kZWRfc3BlY3RydW1fbmFycm93X2JhbmQiLCAudmFsID0gQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX05BUlJPV19CQU5EIH0sIHsgLm5hbWUgPSAic2hhcmVkX3NwZWN0cnVtX3dpZGVfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX1dJREVfQkFORCB9LCB7IC5uYW1lID0gInNoYXJlZF9zcGVjdHJ1bV9yZWR1Y2VkX2JhbmQiLCAudmFsID0gQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX1NIQVJFRF9TUEVDVFJVTV9SRURVQ0VEX0JBTkQgfSwgeyAubmFtZSA9ICJzaGFyZWRfc3BlY3RydW1fbmFycm93X2JhbmQiLCAudmFsID0gQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX1NIQVJFRF9TUEVDVFJVTV9OQVJST1dfQkFORCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzID0geyAubmFtZSA9ICJiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMiLCAuZGVzY3IgPSAiVVMgb3BlcmF0aW5nIHdhdmVsZW5ndGggYmFuZHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9wcm9maWxlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm5nXzJfc3lzX2lkIiwgLmRlc2NyID0gIjIwLWJpdCBpZGVudGlmaWVyIG9mIHRoZSBOR1BPTjIgc3lzdGVtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgbmdfMl9zeXNfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAidmVyc2lvbiIsIC5kZXNjciA9ICJTeXN0ZW0gcHJvZmlsZSB2ZXJzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImNoYW5uZWxfc3BhY2luZyIsIC5kZXNjciA9ICJBbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGNoYW5uZWwgc3BhY2luZyBpbiB1bml0cyBvZiAxR0h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgY2hhbm5lbF9zcGFjaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMiLCAuZGVzY3IgPSAiVXBzdHJlYW0gb3BlcmF0aW5nIHdhdmVsZW5ndGggYmFuZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCB1c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzIH0sIHsgLm5hbWUgPSAidXNfbXNlIiwgLmRlc2NyID0gIlVwc3RyZWFtIE1heGltdW0gU3BlY3RyYWwgRXhjdXJzaW9uIChNU0UpIHJlcHJlc2VudGVkIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgaW5kaWNhdGluZyB0aGUgdmFsdWUgaW4gdW5pdHMgb2YgMUdIeiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUsIHVzX21zZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxvb3NlX2NhbGlicmF0aW9uX2JvdW5kIiwgLmRlc2NyID0gIlNwZWN0cmFsIGV4Y3Vyc2lvbiBib3VuZCBiZWxvdyB3aGljaCBhIFRXRE0gT05VIGNhbiBiZSBjb25zaWRlcmVkIGFzIGxvb3NlbHkgY2FsaWJyYXRlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUsIGxvb3NlX2NhbGlicmF0aW9uX2JvdW5kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkIH0sIHsgLm5hbWUgPSAiZnNyIiwgLmRlc2NyID0gIklmIGEgY3ljbGljIFdNIGlzIHVzZWQgaW4gdGhlIHVwc3RyZWFtLCBGcmVlIFNwZWN0cmFsIFJhbmdlIGluZGljYXRlcyB0aGUgdmFsdWUgaW4gdW5pdHMgb2YgMC4xIEdIeiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUsIGZzciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0d2RtX2NoYW5uZWxfY291bnQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDaGFubmVsX1Byb2ZpbGUgUExPQU0gbWVzc2FnZXMgd2l0aCBkaXN0aW5jdCBDaGFubmVsIFByb2ZpbGUgaW5kaWNlcyB0aGF0IGFuIE9OVSBjYW4gZXhwZWN0IHRvIHJlY2VpdmUgd2hpbGUgbGlzdGVuaW5nIHRvIHRoaXMgZG93bnN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCB0d2RtX2NoYW5uZWxfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fcHJvZmlsZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3N5c3RlbV9wcm9maWxlIiwgLmRlc2NyID0gIlN5c3RlbSBwcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9wcm9maWxlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9wcm9maWxlX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN1Y2Nlc3MiLCAudmFsID0gQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVUNDRVNTIH0sIHsgLm5hbWUgPSAiZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJzdXNwZWN0ZWRfbG9zIiwgLnZhbCA9IEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VTUEVDVEVEX0xPUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCIsIC5kZXNjciA9ICJUcmFmZmljIHJlc3VtZSByZXN1bHQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0cnhfY2FsaWJyYXRpb25fYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRhdGFfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfREFUQV9XSU5ET1cgfSwgeyAubmFtZSA9ICJzdHJvYmVfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVyB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9taW5fbWluIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NSU4gfSwgeyAubmFtZSA9ICJlZGdlX3Jpc2VfbWluX21heCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYIH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9taW4iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01JTiB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9tYXhfbWF4IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NQVggfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21pbiIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOIH0sIHsgLm5hbWUgPSAiZWRnZV9mYWxsX21pbl9tYXgiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUlOX01BWCB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWluIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4gfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWF4X21heCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYIH0sIHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fS0VZX0lEX1JFU0VSVkVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdHJ4X2NhbGlicmF0aW9uX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJ0cmlnZ2VyIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUiB9LCB7IC5uYW1lID0gInN0cm9iZSIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUUk9CRSB9LCB7IC5uYW1lID0gIndpbmRvd19tb2RlIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJ0cmlnZ2VyX3Bvc2l0aW9uIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUl9QT1NJVElPTiB9LCB7IC5uYW1lID0gInN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RPUF9EVUVfVE9fQ09SUlVQVF9TVFJPQkUgfSwgeyAubmFtZSA9ICJzdGFydF9vZmZzZXQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVEFSVF9PRkZTRVQgfSwgeyAubmFtZSA9ICJlbmRfb2Zmc2V0IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZXMiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3cgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fc3RhdCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfRVBPTl9TVEFUIH0sIHsgLm5hbWUgPSAiZ3Bvbl9iY2RyX3Jlc2V0IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX0JDRFJfUkVTRVQgfSwgeyAubmFtZSA9ICJncG9uX3RyeF9yZXNldCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9UUlhfUkVTRVQgfSwgeyAubmFtZSA9ICJncG9uX3RyeF9lZCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9UUlhfRUQgfSwgeyAubmFtZSA9ICJncG9uX3Jzc2kiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fUlNTSSB9LCB7IC5uYW1lID0gImdwb25fZW9iIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX0VPQiB9LCB7IC5uYW1lID0gImdwb25fcmFuZ2luZyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9SQU5HSU5HIH0sIHsgLm5hbWUgPSAic2VyZGVzX2J1cnN0X2VuIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9TRVJERVNfQlVSU1RfRU4gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlciA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIiwgLmRlc2NyID0gInRyeCBjYWxpYnJhdGlvbiB0cmlnZ2VyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJpc2luZyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fUklTSU5HIH0sIHsgLm5hbWUgPSAiZmFsbGluZyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fRkFMTElORyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24iLCAuZGVzY3IgPSAidHJ4IGNhbGlicmF0aW9uIHRyaWdnZXIgcG9zaXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJhbmdpbmciLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9XSU5ET1dfTU9ERV9SQU5HSU5HIH0sIHsgLm5hbWUgPSAibm9uX3JhbmdpbmciLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9XSU5ET1dfTU9ERV9OT05fUkFOR0lORyB9LCB7IC5uYW1lID0gImJvdGgiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9XSU5ET1dfTU9ERV9CT1RIIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIiwgLmRlc2NyID0gInRyeCBjYWxpYnJhdGlvbiB3aW5kb3cgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9hcnJfMyA9IHsgLm5hbWUgPSAidWludDhfdFszXSIsIC5kZXNjciA9ICJBcnJheSBvZiAzIGVsZW1lbnRzIG9mIHR5cGUgdWludDhfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQ4X3RbM10pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSAzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2RlbGltaXRlcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwYXR0ZXJuIiwgLmRlc2NyID0gInBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9kZWxpbWl0ZXIsIHBhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzMgfSwgeyAubmFtZSA9ICJzaXplIiwgLmRlc2NyID0gIlNpemUgaW4gYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9kZWxpbWl0ZXIsIHNpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ3aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJXaW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2RlbGltaXRlciwgd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2RlbGltaXRlciIsIC5kZXNjciA9ICJUUlggRGVsaW1pdGVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9kZWxpbWl0ZXIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X2RlbGltaXRlcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJhbmdpbmdfZWRfc291cmNlIiwgLmRlc2NyID0gIlJhbmdpbmcgRUQgc291cmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgcmFuZ2luZ19lZF9zb3VyY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSB9LCB7IC5uYW1lID0gImRlbGltaXRlcl9lZF9zb3VyY2UiLCAuZGVzY3IgPSAiRGVsaW1pdGVyIEVEIHNvdXJjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIGRlbGltaXRlcl9lZF9zb3VyY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSB9LCB7IC5uYW1lID0gIm1pbmltdW1fdGhyZXNob2xkIiwgLmRlc2NyID0gIk1pbmltdW0gdGhyZXNob2xkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgbWluaW11bV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtYXhpbXVtX3RocmVzaG9sZCIsIC5kZXNjciA9ICJNYXhpbXVtIHRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIG1heGltdW1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZWRfcGF0dGVybiIsIC5kZXNjciA9ICJFRCBwYXR0ZXJuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgZWRfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImVkX3BhdHRlcm5fc2l6ZSIsIC5kZXNjciA9ICJFRCBwYXR0ZXJuIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCBlZF9wYXR0ZXJuX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ3aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJXaW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIHdpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiaW52ZXJzaW9uIiwgLmRlc2NyID0gIkludmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIGludmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm5vX2VkX3RocmVzaG9sZCIsIC5kZXNjciA9ICJubyBlZCB0aHJlc2hvbGQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCBub19lZF90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZW5lcmd5X2RldGVjdCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IiwgLmRlc2NyID0gIlRSWCBFbmVyZ3kgZGV0ZWN0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9wcmVhbWJsZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0eXBlXzFfc2l6ZSIsIC5kZXNjciA9ICJUeXBlIDEgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X3ByZWFtYmxlLCB0eXBlXzFfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR5cGVfMl9zaXplIiwgLmRlc2NyID0gIlR5cGUgMiBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfcHJlYW1ibGUsIHR5cGVfMl9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHlwZV8zX3ByZV9yYW5naW5nX3NpemUiLCAuZGVzY3IgPSAiVHlwZSAzIHByZSByYW5naW5nIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9wcmVhbWJsZSwgdHlwZV8zX3ByZV9yYW5naW5nX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eXBlXzNfcG9zdF9yYW5naW5nX3NpemUiLCAuZGVzY3IgPSAiVHlwZSAzIHBvc3QgcmFuZ2luZyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfcHJlYW1ibGUsIHR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR5cGVfM19wYXR0ZXJuIiwgLmRlc2NyID0gIlR5cGUgMyBwYXR0ZXJuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfcHJlYW1ibGUsIHR5cGVfM19wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X3ByZWFtYmxlIiwgLmRlc2NyID0gIlRSWCBQcmVhbWJsZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfcHJlYW1ibGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9wcmVhbWJsZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ3YWl0X3dpbmRvd19zaXplIiwgLmRlc2NyID0gIldhaXQgV2luZG93IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uLCB3YWl0X3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUiLCAuZGVzY3IgPSAiUmFuZ2luZyBhY2Nlc3Mgd2luZG93IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uLCByYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiVFJYIFJYIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzcHNfNDNfNDhfaF9ocF9jZGVfc2RfMjAxMyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfU1BTXzQzXzQ4X0hfSFBfQ0RFX1NEXzIwMTMgfSwgeyAubmFtZSA9ICJzb2dfNDMyMV9wc2diIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9TT0dfNDMyMV9QU0dCIH0sIHsgLm5hbWUgPSAibHRlXzM2ODBfbSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfTFRFXzM2ODBfTSB9LCB7IC5uYW1lID0gInNvdXJjZV9waG90b25pY3MiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX1NPVVJDRV9QSE9UT05JQ1MgfSwgeyAubmFtZSA9ICJsdGVfMzY4MF9wX3R5cGVfY19wbHVzIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9MVEVfMzY4MF9QX1RZUEVfQ19QTFVTIH0sIHsgLm5hbWUgPSAiYW55IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9BTlkgfSwgeyAubmFtZSA9ICJhbnlfcmVzZXRfZ3VhcmQiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0FOWV9SRVNFVF9HVUFSRCB9LCB7IC5uYW1lID0gImFueV9yZXNldF9wcmVhbWJsZSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfQU5ZX1JFU0VUX1BSRUFNQkxFIH0sIHsgLm5hbWUgPSAid3RkX3J0eG1fMTY3XzUyNl9jcGx1cyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE1fMTY3XzUyNl9DUExVUyB9LCB7IC5uYW1lID0gInd0ZF9ydHhtXzE2N181MjJfYnBsdXMiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX1dURF9SVFhNXzE2N181MjJfQlBMVVMgfSwgeyAubmFtZSA9ICJsdGVfMzY4MF9wX2JjIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9MVEVfMzY4MF9QX0JDIH0sIHsgLm5hbWUgPSAic29ncV80MzIxX3BzZ2JfY19wbHVzIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9TT0dRXzQzMjFfUFNHQl9DX1BMVVMgfSwgeyAubmFtZSA9ICJ3dGRfcnR4bTE2N181MjEiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX1dURF9SVFhNMTY3XzUyMSB9LCB7IC5uYW1lID0gImx0ZTM2NzgiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0xURTM2NzggfSwgeyAubmFtZSA9ICJzb2dwXzQzMjFfcHNnYSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfU09HUF80MzIxX1BTR0EgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfMSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzEgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfMiIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzIgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfMyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzMgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfNCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzQgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfNSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzUgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfNiIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzYgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfNyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzcgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfOCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzggfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfOSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzkgfSwgeyAubmFtZSA9ICJncG9uX2dlbmVyYWxfMTAiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8xMCB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8xMSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzExIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfdHlwZSIsIC5kZXNjciA9ICJUUlggdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cnhfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX1RVTkVfSU5fRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gIm5vX3R1bmluZ19yZXNwb25zZV9wbG9hbV9yZWNlaXZlZCIsIC52YWwgPSBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9OT19UVU5JTkdfUkVTUE9OU0VfUExPQU1fUkVDRUlWRUQgfSwgeyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9mYWlsZWQiLCAudmFsID0gQkNNT0xUX1RVTkVfSU5fRkFJTF9SRUFTT05fT05VX0FDVElWQVRJT05fRkFJTEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiVHVuZSBpbiBmYWlsIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gIm5hY2tfcGxvYW1fcmVjZWl2ZWQiLCAudmFsID0gQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX05BQ0tfUExPQU1fUkVDRUlWRUQgfSwgeyAubmFtZSA9ICJub190dW5pbmdfcmVzcG9uc2VfcGxvYW1fcmVjZWl2ZWQiLCAudmFsID0gQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRCB9LCB7IC5uYW1lID0gInRzb3VyY2VfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fVFNPVVJDRV9USU1FT1VUIH0sIHsgLm5hbWUgPSAicm9sbGJhY2tfcmVxdWVzdCIsIC52YWwgPSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fUk9MTEJBQ0tfUkVRVUVTVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3R1bmVfb3V0X2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiVHVuZSBvdXQgZmFpbCByZWFzb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ID0geyAubmFtZSA9ICJiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFUzMiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXgsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IDUwMCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MTZfaGV4ID0geyAubmFtZSA9ICJiY21vbHRfdThfbGlzdF91MTZfaGV4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3U4X2xpc3RfdTE2X2hleCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfaGV4LCAubGVuX3NpemUgPSAyLCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YodWludDhfdCkgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfdThfbGlzdF91MzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdThfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YodWludDhfdCkgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ID0geyAubmFtZSA9ICJiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSAyMDQ4IH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91YXJ0X2JhdWRyYXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVhcnRfcmF0ZV80ODAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV80ODAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzk2MDAiLCAudmFsID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzk2MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMTQ0MDAiLCAudmFsID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzE0NDAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzE5MjAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8xOTIwMCB9LCB7IC5uYW1lID0gInVhcnRfcmF0ZV8zODQwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMzg0MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfNTc2MDAiLCAudmFsID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzU3NjAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzExNTIwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMTE1MjAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzIzMDQwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMjMwNDAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzM4MDQwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMzgwNDAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzQ2MDgwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfNDYwODAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzkyMTYwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfOTIxNjAwIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdWFydF9iYXVkcmF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3VhcnRfYmF1ZHJhdGUiLCAuZGVzY3IgPSAiVUFSVCBiYXVkIHJhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdWFydF9iYXVkcmF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF91YXJ0X2JhdWRyYXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91YmRfaW5mb19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY3R1YWxfcG9sbGluZ19pbnRlcnZhbCIsIC5kZXNjciA9ICJVbml0czogNjUuNTM2dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ViZF9pbmZvLCBhY3R1YWxfcG9sbGluZ19pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJhY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxIiwgLmRlc2NyID0gIkFjdHVhbCBHcmFudCBUaHJlc2hvbGQgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdWJkX2luZm8sIGFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXIiLCAuZGVzY3IgPSAiQWN0dWFsIE1pbiBTY2hlZHVsZXIvU2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91YmRfaW5mbywgYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyIH0sIHsgLm5hbWUgPSAiYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIiLCAuZGVzY3IgPSAiQWN0dWFsIE1heCBTY2hlZHVsZXIvU2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91YmRfaW5mbywgYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdWJkX2luZm8gPSB7IC5uYW1lID0gImJjbW9sdF91YmRfaW5mbyIsIC5kZXNjciA9ICJVQkQgSW5mbyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91YmRfaW5mbyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF91YmRfaW5mb19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF91YmRfaW5mb19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbGxpbmdfaW50ZXJ2YWxfdXMiLCAuZGVzY3IgPSAiUG9sbGluZyBJbnRlcnZhbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiwgcG9sbGluZ19pbnRlcnZhbF91cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwgfSwgeyAubmFtZSA9ICJncmFudF90aHJlc2hvbGRfdHEiLCAuZGVzY3IgPSAiR3JhbnQgVGhyZXNob2xkIChUUSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24sIGdyYW50X3RocmVzaG9sZF90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtaW5fc2NoZWR1bGVyc2hhcGVyIiwgLmRlc2NyID0gIk1pbiBTY2hlZHVsZXIvU2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uLCBtaW5fc2NoZWR1bGVyc2hhcGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciB9LCB7IC5uYW1lID0gIm1heF9zY2hlZHVsZXJzaGFwZXIiLCAuZGVzY3IgPSAiTWF4IFNjaGVkdWxlci9TaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24sIG1heF9zY2hlZHVsZXJzaGFwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIH0sIHsgLm5hbWUgPSAidGRtX2dyYW50X3NpemVfdHEiLCAuZGVzY3IgPSAiVERNIEdyYW50IFNpemUgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiwgdGRtX2dyYW50X3NpemVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAidGRtX2dyYW50X2ludGVydmFsX3VzIiwgLmRlc2NyID0gIkludGVydmFsIGJldHdlZW4gVERNIGdyYW50cyAoaW4gdXMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiwgdGRtX2dyYW50X2ludGVydmFsX3VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIiwgLmRlc2NyID0gIlRoZSB1cHN0cmVhbSBiYW5kd2lkdGggZGlzdHJpYnV0aW9uIGZvciB0aGlzIExMSUQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGF0YSIsIC52YWwgPSBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fREFUQSB9LCB7IC5uYW1lID0gImNwdSIsIC52YWwgPSBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fQ1BVIH0sIHsgLm5hbWUgPSAib21jaSIsIC52YWwgPSBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fT01DSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24iLCAuZGVzY3IgPSAidXNfZ2VtX3BvcnRfZGVzdGluYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdXNfdmxhbl9hY3Rpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWRkIiwgLnZhbCA9IEJDTU9MVF9VU19WTEFOX0FDVElPTl9BREQgfSwgeyAubmFtZSA9ICJ0cmFuc3BhcmVudCIsIC52YWwgPSBCQ01PTFRfVVNfVkxBTl9BQ1RJT05fVFJBTlNQQVJFTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91c192bGFuX2FjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIiwgLmRlc2NyID0gIlVTIFZMQU4gYWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3VzX3ZsYW5fYWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3VzX3ZsYW5fYWN0aW9uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RhZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ2bGFuX2lkIiwgLmRlc2NyID0gIlZMQU4gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ZsYW5fdGFnLCB2bGFuX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBiaXQiLCAuZGVzY3IgPSAiUGJpdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdmxhbl90YWcsIHBiaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RhZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3ZsYW5fdGFnIiwgLmRlc2NyID0gIlZMQU4gdGFnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ZsYW5fdGFnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInZpZCIsIC52YWwgPSBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRCB9LCB7IC5uYW1lID0gIm1hY3BsdXN2aWQiLCAudmFsID0gQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9NQUNQTFVTVklEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kID0geyAubmFtZSA9ICJiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kIiwgLmRlc2NyID0gIlZMQU4gdG8gZmxvdyBtYXBwaW5nIG1ldGhvZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2NfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFIH0sIHsgLm5hbWUgPSAic2xhIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2NfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJhdmVyYWdlX25zcl91c2VkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQgfSwgeyAubmFtZSA9ICJhdmVyYWdlX25zcl9hbGxvY2F0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEIH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm51bV9vZl9jeWNsZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX2dldF9zdGF0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2Nfc2V0X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSIsIC5kZXNjciA9ICJYR1BPTiBBbGxvYyBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9hbGxvY193aXRoX3N0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDMyIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZWRfc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzZXRfb25fZWRfZmFpbCIsIC5kZXNjciA9ICJyZXNldCBvbiBFRCBmYWlsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSwgcmVzZXRfb25fZWRfZmFpbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJlc2V0X29uX2VkX3N1Y2Nlc3MiLCAuZGVzY3IgPSAicmVzZXQgb24gRUQgc3VjY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZWRfc3RhdGUsIHJlc2V0X29uX2VkX3N1Y2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9lZF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2VkX3N0YXRlIiwgLmRlc2NyID0gInhncG9uIGVkIHN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2VkX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2VkX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2VkX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX2dlbV9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCwgLmxlbl9zaXplID0gMSwgLm1heF9zaXplID0gMTYgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSB9LCB7IC5uYW1lID0gImVuY3J5cHRpb25fbW9kZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0VOQ1JZUFRJT05fTU9ERSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fZ2VtX3BvcnRfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0eF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fZ2VtX3BvcnRfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vdF9jb25maWd1cmVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRCB9LCB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9JTkFDVElWRSB9LCB7IC5uYW1lID0gImFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfQUNUSVZFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSIsIC5kZXNjciA9ICJYR1BPTiBHRU0gUG9ydCBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJnZW1faWQiLCAuZGVzY3IgPSAiR0VNIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLCBnZW1faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5kZXNjciA9ICJYR1BPTiBHRU0gUG9ydCBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDEyOCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDI1NiB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25faXdmX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQgfSwgeyAubmFtZSA9ICJkc190cGlkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25faXdmX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9pd2ZfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25faXdmX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25faXdmX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJ2YWwiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIHByb2Nlc3MgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UsIGludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlXFxkaXNhYmxlIHBlcmlvZGljIHByb2Nlc3Mgb2YgS2V5IEV4Y2hhbmdlIGZvciBhY3RpdmUgT05VcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImVuY3J5cHRlZF9wb3J0c19vbmx5IiwgLmRlc2NyID0gIlBlcmZvcm0ga2V5IGV4Y2hhbmdlIG9ubHkgdG8gT05VcyB3aXRoIEdFTSBwb3J0cyB0aGF0IGhhdmUgZG93bnN0cmVhbSBlbmNyeXB0aW9uIGVuYWJsZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSwgZW5jcnlwdGVkX3BvcnRzX29ubHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIlhHUE9OIEtleSBFeGNoYW5nZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImtleSIsIC5kZXNjciA9ICJBRVMgZW5jcnlwdGlvbiBrZXkgZm9yIG11bHRpY3NhdCBYR0VNIHBvcnQgSURzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5LCBrZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAia2V5X2NvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlXFxEaXNhYmxlIGVuY3J5cHRpb24gb24gbXVsdGljYXN0IFhHRU0gcG9ydHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXksIGtleV9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkiLCAuZGVzY3IgPSAiWEdQT04gTXVsdGljYXN0IGtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX1NFUklBTF9OVU1CRVIgfSwgeyAubmFtZSA9ICJmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04gfSwgeyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImxvcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfTE9TIH0sIHsgLm5hbWUgPSAib251X2Rpc2NvdmVyZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FIH0sIHsgLm5hbWUgPSAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCB9LCB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIHsgLm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwbG9hbSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaHdfcG9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lEIH0sIHsgLm5hbWUgPSAiYXZhaWxhYmxlX2JhbmR3aWR0aCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEggfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMgfSwgeyAubmFtZSA9ICJwb25fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUyB9LCB7IC5uYW1lID0gInBvbl9kaXN0YW5jZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSB9LCB7IC5uYW1lID0gInJhbmdpbmdfd2luZG93X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFIH0sIHsgLm5hbWUgPSAiZXFkX2N5Y2xlc19udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiB9LCB7IC5uYW1lID0gImRyaWZ0X2NvbnRyb2wiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MIH0sIHsgLm5hbWUgPSAibG9zX2FsYXJtX3RocmVzaG9sZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQgfSwgeyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFIH0sIHsgLm5hbWUgPSAib251X2FsYXJtc190aHJlc2hvbGRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTIH0sIHsgLm5hbWUgPSAiYmVyX21vbml0b3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUiB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04gfSwgeyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORyB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcgfSwgeyAubmFtZSA9ICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSB9LCB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUyB9LCB7IC5uYW1lID0gInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HIH0sIHsgLm5hbWUgPSAiZGJhX21vZGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSB9LCB7IC5uYW1lID0gInBsb2FtX2hhbmRsaW5nIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9hbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfZ2VtX3BvcnRfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9rZXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NVUxUSUNBU1RfS0VZIH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OIH0sIHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUIH0sIHsgLm5hbWUgPSAiYWxsX29udXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUyB9LCB7IC5uYW1lID0gImFsbF9tY2FzdF9nZW1fcG9ydHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTIH0sIHsgLm5hbWUgPSAiZGVidWciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9ERUJVRyB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUyB9LCB7IC5uYW1lID0gImRzX2ZlY19tb2RlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUgfSwgeyAubmFtZSA9ICJkYmFfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9UWVBFIH0sIHsgLm5hbWUgPSAib251X3R1bmluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgfSwgeyAubmFtZSA9ICJjYWxjX2NyYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9saXN0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNUIH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2NwdV9wYWNrZXRzIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyIsIC5kZXNjciA9ICJVc2UgaW5jcmVhc2UgYXZhaWxhYmxlIENCUiBiYW5kd2lkdGggZm9yIGJldHRlciBCVyB1dGlsaXphdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGVidWcsIGluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJpbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMiLCAuZGVzY3IgPSAiR2FwIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGJ1cnN0cyBmb3IgdGhlIHNhbWUgT05VIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZywgaW50ZXJfYnVyc3RfZ2FwX2luX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSIsIC5kZXNjciA9ICJOdW1iZXIgb2YgZ2VtIHBvcnRzIHBlciBvbnUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2RlYnVnLCBudW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyIsIC5kZXNjciA9ICJYR1BPTiBOSSBEZWJ1ZyBwYXJhbWV0ZXJzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2RlYnVnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2RlYnVnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2RlYnVnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9sb3NfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9sb3NfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfbG9zIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfbG9zX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIgfSwgeyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUyB9LCB7IC5uYW1lID0gImN1cnJlbnRfZG93bnN0cmVhbV9wb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQgfSwgeyAubmFtZSA9ICJjdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9VUFNUUkVBTV9QT05fSUQgfSwgeyAubmFtZSA9ICJjYWxpYnJhdGlvbl9yZWNvcmQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCB9LCB7IC5uYW1lID0gInR1bmluZ19ncmFudWxhcml0eSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVFVOSU5HX0dSQU5VTEFSSVRZIH0sIHsgLm5hbWUgPSAic3RlcF90dW5pbmdfdGltZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSB9LCB7IC5uYW1lID0gImF0dGVudWF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTiB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX29udV9kaXNjb3ZlcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcmVzZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcmVzZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9yZXNldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcmVzZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcmVzZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSB9LCB7IC5uYW1lID0gIm1lYXN1cmVtZW50X3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJpc19kZWxpbmVhdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTiB9LCB7IC5uYW1lID0gImlzX2VkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VEIH0sIHsgLm5hbWUgPSAicnhfZGF0YSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX21pY19lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9NSUNfRVJST1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCB9LCB7IC5uYW1lID0gInNlY29uZF9yYW5naW5nX3dpbmRvdyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9TRUNPTkRfUkFOR0lOR19XSU5ET1cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSB9LCB7IC5uYW1lID0gImFsbG9jYXRpb25fbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIgfSwgeyAubmFtZSA9ICJid19tYXBfYXJyYXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3NldF9vbnVfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUiB9LCB7IC5uYW1lID0gImVuZXJneV9kZXRlY3Rfc2lnbmFsIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxpc3Rfb2Zfb251X2lkcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUyB9LCB7IC5uYW1lID0gImJpcDMyX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTIH0sIHsgLm5hbWUgPSAiYmlwMzJfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X3hndGNfaGVhZGVycyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMgfSwgeyAubmFtZSA9ICJyeF94Z3RjX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gInJ4X3hndGNfdW5jb3JyZWN0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCB9LCB7IC5uYW1lID0gInJ4X3hnZW0iLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTSB9LCB7IC5uYW1lID0gInJ4X3hnZW1fZHJvcHBlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQgfSwgeyAubmFtZSA9ICJyeF94Z2VtX2lkbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFIH0sIHsgLm5hbWUgPSAicnhfeGdlbV9jb3JyZWN0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJyeF9jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfZnJhZ21lbnRfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQgfSwgeyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19sb25nIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcgfSwgeyAubmFtZSA9ICJyeF9rZXlfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SIH0sIHsgLm5hbWUgPSAidHhfcGxvYW1zIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUyB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCB9LCB7IC5uYW1lID0gInJ4X3Bsb2FtcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUiB9LCB7IC5uYW1lID0gInJ4X2NwdSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kgfSwgeyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJ0eF94Z2VtIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0gfSwgeyAubmFtZSA9ICJ0eF9jcHUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVIH0sIHsgLm5hbWUgPSAidHhfb21jaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJIH0sIHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCB9LCB7IC5uYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCB9LCB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdHBpZF9taXNzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF92aWRfbWlzcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCB9LCB7IC5uYW1lID0gInByZXZpb3VzX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidG9kX3N0cmluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcgfSwgeyAubmFtZSA9ICJzZmMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X3NlYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDIH0sIHsgLm5hbWUgPSAicnRjX29mZnNldF9uc2VjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDIH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3RvZF9yZXF1ZXN0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ4Z3Bvbl9zdXBwb3J0XzI1Nl9vbnVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19YR1BPTl9TVVBQT1JUXzI1Nl9PTlVTIH0sIHsgLm5hbWUgPSAieGdwb25fc3VwcG9ydF81MTBfb251cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX251bV9vZl9vbnVzID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbnVtX29mX29udXMiLCAuZGVzY3IgPSAieGdwb24gbnVtIG9mIG9udXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbnVtX29mX29udXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbnVtX29mX29udXNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC5kZXNjciA9ICJQZXJmb3JtIHNpbmdsZSBrZXkgZXhjaGFuZ2UgZHVyaW5nIGFjdGl2YXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiwga2V5X2V4Y2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCIsIC5kZXNjciA9ICJEZWFjdGl2YXRlIE9OVSBkdWUgdG8gcmVnaXN0cmF0aW9uIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uLCBmYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJYR1BPTiBPTlUgQWN0aXZhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04gfSwgeyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGggZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVuY3J5cHRpb25fa2V5IiwgLmRlc2NyID0gImVuY3J5cHRpb24ga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSwgZW5jcnlwdGlvbl9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAia2V5X2luZGV4IiwgLmRlc2NyID0gImtleSBpbmRleCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Flc19rZXksIGtleV9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2Flc19rZXkiLCAuZGVzY3IgPSAiWEdQT04gT05VIEFFUyBLRVkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2Flc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXlfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvc2kiLCAuZGVzY3IgPSAiTG9zcyBvZiBzaWduYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgbG9zaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImxvYmkiLCAuZGVzY3IgPSAiTG9zcyBvZiBidXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBsb2JpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9wY2kiLCAuZGVzY3IgPSAiTG9zcyBvZiBQTE9BTSBjaGFubmVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvcGNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9wY2lfbWljX2Vycm9yIiwgLmRlc2NyID0gIk1pYyBlcnJvciBvbiBwbG9hbSBjaGFubmVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvcGNpX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImxvb2NpIiwgLmRlc2NyID0gIkxvc3Mgb2YgT01DSSBjaGFubmVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvb2NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJUcmFuc21pc3Npb24gaW50ZXJmZXJlbmNlIEFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIHRpd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkb3dpIiwgLmRlc2NyID0gIkRyaWZ0IG9mIFdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAic3VmaSIsIC5kZXNjciA9ICJTdGFydCBVUCBGYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiU2lnbmFsIEZhaWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgc2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAic2RpIiwgLmRlc2NyID0gIlNpZ25hbCBEZWdyYWRlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBzZGkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkZmkiLCAuZGVzY3IgPSAiRGVhY3RpdmF0aW9uIEZhaWx1cmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgZGZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGdpIiwgLmRlc2NyID0gIkR5aW5nIGdhc3AiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgZGdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAicHFzaSIsIC5kZXNjciA9ICJQbG9hbSBxdWV1ZSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgcHFzaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJYR1BPTiBPTlUgYWxhcm0gc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJMT1NpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zLCBsb3NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9iaSIsIC5kZXNjciA9ICJMT0JpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zLCBsb2JpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9wY2lfbWlzcyIsIC5kZXNjciA9ICJMT1BDaSBtaXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zLCBsb3BjaV9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9wY2lfbWljX2Vycm9yIiwgLmRlc2NyID0gIkxPUENpIG1pYyBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtcywgbG9wY2lfbWljX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtcyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hbGFybXMiLCAuZGVzY3IgPSAiWEdQT04gT05VIGFsYXJtcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1NpIGFsYXJtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzLCBsb3NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9iaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT0JpIGFsYXJtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzLCBsb2JpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9vY2kiLCAuZGVzY3IgPSAiVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9PQ2kgYWxhcm0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvb2NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9wY2kiLCAuZGVzY3IgPSAiVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9QQ2kgYWxhcm0uICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzLCBsb3BjaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJYR1BPTiBPTlUgYWxhcm1zIHRocmVzaG9sZHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGZpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJIH0sIHsgLm5hbWUgPSAiZGdpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREdJIH0sIHsgLm5hbWUgPSAiZG93aSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kgfSwgeyAubmFtZSA9ICJpbnZhbGlkX2RicnVfcmVwb3J0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCB9LCB7IC5uYW1lID0gImxvb2NpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfTE9PQ0kgfSwgeyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0gfSwgeyAubmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV90dW5pbmdfaW5fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19JTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04gfSwgeyAubmFtZSA9ICJwb3NzaWJsZV9kcmlmdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUIH0sIHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxfcmVwb3J0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTEVWRUxfUkVQT1JUIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSB9LCB7IC5uYW1lID0gInBxc2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QUVNJIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCB9LCB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzZGkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TREkgfSwgeyAubmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJzZmkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRkkgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIHsgLm5hbWUgPSAic3VmaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSB9LCB7IC5uYW1lID0gInR1bmluZ19yZXNwb25zZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RVTklOR19SRVNQT05TRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX1NUQVRFIH0sIHsgLm5hbWUgPSAib251X29sZF9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfT0xEX1NUQVRFIH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMgfSwgeyAubmFtZSA9ICJjdXJyZW50X2VuY3J5cHRpb25fa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NVUlJFTlRfRU5DUllQVElPTl9LRVkgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmciLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEX0FVVE9fTEVBUk5JTkcgfSwgeyAubmFtZSA9ICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFIH0sIHsgLm5hbWUgPSAiZGF0YV9idXJzdF9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRSB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUgfSwgeyAubmFtZSA9ICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OIH0sIHsgLm5hbWUgPSAiYWxsX2dlbV9wb3J0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTIH0sIHsgLm5hbWUgPSAiYWxsX2FsbG9jcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTIH0sIHsgLm5hbWUgPSAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FIH0sIHsgLm5hbWUgPSAidXNfbGluZV9yYXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSB9LCB7IC5uYW1lID0gImNhbGlicmF0aW9uX3JlY29yZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQgfSwgeyAubmFtZSA9ICJ0dW5pbmdfZ3JhbnVsYXJpdHkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVFVOSU5HX0dSQU5VTEFSSVRZIH0sIHsgLm5hbWUgPSAic3RlcF90dW5pbmdfdGltZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTIH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MIH0sIHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0FUVEVOVUFUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCB9LCB7IC5uYW1lID0gImNyY19vayIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFIH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jcHVfcGFja2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMgfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfY3B1X3BhY2tldHMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2RmaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9ERklfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kZmlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2RmaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2RmaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9kZ2lfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9kZ2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kZ2lfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2RnaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9EUklGVF9WQUxVRSB9LCB7IC5uYW1lID0gIm5ld19lcWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX05FV19FUUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kb3dpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9kb3dpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2VxZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZXFkIiwgLmRlc2NyID0gIkVRRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2VxZCwgZXFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZXFkIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBFUUQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2VxZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9vbnVfZXFkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2VxZCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkKSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImV4cGVjdGVkX2tleSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZIH0sIHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2xvb2NpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCB9LCB7IC5uYW1lID0gImNyY19vayIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSyB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X29tY2lfcGFja2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRCB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X2FsYXJtIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxUIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRhcmdldF9kc19wb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfRFNfUE9OX0lEIH0sIHsgLm5hbWUgPSAidGFyZ2V0X3VzX3Bvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9VU19QT05fSUQgfSwgeyAubmFtZSA9ICJ0aW1lX3RvX3N3aXRjaCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIIH0sIHsgLm5hbWUgPSAicm9sbGJhY2siLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSyB9LCB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZWZhdWx0X2tleSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSB9LCB7IC5uYW1lID0gInBsb2FtIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bsb2FtX3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfZHJpZnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImF0dGVudWF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX0FUVEVOVUFUSU9OIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVFkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9sZF9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSB9LCB7IC5uYW1lID0gInJlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wcXNpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wcXNpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCB7IC5uYW1lID0gImVxZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wbG9hbXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lEIH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUyB9LCB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGxvYW1faWsiLCAuZGVzY3IgPSAicGxvYW0gaWsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cywgcGxvYW1faWspLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAib21jaV9payIsIC5kZXNjciA9ICJvbWNpIGlrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMsIG9tY2lfaWspLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAib21jaV9rMSIsIC5kZXNjciA9ICJvbWNpIGsxIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMsIG9tY2lfazEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAib21jaV9rMiIsIC5kZXNjciA9ICJvbWNpIGsyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMsIG9tY2lfazIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAia2VrIiwgLmRlc2NyID0gImtlayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzLCBrZWspLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIiwgLmRlc2NyID0gIlhHUE9OIE9OVSByZWdpc3RyYXRpb24ga2V5cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzbWFfZmxhZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX1NNQV9GTEFHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NkaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiYmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0JFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zZGkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZGlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3NkaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9GQUlMX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYXN0ZXJfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZIH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIgfSwgeyAubmFtZSA9ICJtaWMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01JQyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiYmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zZmkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvc2l0aXZlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCB9LCB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCB9LCB7IC5uYW1lID0gImRlbGltaXRlcl9taXNzX2RldGVjdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OIH0sIHsgLm5hbWUgPSAiYmlwMzJfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF93b3JkcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFMgfSwgeyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX3N5bWJvbHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUyB9LCB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUyB9LCB7IC5uYW1lID0gImZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUyB9LCB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfYml0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9CSVRTIH0sIHsgLm5hbWUgPSAieGdlbV9rZXlfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlMgfSwgeyAubmFtZSA9ICJ4Z2VtX2xvc3MiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUyB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19taWNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kgfSwgeyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTIH0sIHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdWZpX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N1ZmlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N1ZmkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdWZpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0RSSUZUX1ZBTFVFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Rpd2lfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfdGl3aSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Rpd2lfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3Rpd2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY2siLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfQUNLIH0sIHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV90dW5pbmdfcmVzcG9uc2UgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSIsIC5kZXNjciA9ICJYR1BPTiBPTlUgV2l0aCBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX29udV93aXRoX3N0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDUxMCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFja190aW1lb3V0IiwgLmRlc2NyID0gIlRpbWVvdXQgZm9yIHJlY2VpdmluZyBBQ0sgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nLCBhY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJyZXRyYW5zX3JhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJOdW1iZXIgb2YgUmFuZ2luZyBUaW1lIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZywgcmV0cmFuc19yYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgQXNzaWduIEFsbG9jIElEIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZywgcmV0cmFuc19hc3NpZ25fYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyZXRyYW5zX2tleV9jb250cm9sIiwgLmRlc2NyID0gIk51bWJlciBvZiBLZXkgQ29udHJvbCBwbG9hbSByZXRyYW5zbWlzc2lvbnMgaW4gY2FzZSBvZiBBQ0sgdGltZW91dCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcsIHJldHJhbnNfa2V5X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uIiwgLmRlc2NyID0gIk51bWJlciBvZiBSZXF1ZXN0IFJlZ2lzdHJhdGlvbiBwbG9hbSByZXRyYW5zbWlzc2lvbnMgaW4gY2FzZSBvZiBBQ0sgdGltZW91dCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcsIHJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIiwgLmRlc2NyID0gIlhHUE9OIFBMT0FNIGhhbmRsaW5nIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInRpbWVvdXQiLCAuZGVzY3IgPSAiTE9TIHN3aXRjaCBvdmVyIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZywgdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJncGlvX3BpbiIsIC5kZXNjciA9ICJHUElPIHBpbiBmb3IgaW5wdXQvb3V0cHV0IHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIGdwaW9fcGluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSwgeyAubmFtZSA9ICJmYXN0X3JhbmdpbmciLCAuZGVzY3IgPSAiZmFzdCByYW5naW5nICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIGZhc3RfcmFuZ2luZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiWEdQT04gcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkYXRhX21hcF9kZWxheV9tcyIsIC5kZXNjciA9ICJkZWxheSB0byB3YWl0IGFmdGVyIHNlbmRpbmcgcmFuZ2luZyB0aW1lIGRlbHRhIGJlZm9yZSBydW5uaW5nIHRoZSBkYXRhIG1hcCAgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZywgZGF0YV9tYXBfZGVsYXlfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJTaG91bGQgdGhlIFNNIHNlbmQgdGhlIGN1cnJlbnQgcmFuZ2luZyB0aW1lIGJlZm9yZSBkb2luZyB0aGUgcmUtcmFuZ2luZyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCByZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSIsIC5kZXNjciA9ICJ0aGUgZGVsYXkgYmV0d2VlbiBzZW5kaW5nIHRoZSByYW5naW5nIHRpbWUgYW5kIHN0YXJ0aW5nIHRoZSByZXJhbmdlICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIHJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyIsIC5kZXNjciA9ICJ4Z3BvbiBwcm90ZWN0aW9uIHN3aXRjaGluZyBkZWJ1ZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9sYXJpdHkiLCAuZGVzY3IgPSAiUlNTSSBzaWduYWwgcG9sYXJpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZywgcG9sYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb2xhcml0eSB9LCB7IC5uYW1lID0gImxvY2F0aW9uIiwgLmRlc2NyID0gIlJTU0kgc2lnbmFsIGxvY2F0aW9uIGluIHdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcsIGxvY2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9jYXRpb25fc2lnbiIsIC5kZXNjciA9ICJSU1NJIHNpZ25hbCBsb2NhdGlvbiBzaWduIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcsIGxvY2F0aW9uX3NpZ24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zaWduIH0sIHsgLm5hbWUgPSAicHVsc2Vfd2lkdGgiLCAuZGVzY3IgPSAiUlNTSSBwdWxzZSB3aWR0aCBpbiB3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnLCBwdWxzZV93aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtaW5pbXVtX2J1cnN0IiwgLmRlc2NyID0gIkRhdGEgbWluaW11bSBidXJzdCBzaXplIGluIHdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcsIG1pbmltdW1fYnVyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gIlhHUE9OIFJTU0kgbm9ybWFsIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGFydF9vbl9lZCIsIC5kZXNjciA9ICJzdGFydCBvbiBFRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZywgc3RhcnRfb25fZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJmcmFtZV9kZWxheSIsIC5kZXNjciA9ICJmcmFtZSBkZWxheSBmcm9tIEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnLCBmcmFtZV9kZWxheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndvcmRfZGVsYXkiLCAuZGVzY3IgPSAid29yZCBkZWxheSBmcm9tIEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnLCB3b3JkX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZyYW1lX2RlbGF5X2FmdGVyX2VkIiwgLmRlc2NyID0gImZyYW1lIGRlbGF5IGZyb20gc3RhcnQgIG9mIHJhbmdpbmcgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnLCBmcmFtZV9kZWxheV9hZnRlcl9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndvcmRfZGVsYXlfYWZ0ZXJfZWQiLCAuZGVzY3IgPSAid29yZCBkZWxheSBmcm9tIHN0YXJ0ICBvZiByYW5naW5nIHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZywgd29yZF9kZWxheV9hZnRlcl9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyIsIC5kZXNjciA9ICJ4Z3BvbiByc3NpIHJhbmdpbmcgY29uZmlnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9maXJzdCIsIC5kZXNjciA9ICJ0cnggcmVzZXQgcGF0dGVybiBmaXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCB0cnhfcmVzZXRfcGF0dGVybl9maXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIiwgLmRlc2NyID0gInRyeCByZXNldCBwYXR0ZXJuIG1pZGRsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCB0cnhfcmVzZXRfcGF0dGVybl9taWRkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gInRyeF9yZXNldF9wYXR0ZXJuX2xhc3QiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBhdHRlcm4gbGFzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCB0cnhfcmVzZXRfcGF0dGVybl9sYXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IG1pZGRsZSByZXBlYXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIHRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInRyeF9yZXNldF9sb2NhdGlvbiIsIC5kZXNjciA9ICJ0cnggcmVzZXQgbG9jYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiwgdHJ4X3Jlc2V0X2xvY2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcGF0dGVybiBmaXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCBiY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiLCAuZGVzY3IgPSAiYmNkciByZXNldCBwYXR0ZXJuIG1pZGRsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCBiY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBhdHRlcm4gbGFzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCBiY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IG1pZGRsZSByZXBlYXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X2xvY2F0aW9uIiwgLmRlc2NyID0gImJjZHIgcmVzZXQgbG9jYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiwgYmNkcl9yZXNldF9sb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfcG9sYXJpdHkiLCAuZGVzY3IgPSAiYmNkciByZXNldCBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCBiY2RyX3Jlc2V0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIiwgLmRlc2NyID0gInhncG9uIHJ4IHJhbmdpbmcgU00gcGF0dGVybnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0VEIH0sIHsgLm5hbWUgPSAiYmNkciIsIC52YWwgPSBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSIH0sIHsgLm5hbWUgPSAiZmFzdF9yYW5naW5nMSIsIC52YWwgPSBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX1JBTkdJTkcxIH0sIHsgLm5hbWUgPSAiZmFzdF9yYW5naW5nMiIsIC52YWwgPSBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX1JBTkdJTkcyIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUiLCAuZGVzY3IgPSAieGdwb24gc2VyZGVzIHJhbmdpbmcgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm11bHRpX2VkX21vZGUiLCAuZGVzY3IgPSAibXVsdGkgZWQgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24sIG11bHRpX2VkX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX21vZGUiLCAuZGVzY3IgPSAicmFuZ2luZyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiwgcmFuZ2luZ19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAieGdwb24gc2VyZGVzIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJ2YWwiLCAuZGVzY3IgPSAiU04gcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uLCBpbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIlNOIHByb2Nlc3MgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24sIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAib251X3Bvc3RfZGlzY292ZXJ5X21vZGUiLCAuZGVzY3IgPSAiQXV0b21hdGljIG9wZXJhdGlvbiBmb2xsb3dpbmcgT05VIGRpc2NvdmVyeSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24sIG9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgfSwgeyAubmFtZSA9ICJidXJzdF9wcm9maWxlIiwgLmRlc2NyID0gIkJ1cnN0IHByb2ZpbGUgaW5kZXggdG8gdXNlIGR1cmluZyBTTiBhY3F1aXNpdGlvbiB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uLCBidXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJYR1BPTiBTTiBBY3F1aXNpdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYnVyc3RfcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFIH0sIHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRyB9LCB7IC5uYW1lID0gInRyYW5zY2VpdmVyX3R5cGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSB9LCB7IC5uYW1lID0gImRlYnVnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHIH0sIHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRyB9LCB7IC5uYW1lID0gInJzc2lfcmFuZ2luZ19jb25maWciLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9SQU5HSU5HX0NPTkZJRyB9LCB7IC5uYW1lID0gInNlcmRlc19jb25maWd1cmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OIH0sIHsgLm5hbWUgPSAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfQVRfSU5JVCB9LCB7IC5uYW1lID0gInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0VEX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJyZXNldF9vbl9kZWxfbWlzcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SRVNFVF9PTl9ERUxfTUlTUyB9LCB7IC5uYW1lID0gImVkX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFIH0sIHsgLm5hbWUgPSAiaW52ZXJ0X2VkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCB9LCB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yZXNldCIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkVTRVQgfSwgeyAubmFtZSA9ICJ0cnhfcnN0X3BvbGFyaXR5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSWF9SU1RfUE9MQVJJVFkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl90cnhfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF9yZXZlcnNlZF9wb2xhcml0eSIsIC5kZXNjciA9ICJ0cmFuc2NlaXZlciByZXZlcnNlZCBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2RlYnVnLCByeF9yZXZlcnNlZF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJuZWdfb3V0X2JpdCIsIC5kZXNjciA9ICJ0dXJuIGFsbCAxIHRvIDAgYW5kIGFsbCAwIHRvIDEgYXQgdGhlIG91dHB1dC4gZGVmYXVsdCBpcyBub3QgdG8gbWFrZSBuZWdhdGl2ZSBiaXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcsIG5lZ19vdXRfYml0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyIsIC5kZXNjciA9ICJ4Z3Bvbl90cnhfZGVidWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2RlYnVnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfZGVidWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl90cnhfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX3RyeF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fdHJ4X3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibHRoXzcyMjJfcGMiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF83MjIyX1BDIH0sIHsgLm5hbWUgPSAidXNlcl9kZWZpbmVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9VU0VSX0RFRklORUQgfSwgeyAubmFtZSA9ICJ3dGRfcnR4bTI2Nl83MDIiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1dURF9SVFhNMjY2XzcwMiB9LCB7IC5uYW1lID0gImx0aF83MjIyX2JjX3BsdXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF83MjIyX0JDX1BMVVMgfSwgeyAubmFtZSA9ICJsdGhfNzIyNl9wYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjZfUEMgfSwgeyAubmFtZSA9ICJsdGhfNTMwMl9wYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzUzMDJfUEMgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9nZW5lcmFsXzEiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1hHUE9OX0dFTkVSQUxfMSB9LCB7IC5uYW1lID0gInhncG9uX2dlbmVyYWxfMiIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWEdQT05fR0VORVJBTF8yIH0sIHsgLm5hbWUgPSAibHR3XzYyN194X3BjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVFdfNjI3X1hfUEMgfSwgeyAubmFtZSA9ICJ4cHBfeGVfcl8zX2NkZmIiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1hQUF9YRV9SXzNfQ0RGQiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF90eXBlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X3R5cGUiLCAuZGVzY3IgPSAiWEdQT04gVFJYIHR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fdHJ4X3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X3ZnYSIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSB9LCB7IC5uYW1lID0gInJ4X3BmIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYgfSwgeyAubmFtZSA9ICJyeF9sZnBmIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRiB9LCB7IC5uYW1lID0gInJ4X2RmZTEiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxIH0sIHsgLm5hbWUgPSAicnhfZGZlMiIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIgfSwgeyAubmFtZSA9ICJyeF9kZmUzIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMyB9LCB7IC5uYW1lID0gInJ4X2RmZTQiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0IH0sIHsgLm5hbWUgPSAicnhfZGZlNSIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUgfSwgeyAubmFtZSA9ICJ0eF9wcmUiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUgfSwgeyAubmFtZSA9ICJ0eF9tYWluIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTiB9LCB7IC5uYW1lID0gInR4X3Bvc3QxIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MiIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyIH0sIHsgLm5hbWUgPSAidHhfcG9zdDMiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMyB9LCB7IC5uYW1lID0gInR4X2FtcCIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4cG9uX3NlcmRlc19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImluc3RhbmNlIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeHBvbl9zZXJkZXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBhZV9uaSA9PT09ICovCisKKy8qIEdyb3VwOiBhZV9uaSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX25pX2tleV9hZV9uaSA9IHsgLm5hbWUgPSAiYWVfbmkiLCAuZGVzY3IgPSAiVGhlIGluZGV4IG9mIGEgc3BlY2lmaWMgQUUgTkkgaW5zdGFuY2UgYXMgc2VlbiBieSB0aGUgaG9zdC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2tleSwgYWVfbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfbmlfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfbmlfa2V5X2FlX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWVfbmkiLCAuZGVzY3IgPSAiVGhlIGluZGV4IG9mIGEgc3BlY2lmaWMgQUUgTkkgaW5zdGFuY2UgYXMgc2VlbiBieSB0aGUgaG9zdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2tleSwgYWVfbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9uaSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX25pX2NmZ19tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIHVzZWQgZm9yIGFsbCBmcmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBPTFQgb24gdGhlIG5ldHdvcmsuICBUaGlzIHZhbHVlIG11c3QgYmUgc2V0IGJlZm9yZSBBRV9OSSBpcyBmaXJzdCBlbmFibGVkLCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEFFX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfY2ZnX2FlX25pX2VuID0geyAubmFtZSA9ICJhZV9uaV9lbiIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgQUUgTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBhZV9uaV9lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfY2ZnX210dV8xMGcgPSB7IC5uYW1lID0gIm10dV8xMGciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgQUVfTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBtdHVfMTBnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX25pX2NmZ19wcmJzX2dlbmVyYXRvciA9IHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfY2ZnX3ByYnNfY2hlY2tlciA9IHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9uaV9jZmdfcHJic19zdGF0dXMgPSB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9uaV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9uaV9jZmdfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2FlX25pX2NmZ19hZV9uaV9lbiwgJnByb3BfZGVzY3JfYWVfbmlfY2ZnX210dV8xMGcsICZwcm9wX2Rlc2NyX2FlX25pX2NmZ19wcmJzX2dlbmVyYXRvciwgJnByb3BfZGVzY3JfYWVfbmlfY2ZnX3ByYnNfY2hlY2tlciwgJnByb3BfZGVzY3JfYWVfbmlfY2ZnX3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgdXNlZCBmb3IgYWxsIGZyYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE9MVCBvbiB0aGUgbmV0d29yay4gIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQgYmVmb3JlIEFFX05JIGlzIGZpcnN0IGVuYWJsZWQsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgQUVfTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJhZV9uaV9lbiIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgQUUgTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgYWVfbmlfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9lbl9zdGF0ZSB9LCB7IC5uYW1lID0gIm10dV8xMGciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgQUVfTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgbXR1XzEwZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBwcmJzX2NoZWNrZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX25pX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9uaSAtIHNldF9hZV9uaV9lbl9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX1NFVF9BRV9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9lbl9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0IHRoZSBBRSBOSSBlbmFibGUgc3RhdGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGFlX3BhdGhfZHMgPT09PSAqLworCisvKiBHcm91cDogYWVfcGF0aF9kcyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfa2V5X2FlX25pID0geyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJBRSBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX0tFWV9JRF9BRV9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSwgYWVfbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX2tleV9hZV9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWVfbmkiLCAuZGVzY3IgPSAiQUUgTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfZHNfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9ieXRlcywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc182NCwgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18yNTZfNTExLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18xNTE5XzIwNDcsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc185MjE3XzE2MzgzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2RhdGFfYnl0ZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9hYm9ydF9mcmFtZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGFib3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogYWVfcGF0aF9kcyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfZHNfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogYWVfcGF0aF9kcyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogYWVfcGF0aF9kcyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBhZV9wYXRoX3VzID09PT0gKi8KKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX2tleV9hZV9uaSA9IHsgLm5hbWUgPSAiYWVfbmkiLCAuZGVzY3IgPSAiQUUgTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfa2V5X2FlX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJBRSBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX3VzIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXMgPSB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2RhdGFfYnl0ZXMgPSB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9tdWx0aWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWJvcnRfZnJhbWVzID0geyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mY3NfZXJyb3IgPSB7IC5uYW1lID0gImZjc19lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GQ1NfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfb3ZlcnNpemVfZXJyb3IgPSB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X3J1bnRfZXJyb3IgPSB7IC5uYW1lID0gInJ1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgcnVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYnl0ZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWJvcnRfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZmNzX2Vycm9yLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfb3ZlcnNpemVfZXJyb3IsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9ydW50X2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmY3NfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBvdmVyc2l6ZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJydW50X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX3VzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF91c19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX3VzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX3VzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF91c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGNoYW5uZWwgPT09PSAqLworCisvKiBHcm91cDogY2hhbm5lbCAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2NoYW5uZWxfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGNoYW5uZWxfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfY2hhbm5lbF9rZXlfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9jaGFubmVsX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogY2hhbm5lbCAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2NoYW5uZWxfY2ZnX29wZXJhdGlvbl9jb250cm9sID0geyAubmFtZSA9ICJvcGVyYXRpb25fY29udHJvbCIsIC5kZXNjciA9ICJPcGVyYXRpb24gY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9PUEVSQVRJT05fQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhLCBvcGVyYXRpb25fY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfY2hhbm5lbF9jZmdfdG9sID0geyAubmFtZSA9ICJ0b2wiLCAuZGVzY3IgPSAiVHJhbnNtaXQgT3B0aWNhbCBMZXZlbC4gQW4gaW5kaWNhdGlvbiBvZiB0aGUgY3VycmVudCBPTFQgQ1QgdHJhbnNjZWl2ZXIgY2hhbm5lbCBsYXVuY2ggcG93ZXIgaW50byB0aGUgT0ROIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhLCB0b2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfY2hhbm5lbF9jZmdfc3lzdGVtX3Byb2ZpbGUgPSB7IC5uYW1lID0gInN5c3RlbV9wcm9maWxlIiwgLmRlc2NyID0gIlN5c3RlbSBwcm9maWxlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIHN5c3RlbV9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX3Byb2ZpbGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9jaGFubmVsX2NmZ19jaGFubmVsX3Byb2ZpbGUgPSB7IC5uYW1lID0gImNoYW5uZWxfcHJvZmlsZSIsIC5kZXNjciA9ICJDaGFubmVsIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIGNoYW5uZWxfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGNoYW5uZWxfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfY2hhbm5lbF9jZmdfb3BlcmF0aW9uX2NvbnRyb2wsICZwcm9wX2Rlc2NyX2NoYW5uZWxfY2ZnX3RvbCwgJnByb3BfZGVzY3JfY2hhbm5lbF9jZmdfc3lzdGVtX3Byb2ZpbGUsICZwcm9wX2Rlc2NyX2NoYW5uZWxfY2ZnX2NoYW5uZWxfcHJvZmlsZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvcGVyYXRpb25fY29udHJvbCIsIC5kZXNjciA9ICJPcGVyYXRpb24gY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgb3BlcmF0aW9uX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vcGVyYXRpb25fY29udHJvbCB9LCB7IC5uYW1lID0gInRvbCIsIC5kZXNjciA9ICJUcmFuc21pdCBPcHRpY2FsIExldmVsLiBBbiBpbmRpY2F0aW9uIG9mIHRoZSBjdXJyZW50IE9MVCBDVCB0cmFuc2NlaXZlciBjaGFubmVsIGxhdW5jaCBwb3dlciBpbnRvIHRoZSBPRE4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIHRvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzeXN0ZW1fcHJvZmlsZSIsIC5kZXNjciA9ICJTeXN0ZW0gcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgc3lzdGVtX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fcHJvZmlsZSB9LCB7IC5uYW1lID0gImNoYW5uZWxfcHJvZmlsZSIsIC5kZXNjciA9ICJDaGFubmVsIHByb2ZpbGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIGNoYW5uZWxfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9jaGFubmVsX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBkZWJ1ZyA9PT09ICovCisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RlYnVnX2tleV9yZXNlcnZlZCA9IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKSIsIC5hY2Nlc3MgPSAwLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfS0VZX0lEX1JFU0VSVkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGVidWdfa2V5X3Jlc2VydmVkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRlYnVnIC0gY2xpX2lucHV0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2xpX2lucHV0X2RhdGEgPSB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAiSW5wdXQgU3RyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0NMSV9JTlBVVF9JRF9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhLCBkYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19jbGlfaW5wdXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZWJ1Z19jbGlfaW5wdXRfZGF0YSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGF0YSIsIC5kZXNjciA9ICJJbnB1dCBTdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhLCBkYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhIiwgLmRlc2NyID0gIkNMSSBJbnB1dCBTdHJpbmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGVidWcgLSBjbGlfb3V0cHV0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2xpX291dHB1dF9kYXRhID0geyAubmFtZSA9ICJkYXRhIiwgLmRlc2NyID0gIm91dHB1dCBkYXRhIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRlYnVnX2NsaV9vdXRwdXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkYXRhIiwgLmRlc2NyID0gIm91dHB1dCBkYXRhIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSIsIC5kZXNjciA9ICJDTEkgT3V0cHV0IFN0cmluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RlYnVnX2NmZ19jb25zb2xlX3JlZGlyZWN0aW9uID0geyAubmFtZSA9ICJjb25zb2xlX3JlZGlyZWN0aW9uIiwgLmRlc2NyID0gIkxvZyBvdXRwdXQgcmVkaXJlY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGNvbnNvbGVfcmVkaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2luZGljYXRpb25zX2Ryb3BwZWQgPSB7IC5uYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGluZGljYXRpb25zIGRyb3BwZWQgZHVlIHRvIGNvbmdlc3Rpb24gLyBzaGFwaW5nLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBpbmRpY2F0aW9uc19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RlYnVnX2NmZ19maWxlX3VzZWRfcGVyY2VudCA9IHsgLm5hbWUgPSAiZmlsZV91c2VkX3BlcmNlbnQiLCAuZGVzY3IgPSAiRERSIGxvZyBmaWxlIHVzZWQgcGVyY2VudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgZmlsZV91c2VkX3BlcmNlbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfY2ZnID0geyAubmFtZSA9ICJhcGlfY2FwdHVyZV9jZmciLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBmb3IgQVBJIGNhcHR1cmUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGFwaV9jYXB0dXJlX2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RlYnVnX2NmZ19hcGlfY2FwdHVyZV9zdGF0cyA9IHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfc3RhdHMiLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBvbiB0aGUgbW9zdCByZWNlbnQgQVBJIGNhcHR1cmUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBhcGlfY2FwdHVyZV9zdGF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkID0geyAubmFtZSA9ICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCIsIC5kZXNjciA9ICJDb250cm9scyB3aGF0IHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGlzIHJldHVybmVkIHdoZW4gcGVyZm9ybWluZyBhIGNmZ19nZXQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX2J1ZmZlciA9IHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfYnVmZmVyIiwgLmRlc2NyID0gIlRoZSBwb3J0aW9uIG9mIHRoZSBjYXB0dXJlIGJ1ZmZlciBjdXJyZW50bHkgc3BlY2lmaWVkIGJ5IGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGFwaV9jYXB0dXJlX2J1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2NvbnNvbGVfcmVkaXJlY3Rpb24sICZwcm9wX2Rlc2NyX2RlYnVnX2NmZ19pbmRpY2F0aW9uc19kcm9wcGVkLCAmcHJvcF9kZXNjcl9kZWJ1Z19jZmdfZmlsZV91c2VkX3BlcmNlbnQsICZwcm9wX2Rlc2NyX2RlYnVnX2NmZ19hcGlfY2FwdHVyZV9jZmcsICZwcm9wX2Rlc2NyX2RlYnVnX2NmZ19hcGlfY2FwdHVyZV9zdGF0cywgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLCAmcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb25zb2xlX3JlZGlyZWN0aW9uIiwgLmRlc2NyID0gIkxvZyBvdXRwdXQgcmVkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBjb25zb2xlX3JlZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB9LCB7IC5uYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGluZGljYXRpb25zIGRyb3BwZWQgZHVlIHRvIGNvbmdlc3Rpb24gLyBzaGFwaW5nLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGluZGljYXRpb25zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZmlsZV91c2VkX3BlcmNlbnQiLCAuZGVzY3IgPSAiRERSIGxvZyBmaWxlIHVzZWQgcGVyY2VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGZpbGVfdXNlZF9wZXJjZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfY2ZnIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gZm9yIEFQSSBjYXB0dXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGFwaV9jYXB0dXJlX2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB9LCB7IC5uYW1lID0gImFwaV9jYXB0dXJlX3N0YXRzIiwgLmRlc2NyID0gIlN0YXRpc3RpY3Mgb24gdGhlIG1vc3QgcmVjZW50IEFQSSBjYXB0dXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGFwaV9jYXB0dXJlX3N0YXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCIsIC5kZXNjciA9ICJDb250cm9scyB3aGF0IHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGlzIHJldHVybmVkIHdoZW4gcGVyZm9ybWluZyBhIGNmZ19nZXQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfYnVmZmVyIiwgLmRlc2NyID0gIlRoZSBwb3J0aW9uIG9mIHRoZSBjYXB0dXJlIGJ1ZmZlciBjdXJyZW50bHkgc3BlY2lmaWVkIGJ5IGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGFwaV9jYXB0dXJlX2J1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGVidWcgLSBmaWxlX2FsbW9zdF9mdWxsICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIHN0YXJ0X2FwaV9jYXB0dXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZGVidWcgLSBzdG9wX2FwaV9jYXB0dXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIHJlc2V0X2FwaV9jYXB0dXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZGVidWcgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RlYnVnX2F1dG9fY2ZnX2NsaV9vdXRwdXQgPSB7IC5uYW1lID0gImNsaV9vdXRwdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNsaV9vdXRwdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhLCBjbGlfb3V0cHV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfYXV0b19jZmdfZmlsZV9hbG1vc3RfZnVsbCA9IHsgLm5hbWUgPSAiZmlsZV9hbG1vc3RfZnVsbCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZmlsZV9hbG1vc3RfZnVsbFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEsIGZpbGVfYWxtb3N0X2Z1bGwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RlYnVnX2F1dG9fY2ZnX2NsaV9vdXRwdXQsICZwcm9wX2Rlc2NyX2RlYnVnX2F1dG9fY2ZnX2ZpbGVfYWxtb3N0X2Z1bGwgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2xpX291dHB1dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY2xpX291dHB1dFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSwgY2xpX291dHB1dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImZpbGVfYWxtb3N0X2Z1bGwiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImZpbGVfYWxtb3N0X2Z1bGxcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEsIGZpbGVfYWxtb3N0X2Z1bGwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZGV2aWNlID09PT0gKi8KKworLyogR3JvdXA6IGRldmljZSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfc3lzdGVtX21vZGUgPSB7IC5uYW1lID0gInN5c3RlbV9tb2RlIiwgLmRlc2NyID0gIlN5c3RlbSBtb2RlIC0gdGhpcyBtdXN0IGJlIHNldCBieSB0aGUgaG9zdCB3aGVuIGluaXRpYWxseSBwcm92aXNpb25pbmcgdGhlIHN5c3RlbS4gIFNldHRpbmcgdGhpcyBhbHNvIHNldHMgdGhlIFwibm5pX3NwZWVkXCIgcHJvcGVydHksIHVubGVzcyBpdCBpcyBvdmVycmlkZGVuLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgc3lzdGVtX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fbW9kZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfa2VlcGFsaXZlX2ludGVydmFsID0geyAubmFtZSA9ICJrZWVwYWxpdmVfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiS2VlcGFsaXZlIEludGVydmFsIGluIFNlY29uZHMgICgwID0gRGlzYWJsZSkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBrZWVwYWxpdmVfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19rZWVwYWxpdmVfdG9sZXJhbmNlID0geyAubmFtZSA9ICJrZWVwYWxpdmVfdG9sZXJhbmNlIiwgLmRlc2NyID0gIkhvdyBtYW55IGtlZXBhbGl2ZSBtZXNzYWdlcyBjYW4gYmUgbG9zdCBiZWZvcmUgdHJpZ2dlcmluZyBhIGRpc2Nvbm5lY3Qgc2VxdWVuY2UgIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGtlZXBhbGl2ZV90b2xlcmFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19maXJtd2FyZV9zd192ZXJzaW9uID0geyAubmFtZSA9ICJmaXJtd2FyZV9zd192ZXJzaW9uIiwgLmRlc2NyID0gIkZpcm13YXJlIFNXIFZlcnNpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBmaXJtd2FyZV9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfaG9zdF9zd192ZXJzaW9uID0geyAubmFtZSA9ICJob3N0X3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiSG9zdCBTVyBWZXJzaW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBob3N0X3N3X3ZlcnNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X3N3X3ZlcnNpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2NoaXBfcmV2aXNpb24gPSB7IC5uYW1lID0gImNoaXBfcmV2aXNpb24iLCAuZGVzY3IgPSAiUmV2aXNpb24gb2YgdGhlIEJDTTY4NjIwIGRldmljZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfUkVWSVNJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3JldmlzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3N0YXRlID0geyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJEZXZpY2Ugc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2RlYnVnID0geyAubmFtZSA9ICJkZWJ1ZyIsIC5kZXNjciA9ICJEZXZpY2UgY29uZmlndXJhdGlvbiBkZWJ1ZyBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX25uaV9zcGVlZCA9IHsgLm5hbWUgPSAibm5pX3NwZWVkIiwgLmRlc2NyID0gIlNwZWVkIG9mIHRoZSBOTkkgaW50ZXJmYWNlLiAgVGhpcyBpcyBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgXCJzeXN0ZW1fbW9kZVwiIHByb3BlcnR5IGlzIHNldCwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBob3N0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIG5uaV9zcGVlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiLCAuZGVzY3IgPSAiVGhlIHNlbGVjdGVkIGV4dGVybmFsIElSUSBmb3IgcHJvdGVjdGlvbiBzd2l0Y2hpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V4dF9pcnEgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSA9IHsgLm5hbWUgPSAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5IiwgLmRlc2NyID0gIlRoZSB0aW1lIChpbiBUUSkgdGhhdCBpdCB0YWtlcyBmcm9tIHdoZW4gYSBwdWxzZSBpcyBnZW5lcmF0ZWQgYXQgdGhlIGV4dGVybmFsIHNvdXJjZSB0byB3aGVuIHdlIHNhbXBsZSBpdC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9TQU1QTEVfREVMQVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19pbmRpY2F0aW9uX3NoYXBpbmcgPSB7IC5uYW1lID0gImluZGljYXRpb25fc2hhcGluZyIsIC5kZXNjciA9ICJTaGFwaW5nIC8gcmF0ZSBsaW1pdGluZyBmb3IgdGhlIGluZGljYXRpb24gY2hhbm5lbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBpbmRpY2F0aW9uX3NoYXBpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2NoaXBfdGVtcGVyYXR1cmUgPSB7IC5uYW1lID0gImNoaXBfdGVtcGVyYXR1cmUiLCAuZGVzY3IgPSAiQ3VycmVudCBkaWUgdGVtcGVyYXR1cmUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgY2hpcF90ZW1wZXJhdHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX2VuYWJsZSA9IHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIiwgLmRlc2NyID0gIkdQT04vWEdQT04gVG9EIGNvbnRyb2wgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBncG9uX3hncG9uX3RvZF9lbmFibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiA9IHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4iLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBUb0QgR0lPIHBpbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkgPSB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5IiwgLmRlc2NyID0gIkdQT04vWEdQT04gaXMgVG9EIGludGVybmFsbHkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCA9IHsgLm5hbWUgPSAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiLCAuZGVzY3IgPSAiRVBPTiA4MDIuMUFTIFRvRCBGb3JtYXQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1NiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl9zaGFwZXJfbW9kZSA9IHsgLm5hbWUgPSAiZXBvbl9zaGFwZXJfbW9kZSIsIC5kZXNjciA9ICJDb250cm9scyBFUE9OIHNoYXBlciBiZWhhdmlvci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl9zaGFwZXJfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NoYXBlcl9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19lbWJlZGRlZF9pbWFnZV9saXN0ID0geyAubmFtZSA9ICJlbWJlZGRlZF9pbWFnZV9saXN0IiwgLmRlc2NyID0gIkxpc3Qgb2YgYWxsIGZpbGUgaW1hZ2VzIHN0b3JlZCBpbiB0aGUgT0xULiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVtYmVkZGVkX2ltYWdlX2xpc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19jaGlwX3ZvbHRhZ2UgPSB7IC5uYW1lID0gImNoaXBfdm9sdGFnZSIsIC5kZXNjciA9ICJDaGlwIHZvbHRhZ2UgaW4gbVYiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVk9MVEFHRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGNoaXBfdm9sdGFnZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fdG9kX3N0cmluZyA9IHsgLm5hbWUgPSAiZXBvbl90b2Rfc3RyaW5nIiwgLmRlc2NyID0gIkVQT04gVG9EIFN0cmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fdG9kX3N0cmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yNTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3hncG9uX251bV9vZl9vbnVzID0geyAubmFtZSA9ICJ4Z3Bvbl9udW1fb2Zfb251cyIsIC5kZXNjciA9ICJ4Z3BvbiBudW0gb2Ygb251cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgeGdwb25fbnVtX29mX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGV2aWNlX2lwX2FkZHJlc3MgPSB7IC5uYW1lID0gImRldmljZV9pcF9hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBJUCBBZGRyZXNzIG9mIHRoZSBkZXZpY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGRldmljZV9pcF9hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19pcHY0X2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2RldmljZV91ZHBfcG9ydCA9IHsgLm5hbWUgPSAiZGV2aWNlX3VkcF9wb3J0IiwgLmRlc2NyID0gIlRoZSBVRFAgcG9ydCBvZiB0aGUgRGV2aWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZGV2aWNlX3VkcF9wb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfdG9kX3VhcnRfYmF1ZHJhdGUgPSB7IC5uYW1lID0gInRvZF91YXJ0X2JhdWRyYXRlIiwgLmRlc2NyID0gIlVBUlQgYmF1ZCByYXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCB0b2RfdWFydF9iYXVkcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VhcnRfYmF1ZHJhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggPSB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBUb0Qgc3RyaW5nIGxlbmd0aCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfc3lzdGVtX21vZGUsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfa2VlcGFsaXZlX2ludGVydmFsLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2tlZXBhbGl2ZV90b2xlcmFuY2UsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZmlybXdhcmVfc3dfdmVyc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19ob3N0X3N3X3ZlcnNpb24sICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfY2hpcF9yZXZpc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19zdGF0ZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19kZWJ1ZywgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19ubmlfc3BlZWQsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXksICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfaW5kaWNhdGlvbl9zaGFwaW5nLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2NoaXBfdGVtcGVyYXR1cmUsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX2dwaW9fcGluLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5LCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fODAyMV9hc190b2RfZm9ybWF0LCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fc2hhcGVyX21vZGUsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZW1iZWRkZWRfaW1hZ2VfbGlzdCwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19jaGlwX3ZvbHRhZ2UsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl90b2Rfc3RyaW5nLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3hncG9uX251bV9vZl9vbnVzLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2RldmljZV9pcF9hZGRyZXNzLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2RldmljZV91ZHBfcG9ydCwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ190b2RfdWFydF9iYXVkcmF0ZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3lzdGVtX21vZGUiLCAuZGVzY3IgPSAiU3lzdGVtIG1vZGUgLSB0aGlzIG11c3QgYmUgc2V0IGJ5IHRoZSBob3N0IHdoZW4gaW5pdGlhbGx5IHByb3Zpc2lvbmluZyB0aGUgc3lzdGVtLiAgU2V0dGluZyB0aGlzIGFsc28gc2V0cyB0aGUgXCJubmlfc3BlZWRcIiBwcm9wZXJ0eSwgdW5sZXNzIGl0IGlzIG92ZXJyaWRkZW4uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIHN5c3RlbV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX21vZGUgfSwgeyAubmFtZSA9ICJrZWVwYWxpdmVfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiS2VlcGFsaXZlIEludGVydmFsIGluIFNlY29uZHMgICgwID0gRGlzYWJsZSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwga2VlcGFsaXZlX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZV90b2xlcmFuY2UiLCAuZGVzY3IgPSAiSG93IG1hbnkga2VlcGFsaXZlIG1lc3NhZ2VzIGNhbiBiZSBsb3N0IGJlZm9yZSB0cmlnZ2VyaW5nIGEgZGlzY29ubmVjdCBzZXF1ZW5jZSAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwga2VlcGFsaXZlX3RvbGVyYW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJmaXJtd2FyZV9zd192ZXJzaW9uIiwgLmRlc2NyID0gIkZpcm13YXJlIFNXIFZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZmlybXdhcmVfc3dfdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gfSwgeyAubmFtZSA9ICJob3N0X3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiSG9zdCBTVyBWZXJzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGhvc3Rfc3dfdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiB9LCB7IC5uYW1lID0gImNoaXBfcmV2aXNpb24iLCAuZGVzY3IgPSAiUmV2aXNpb24gb2YgdGhlIEJDTTY4NjIwIGRldmljZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgY2hpcF9yZXZpc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIH0sIHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiRGV2aWNlIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N0YXRlIH0sIHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiRGV2aWNlIGNvbmZpZ3VyYXRpb24gZGVidWcgcGFyYW1ldGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgfSwgeyAubmFtZSA9ICJubmlfc3BlZWQiLCAuZGVzY3IgPSAiU3BlZWQgb2YgdGhlIE5OSSBpbnRlcmZhY2UuICBUaGlzIGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBcInN5c3RlbV9tb2RlXCIgcHJvcGVydHkgaXMgc2V0LCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGhvc3QuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIG5uaV9zcGVlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxIiwgLmRlc2NyID0gIlRoZSBzZWxlY3RlZCBleHRlcm5hbCBJUlEgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRfaXJxIH0sIHsgLm5hbWUgPSAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5IiwgLmRlc2NyID0gIlRoZSB0aW1lIChpbiBUUSkgdGhhdCBpdCB0YWtlcyBmcm9tIHdoZW4gYSBwdWxzZSBpcyBnZW5lcmF0ZWQgYXQgdGhlIGV4dGVybmFsIHNvdXJjZSB0byB3aGVuIHdlIHNhbXBsZSBpdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImluZGljYXRpb25fc2hhcGluZyIsIC5kZXNjciA9ICJTaGFwaW5nIC8gcmF0ZSBsaW1pdGluZyBmb3IgdGhlIGluZGljYXRpb24gY2hhbm5lbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgaW5kaWNhdGlvbl9zaGFwaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIH0sIHsgLm5hbWUgPSAiY2hpcF90ZW1wZXJhdHVyZSIsIC5kZXNjciA9ICJDdXJyZW50IGRpZSB0ZW1wZXJhdHVyZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgY2hpcF90ZW1wZXJhdHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9lbmFibGUiLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBUb0QgY29udHJvbCBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBncG9uX3hncG9uX3RvZF9lbmFibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4iLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBUb0QgR0lPIHBpbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH0sIHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBpcyBUb0QgaW50ZXJuYWxseSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVwb25fODAyMV9hc190b2RfZm9ybWF0IiwgLmRlc2NyID0gIkVQT04gODAyLjFBUyBUb0QgRm9ybWF0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1NiB9LCB7IC5uYW1lID0gImVwb25fc2hhcGVyX21vZGUiLCAuZGVzY3IgPSAiQ29udHJvbHMgRVBPTiBzaGFwZXIgYmVoYXZpb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fc2hhcGVyX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zaGFwZXJfbW9kZSB9LCB7IC5uYW1lID0gImVtYmVkZGVkX2ltYWdlX2xpc3QiLCAuZGVzY3IgPSAiTGlzdCBvZiBhbGwgZmlsZSBpbWFnZXMgc3RvcmVkIGluIHRoZSBPTFQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVtYmVkZGVkX2ltYWdlX2xpc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IH0sIHsgLm5hbWUgPSAiY2hpcF92b2x0YWdlIiwgLmRlc2NyID0gIkNoaXAgdm9sdGFnZSBpbiBtViIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3ZvbHRhZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZXBvbl90b2Rfc3RyaW5nIiwgLmRlc2NyID0gIkVQT04gVG9EIFN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBlcG9uX3RvZF9zdHJpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2IH0sIHsgLm5hbWUgPSAieGdwb25fbnVtX29mX29udXMiLCAuZGVzY3IgPSAieGdwb24gbnVtIG9mIG9udXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgeGdwb25fbnVtX29mX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB9LCB7IC5uYW1lID0gImRldmljZV9pcF9hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBJUCBBZGRyZXNzIG9mIHRoZSBkZXZpY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZGV2aWNlX2lwX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2lwdjRfYWRkcmVzcyB9LCB7IC5uYW1lID0gImRldmljZV91ZHBfcG9ydCIsIC5kZXNjciA9ICJUaGUgVURQIHBvcnQgb2YgdGhlIERldmljZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBkZXZpY2VfdWRwX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAidG9kX3VhcnRfYmF1ZHJhdGUiLCAuZGVzY3IgPSAiVUFSVCBiYXVkIHJhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgdG9kX3VhcnRfYmF1ZHJhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91YXJ0X2JhdWRyYXRlIH0sIHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBzdHJpbmcgbGVuZ3RoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9rZXlfcmVzZXJ2ZWQgPSB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfS0VZX0lEX1JFU0VSVkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2Vfa2V5X3Jlc2VydmVkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gY29ubmVjdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9jb25uZWN0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIGRpc2Nvbm5lY3QgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfZGlzY29ubmVjdF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSByZXNldCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9yZXNldF9tb2RlID0geyAubmFtZSA9ICJtb2RlIiwgLmRlc2NyID0gIk9wdGlvbnMgdG8gY29udHJvbCB3aGF0IHNob3VsZCBiZSByZXNldC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9yZXNldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9yZXNldF9tb2RlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtb2RlIiwgLmRlc2NyID0gIk9wdGlvbnMgdG8gY29udHJvbCB3aGF0IHNob3VsZCBiZSByZXNldC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9yZXNldF9kYXRhLCBtb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9yZXNldF9kYXRhIiwgLmRlc2NyID0gIlJlc2V0cyB0aGUgaG9zdC9kZXZpY2UuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9yZXNldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGhvc3Rfa2VlcF9hbGl2ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9ob3N0X2tlZXBfYWxpdmVfc2VxdWVuY2VfbnVtYmVyID0geyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAuZGVzY3IgPSAic2VxdWVuY2UgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfU0VRVUVOQ0VfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSwgc2VxdWVuY2VfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9ob3N0X2tlZXBfYWxpdmVfdGltZV9zdGFtcCA9IHsgLm5hbWUgPSAidGltZV9zdGFtcCIsIC5kZXNjciA9ICJ0aW1lIHN0YW1wIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEsIHRpbWVfc3RhbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9ob3N0X2tlZXBfYWxpdmVfc2VxdWVuY2VfbnVtYmVyLCAmcHJvcF9kZXNjcl9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX3RpbWVfc3RhbXAgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAuZGVzY3IgPSAic2VxdWVuY2UgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEsIHNlcXVlbmNlX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0aW1lX3N0YW1wIiwgLmRlc2NyID0gInRpbWUgc3RhbXAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSwgdGltZV9zdGFtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEiLCAuZGVzY3IgPSAiS2VlcCBhbGl2ZSBtZXNzYWdlIGZyb20gdGhlIGhvc3QgdG8gdGhlIGRldmljZSAtIHVzZWQgYnkgdGhlIGRldmljZSBjb250cm9sIGxpYnJhcnkgKHNob3VsZCBub3QgYmUgc2VudCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbikuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIHN3X3VwZ3JhZGVfYWN0aXZhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBkZXZpY2VfcmVhZHkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X2Zpcm13YXJlX3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiU29mdHdhcmUgVmVyc2lvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBmaXJtd2FyZV9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfc3lzdGVtX21vZGUgPSB7IC5uYW1lID0gInN5c3RlbV9tb2RlIiwgLmRlc2NyID0gIlN5c3RlbSBNb2RlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBzeXN0ZW1fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9ubmlfc3BlZWQgPSB7IC5uYW1lID0gIm5uaV9zcGVlZCIsIC5kZXNjciA9ICJOTkkgU3BlZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9OTklfU1BFRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBubmlfc3BlZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9jaGlwX3JldmlzaW9uID0geyAubmFtZSA9ICJjaGlwX3JldmlzaW9uIiwgLmRlc2NyID0gIkNoaXAgUmV2aXNpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9DSElQX1JFVklTSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgY2hpcF9yZXZpc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV90b2RfZW5hYmxlID0geyAubmFtZSA9ICJ0b2RfZW5hYmxlIiwgLmRlc2NyID0gIlRvRCBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHRvZF9lbmFibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV90b2RfZ3Bpb19waW4gPSB7IC5uYW1lID0gInRvZF9ncGlvX3BpbiIsIC5kZXNjciA9ICJHUElPIHBpbiBpcyB1c2VkIHdoZW4gVG9EIFVBUlQgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZW1iZWRkZWQsIGFuZCBUT0QgdmFsdWUgaXMgb2J0YWluZWQgYnkgdGhlIGhvc3QiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfR1BJT19QSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCB0b2RfZ3Bpb19waW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9kZXZpY2VfcmVhZHlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X2Zpcm13YXJlX3N3X3ZlcnNpb24sICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfc3lzdGVtX21vZGUsICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfbm5pX3NwZWVkLCAmcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X2NoaXBfcmV2aXNpb24sICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfdG9kX2VuYWJsZSwgJnByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV90b2RfZ3Bpb19waW4gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmaXJtd2FyZV9zd192ZXJzaW9uIiwgLmRlc2NyID0gIlNvZnR3YXJlIFZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgZmlybXdhcmVfc3dfdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gfSwgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZSIsIC5kZXNjciA9ICJTeXN0ZW0gTW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBzeXN0ZW1fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9tb2RlIH0sIHsgLm5hbWUgPSAibm5pX3NwZWVkIiwgLmRlc2NyID0gIk5OSSBTcGVlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBubmlfc3BlZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIH0sIHsgLm5hbWUgPSAiY2hpcF9yZXZpc2lvbiIsIC5kZXNjciA9ICJDaGlwIFJldmlzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIGNoaXBfcmV2aXNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiB9LCB7IC5uYW1lID0gInRvZF9lbmFibGUiLCAuZGVzY3IgPSAiVG9EIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgdG9kX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJ0b2RfZ3Bpb19waW4iLCAuZGVzY3IgPSAiR1BJTyBwaW4gaXMgdXNlZCB3aGVuIFRvRCBVQVJUIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGVtYmVkZGVkLCBhbmQgVE9EIHZhbHVlIGlzIG9idGFpbmVkIGJ5IHRoZSBob3N0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHRvZF9ncGlvX3BpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhIiwgLmRlc2NyID0gIkRldmljZSByZWFkeSBpbmRpY2F0aW9uIHVzZWQgYnkgdGhlIGRldmljZSBjb250cm9sIGxpYnJhcnkgKG5vdCBzZW50IHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uKS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gY29ubmVjdGlvbl9lc3RhYmxpc2hlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIGRldmljZV9rZWVwX2FsaXZlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX3NlcXVlbmNlX251bWJlciA9IHsgLm5hbWUgPSAic2VxdWVuY2VfbnVtYmVyIiwgLmRlc2NyID0gInNlcXVlbmNlIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfU0VRVUVOQ0VfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhLCBzZXF1ZW5jZV9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX3RpbWVfc3RhbXAgPSB7IC5uYW1lID0gInRpbWVfc3RhbXAiLCAuZGVzY3IgPSAidGltZSBzdGFtcCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSwgdGltZV9zdGFtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfc2VxdWVuY2VfbnVtYmVyLCAmcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfdGltZV9zdGFtcCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic2VxdWVuY2VfbnVtYmVyIiwgLmRlc2NyID0gInNlcXVlbmNlIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEsIHNlcXVlbmNlX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0aW1lX3N0YW1wIiwgLmRlc2NyID0gInRpbWUgc3RhbXAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhLCB0aW1lX3N0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEiLCAuZGVzY3IgPSAiS2VlcCBhbGl2ZSBtZXNzYWdlIGZyb20gdGhlIGRldmljZSB0byB0aGUgaG9zdCAtIHVzZWQgYnkgdGhlIGRldmljZSBjb250cm9sIGxpYnJhcnkgKG5vdCBzZW50IHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uKS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gY29ubmVjdGlvbl9mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9yZWFzb24gPSB7IC5uYW1lID0gInJlYXNvbiIsIC5kZXNjciA9ICJDb25uZWN0aW9uIGZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSwgcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIkNvbm5lY3Rpb24gZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSwgcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhIiwgLmRlc2NyID0gIlRoZSBob3N0IGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBkZXZpY2UuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGNvbm5lY3Rpb25fY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9zdGFuZGFsb25lID0geyAubmFtZSA9ICJzdGFuZGFsb25lIiwgLmRlc2NyID0gIklmIHRydWUsIHRoZSBkZXZpY2Ugd2FzIHByZXZpb3VzbHkgcnVubmluZyBpbiBzdGFuZGFsb25lIG1vZGUgYmVmb3JlIHRoaXMgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQuICBJZiBmYWxzZSwgdGhlIGRldmljZSB3YXMgYm9vdGVkIGZyb20gcmVzZXQgd2l0aCBuZXcgZmlybXdhcmUsIGV0Yy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fQ09NUExFVEVfSURfU1RBTkRBTE9ORSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhLCBzdGFuZGFsb25lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9zdGFuZGFsb25lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YW5kYWxvbmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgdGhlIGRldmljZSB3YXMgcHJldmlvdXNseSBydW5uaW5nIGluIHN0YW5kYWxvbmUgbW9kZSBiZWZvcmUgdGhpcyBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZC4gIElmIGZhbHNlLCB0aGUgZGV2aWNlIHdhcyBib290ZWQgZnJvbSByZXNldCB3aXRoIG5ldyBmaXJtd2FyZSwgZXRjLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSwgc3RhbmRhbG9uZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIlRoZSBob3N0IHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gdGhlIGRldmljZS4gIFRoZSBkZXZpY2UgaGFzIGVpdGhlciBiZWVuIHJlcHJvZ3JhbW1lZCB3aXRoIG5ldyBmaXJtd2FyZSwgb3IgYSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCB3aXRoIGFuIGV4aXN0aW5nIGRldmljZSAoc2VlIHRoZSBcInN0YW5kYWxvbmVcIiBmaWVsZCkuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBzd19lcnJvciAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl90YXNrX25hbWUgPSB7IC5uYW1lID0gInRhc2tfbmFtZSIsIC5kZXNjciA9ICJ0YXNrIG5hbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1RBU0tfTkFNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgdGFza19uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl9maWxlX25hbWUgPSB7IC5uYW1lID0gImZpbGVfbmFtZSIsIC5kZXNjciA9ICJmaWxlIG5hbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0ZJTEVfTkFNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgZmlsZV9uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl9saW5lX251bWJlciA9IHsgLm5hbWUgPSAibGluZV9udW1iZXIiLCAuZGVzY3IgPSAibGluZSBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCBsaW5lX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXJyb3JfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEsIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9zd19lcnJvcl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl90YXNrX25hbWUsICZwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl9maWxlX25hbWUsICZwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl9saW5lX251bWJlciwgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidGFza19uYW1lIiwgLmRlc2NyID0gInRhc2sgbmFtZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEsIHRhc2tfbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgfSwgeyAubmFtZSA9ICJmaWxlX25hbWUiLCAuZGVzY3IgPSAiZmlsZSBuYW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgZmlsZV9uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9LCB7IC5uYW1lID0gImxpbmVfbnVtYmVyIiwgLmRlc2NyID0gImxpbmUgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgbGluZV9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gInBvbl9uaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEsIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEiLCAuZGVzY3IgPSAic3cgZXJyb3IiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gc3dfZXhjZXB0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3N3X2V4Y2VwdGlvbl9jcHVfaWQgPSB7IC5uYW1lID0gImNwdV9pZCIsIC5kZXNjciA9ICJDUFUgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhLCBjcHVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXhjZXB0aW9uX3RleHQgPSB7IC5uYW1lID0gInRleHQiLCAuZGVzY3IgPSAidGV4dCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX1RFWFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhLCB0ZXh0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2Vfc3dfZXhjZXB0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2V4Y2VwdGlvbl9jcHVfaWQsICZwcm9wX2Rlc2NyX2RldmljZV9zd19leGNlcHRpb25fdGV4dCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNwdV9pZCIsIC5kZXNjciA9ICJDUFUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSwgY3B1X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidGV4dCIsIC5kZXNjciA9ICJ0ZXh0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEsIHRleHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjAwMCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSIsIC5kZXNjciA9ICJzdyBleGNlcHRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gaW5kaWNhdGlvbnNfZHJvcHBlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX3RvdGFsX2NvdW50ID0geyAubmFtZSA9ICJ0b3RhbF9jb3VudCIsIC5kZXNjciA9ICJUb3RhbCBudW1iZXIgb2YgaW5kaWNhdGlvbnMgZHJvcHBlZCBzaW5jZSB0aGUgc3lzdGVtIHdhcyBzdGFydGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9UT1RBTF9DT1VOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhLCB0b3RhbF9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX3RvdGFsX2NvdW50IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInRvdGFsX2NvdW50IiwgLmRlc2NyID0gIlRvdGFsIG51bWJlciBvZiBpbmRpY2F0aW9ucyBkcm9wcGVkIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIHN0YXJ0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhLCB0b3RhbF9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gaW5kaWNhdGlvbnMgYXJlIGRyb3BwZWQgZHVlIHRvIGNvbmdlc3Rpb24gLyBzaGFwaW5nLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBpbWFnZV90cmFuc2Zlcl9zdGFydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pbWFnZV90eXBlID0geyAubmFtZSA9ICJpbWFnZV90eXBlIiwgLmRlc2NyID0gIkZpbGUgdHlwZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEsIGltYWdlX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pbWFnZV9zaXplID0geyAubmFtZSA9ICJpbWFnZV9zaXplIiwgLmRlc2NyID0gIlNpemUgb2YgdGhlIGZpbGUgaW1hZ2UuICBJZ25vcmVkIGZvciBSUlEgb3BlcmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSwgaW1hZ2Vfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfY3JjMzIgPSB7IC5uYW1lID0gImNyYzMyIiwgLmRlc2NyID0gIkNSQzMyIGNoZWNrc3VtIG9mIHRoZSBlbnRpcmUgZmlsZSBpbWFnZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBjcmMzMiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2ltYWdlX25hbWUgPSB7IC5uYW1lID0gImltYWdlX25hbWUiLCAuZGVzY3IgPSAiTmFtZSBvZiB0aGUgZmlsZSBpbWFnZS4gIE51bGwtdGVybWluYXRlZCBzdHJpbmcuICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgRFBvRSBPTlUgb25seS4gIERQb0UgcmVxdWlyZXMgdGhlIHdyaXRlIHJlcXVlc3QgT0FNIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfTkFNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSwgaW1hZ2VfbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pbWFnZV90eXBlLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaW1hZ2Vfc2l6ZSwgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2NyYzMyLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaW1hZ2VfbmFtZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW1hZ2VfdHlwZSIsIC5kZXNjciA9ICJGaWxlIHR5cGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSwgaW1hZ2VfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIH0sIHsgLm5hbWUgPSAiaW1hZ2Vfc2l6ZSIsIC5kZXNjciA9ICJTaXplIG9mIHRoZSBmaWxlIGltYWdlLiAgSWdub3JlZCBmb3IgUlJRIG9wZXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNyYzMyIiwgLmRlc2NyID0gIkNSQzMyIGNoZWNrc3VtIG9mIHRoZSBlbnRpcmUgZmlsZSBpbWFnZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBjcmMzMiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiaW1hZ2VfbmFtZSIsIC5kZXNjciA9ICJOYW1lIG9mIHRoZSBmaWxlIGltYWdlLiAgTnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBEUG9FIE9OVSBvbmx5LiAgRFBvRSByZXF1aXJlcyB0aGUgd3JpdGUgcmVxdWVzdCBPQU0gY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSwgaW1hZ2VfbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEiLCAuZGVzY3IgPSAiVGhpcyBBUEkgbWVzc2FnZSBpbmZvcm1zIHRoZSBPTFQgb2YgdGhlIHN0YXJ0IG9mIGltYWdlIHRyYW5zZmVyLCBhbmQgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBmaWxlIGltYWdlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBpbWFnZV90cmFuc2Zlcl9kYXRhICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfYmxvY2tfbnVtYmVyID0geyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAuZGVzY3IgPSAiQmxvY2sgbnVtYmVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9CTE9DS19OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSwgYmxvY2tfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX21vcmVfZGF0YSA9IHsgLm5hbWUgPSAibW9yZV9kYXRhIiwgLmRlc2NyID0gIlNwZWNpZmllcyB0aGF0IHRoZXJlIGFyZSBtb3JlIGRhdGEgdG8gY29tZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfTU9SRV9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEsIG1vcmVfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEgPSB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAiRGF0YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhLCBkYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MTZfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9ibG9ja19udW1iZXIsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX21vcmVfZGF0YSwgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAuZGVzY3IgPSAiQmxvY2sgbnVtYmVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSwgYmxvY2tfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1vcmVfZGF0YSIsIC5kZXNjciA9ICJTcGVjaWZpZXMgdGhhdCB0aGVyZSBhcmUgbW9yZSBkYXRhIHRvIGNvbWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhLCBtb3JlX2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkYXRhIiwgLmRlc2NyID0gIkRhdGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhLCBkYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MTZfaGV4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEiLCAuZGVzY3IgPSAidXNlZCBmb3IgdHJhbnNmZXJyaW5nIHRoZSBhY3R1YWwgZGF0YSBmcm9tL3RvIHRoZSBPTFQuICAgbm90IHRvIGJlIGRpcmVjdGx5IGNhbGxlZCBieSB0aGUgdXNlci4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaW1hZ2VfdHlwZSA9IHsgLm5hbWUgPSAiaW1hZ2VfdHlwZSIsIC5kZXNjciA9ICJJbWFnZSB0eXBlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfSU1BR0VfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSwgaW1hZ2VfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2Jsb2NrX251bWJlciA9IHsgLm5hbWUgPSAiYmxvY2tfbnVtYmVyIiwgLmRlc2NyID0gIkJsb2NrIG51bWJlci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0JMT0NLX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSwgYmxvY2tfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJJbWFnZSB0cmFuc2ZlciBzdGF0dXMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pbWFnZV90eXBlLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfYmxvY2tfbnVtYmVyLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbWFnZV90eXBlIiwgLmRlc2NyID0gIkltYWdlIHR5cGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSwgaW1hZ2VfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIH0sIHsgLm5hbWUgPSAiYmxvY2tfbnVtYmVyIiwgLmRlc2NyID0gIkJsb2NrIG51bWJlci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBibG9ja19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIkltYWdlIHRyYW5zZmVyIHN0YXR1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIkltYWdlIFRyYW5zZmVyIENvbXBsZXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIHJ1bl9kZHJfdGVzdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9ydW5fZGRyX3Rlc3RfY3B1ID0geyAubmFtZSA9ICJjcHUiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCB0aGUgQ1BVIEREUiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEsIGNwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9ydW5fZGRyX3Rlc3RfcmFzXzAgPSB7IC5uYW1lID0gInJhc18wIiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRvIHRlc3QgUkFTIDAgRERSIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzAsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhLCByYXNfMCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9ydW5fZGRyX3Rlc3RfcmFzXzEgPSB7IC5uYW1lID0gInJhc18xIiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRvIHRlc3QgUkFTIDEgRERSIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhLCByYXNfMSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9ydW5fZGRyX3Rlc3RfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2VfcnVuX2Rkcl90ZXN0X2NwdSwgJnByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9yYXNfMCwgJnByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9yYXNfMSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNwdSIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0byB0ZXN0IHRoZSBDUFUgRERSIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEsIGNwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJhc18wIiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRvIHRlc3QgUkFTIDAgRERSIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEsIHJhc18wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFzXzEiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCBSQVMgMSBERFIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSwgcmFzXzEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEiLCAuZGVzY3IgPSAiUnVuIGEgdGVzdCBvbiBvbmUgb3IgbW9yZSBvZiB0aGUgRERSIGNvbXBvbmVudHMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGRkcl90ZXN0X2NvbXBsZXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2Rkcl90ZXN0ID0geyAubmFtZSA9ICJkZHJfdGVzdCIsIC5kZXNjciA9ICJSZXN1bHRzIG9mIHRoZSBERFIgVGVzdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEVfSURfRERSX1RFU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEsIGRkcl90ZXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2Rkcl90ZXN0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkZHJfdGVzdCIsIC5kZXNjciA9ICJSZXN1bHRzIG9mIHRoZSBERFIgVGVzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEsIGRkcl90ZXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSIsIC5kZXNjciA9ICJUaGUgRERSIFRlc3QgaGFzIGNvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19jb25uZWN0aW9uX2NvbXBsZXRlID0geyAubmFtZSA9ICJjb25uZWN0aW9uX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25uZWN0aW9uX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0NPTVBMRVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBjb25uZWN0aW9uX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWQgPSB7IC5uYW1lID0gImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbm5lY3Rpb25fZXN0YWJsaXNoZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfY29ubmVjdGlvbl9mYWlsdXJlID0geyAubmFtZSA9ICJjb25uZWN0aW9uX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbm5lY3Rpb25fZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBjb25uZWN0aW9uX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfZGRyX3Rlc3RfY29tcGxldGUgPSB7IC5uYW1lID0gImRkcl90ZXN0X2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZHJfdGVzdF9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRERSX1RFU1RfQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRkcl90ZXN0X2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2RldmljZV9rZWVwX2FsaXZlID0geyAubmFtZSA9ICJkZXZpY2Vfa2VlcF9hbGl2ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGV2aWNlX2tlZXBfYWxpdmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBkZXZpY2Vfa2VlcF9hbGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kZXZpY2VfcmVhZHkgPSB7IC5uYW1lID0gImRldmljZV9yZWFkeSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGV2aWNlX3JlYWR5XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfUkVBRFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRldmljZV9yZWFkeSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kaXNjb25uZWN0aW9uX2NvbXBsZXRlID0geyAubmFtZSA9ICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkaXNjb25uZWN0aW9uX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlID0geyAubmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19pbmRpY2F0aW9uc19kcm9wcGVkID0geyAubmFtZSA9ICJpbmRpY2F0aW9uc19kcm9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJpbmRpY2F0aW9uc19kcm9wcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBpbmRpY2F0aW9uc19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX3N3X2Vycm9yID0geyAubmFtZSA9ICJzd19lcnJvciIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3dfZXJyb3JcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBzd19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19zd19leGNlcHRpb24gPSB7IC5uYW1lID0gInN3X2V4Y2VwdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3dfZXhjZXB0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIHN3X2V4Y2VwdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19jb25uZWN0aW9uX2NvbXBsZXRlLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfY29ubmVjdGlvbl9lc3RhYmxpc2hlZCwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Nvbm5lY3Rpb25fZmFpbHVyZSwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Rkcl90ZXN0X2NvbXBsZXRlLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfZGV2aWNlX2tlZXBfYWxpdmUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kZXZpY2VfcmVhZHksICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kaXNjb25uZWN0aW9uX2NvbXBsZXRlLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19pbmRpY2F0aW9uc19kcm9wcGVkLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfc3dfZXJyb3IsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19zd19leGNlcHRpb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbm5lY3Rpb25fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbm5lY3Rpb25fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBjb25uZWN0aW9uX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiY29ubmVjdGlvbl9lc3RhYmxpc2hlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9lc3RhYmxpc2hlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjb25uZWN0aW9uX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbm5lY3Rpb25fZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRkcl90ZXN0X2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZHJfdGVzdF9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRkcl90ZXN0X2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGV2aWNlX2tlZXBfYWxpdmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRldmljZV9rZWVwX2FsaXZlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGV2aWNlX2tlZXBfYWxpdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZXZpY2VfcmVhZHkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRldmljZV9yZWFkeVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRldmljZV9yZWFkeSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRpc2Nvbm5lY3Rpb25fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRpc2Nvbm5lY3Rpb25fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJpbmRpY2F0aW9uc19kcm9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJpbmRpY2F0aW9uc19kcm9wcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgaW5kaWNhdGlvbnNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN3X2Vycm9yIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzd19lcnJvclwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIHN3X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3dfZXhjZXB0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzd19leGNlcHRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBzd19leGNlcHRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX2RlbmllZF9saW5rID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2tleV9tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2tleV9lcG9uX25pLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2tleV9tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBFUE9OIE5JIGNvbnRhaW5pbmcgdGhlIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2NmZ19hbGFybV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIHVua25vd25fbGlua192aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIHdoaWxlIHRoZSBQT04gd2FzIHNldCB0byBcIm5vdGlmeSB1bmtub3duXCIgcmVnaXN0cmF0aW9uIGJlaGF2aW9yIGFuZCB0aGlzIGxpbmsgd2FzIG5vdCBwcmUtcHJvdmlzaW9uZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiVGhpcyBpcyB3aGVuIGxpbmsgdHJpZXMgdG8gcmVnaXN0ZXIgYW5kIHRoZXJlIGFyZSBhbHJlYWR5IHRvbyBtYW55IGV4aXN0aW5nIGxhc2VyIG9uL29mZiBjb21iaW5hdGlvbnMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSBsYXNlcl9vbl9vZmZfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIlRoaXMgaXMgd2hlbiBhIGxpbmsgdHJpZXMgdG8gcmVpZ3N0ZXIgd2l0aCBhbiBpbXBvc3NpYmxlIGxhc2VyIG9uIG9yIG9mZiB0aW1lLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gbWF4X2xpbmtfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTUFYX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIGl0IHdvdWxkIGhhdmUgcHV0IHVzIG92ZXIgdGhlIHByb3Zpc2lvbmVkIG1heCBsaW5rcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgRVBPTiBOSS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgdGhlcmUgYXJlIG5vIExMSURzIGF2YWlsYWJsZS4gSWYgdGhpcyBvY2N1cnMsIGl0IGlzIHBvc3NpYmxlIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggeW91ciAnbWF4IGxpbmtzJyBhbmQvb3IgJ0Jhc2UgTExJRCcgZmllbGRzIG9uIHlvdXIgUlAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIHdlIHdlcmUgdW5hYmxlIHRvIGFsbG9jYXRlIHN5c3RlbSByZXNvdXJjZXMgZm9yIGl0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gcmFuZ2VfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5nZV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5nZV9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgd2l0aCBhIHJhbmdlIHZhbHVlIHRoYXQgd2FzIG91dHNpZGUgb2YgdGhlIG1pbi9tYXggZmliZXIgbGVuZ3RoLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEiLCAuZGVzY3IgPSAiVERNIENoYW5uZWxzIEV4aGF1c3RlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gcm9ndWVfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJBIFJvZ3VlIE9OVSB3YXMgZGV0ZWN0ZWQgb24gdGhpcyBsaW5rL0xMSUQuICIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiVGhpcyBsaW5rIGZhaWxlZCB0byByZWdpc3RlciBiZWNhdXNlIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgdXBzdHJlYW0gYmFuZHdpZHRoIGF2YWlsYWJsZSB0byBwcm92aWRlIHRoZSBkZWZhdWx0IFVCRC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uID0geyAubmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIGxhc2VyX29uX29mZl92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gPSB7IC5uYW1lID0gImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfbWF4X2xpbmtfdmlvbGF0aW9uID0geyAubmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1heF9saW5rX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIG1heF9saW5rX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24gPSB7IC5uYW1lID0gIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3JhbmdlX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAicmFuZ2VfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyYW5nZV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9SQU5HRV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCByYW5nZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3JvZ3VlX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9ST0dVRV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCByb2d1ZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24gPSB7IC5uYW1lID0gInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCA9IHsgLm5hbWUgPSAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGRtX2NoYW5uZWxzX2V4aGF1c3RlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ191bmtub3duX2xpbmtfdmlvbGF0aW9uID0geyAubmFtZSA9ICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ1bmtub3duX2xpbmtfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHVua25vd25fbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gPSB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2xhc2VyX29uX29mZl92aW9sYXRpb24sICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19tYXhfbGlua192aW9sYXRpb24sICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcmFuZ2VfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3JvZ3VlX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3RkbV9jaGFubmVsc19leGhhdXN0ZWQsICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGFzZXJfb25fb2ZmX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBsYXNlcl9vbl9vZmZfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibWF4X2xpbmtfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtYXhfbGlua192aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgbWF4X2xpbmtfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIG92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyYW5nZV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgcmFuZ2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgcm9ndWVfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGRtX2NoYW5uZWxzX2V4aGF1c3RlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidW5rbm93bl9saW5rX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidW5rbm93bl9saW5rX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCB1bmtub3duX2xpbmtfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX2xpbmsgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9saW5rIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXksIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2Vwb25fbmksICZwcm9wX2Rlc2NyX2Vwb25fbGlua19rZXlfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBFUE9OIE5JIGNvbnRhaW5pbmcgdGhlIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXksIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xpbmtfcmF0ZSA9IHsgLm5hbWUgPSAibGlua19yYXRlIiwgLmRlc2NyID0gIlRoaXMgbGluaydzIGRvd25zdHJlYW0gYW5kIHVwc3RyZWFtIHJhdGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsaW5rX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfc3RhdGVfZmxhZ3MgPSB7IC5uYW1lID0gInN0YXRlX2ZsYWdzIiwgLmRlc2NyID0gIkVQT04gbGluayBzdGF0ZSBmbGFncyByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgbGluay4gICBSZWdpc3RlcmVkIHN0YXRlIGZsYWcgaXMgY29udHJvbGVkIGJ5IHRoZSBzdGF0aWMgcmVnaXN0cmF0aW9uIG9wZXJhdGlvbiBmb3IgbGlua3Mgb24gYSBwcm90ZWN0ZWQtc3RhbmRieSBQT04uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIHN0YXRlX2ZsYWdzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19sbGlkID0geyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIkxMSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xhc2VyX29uX3RpbWVfdHEgPSB7IC5uYW1lID0gImxhc2VyX29uX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb24gdGltZSBpbiB0aW1lIHF1YW50YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsYXNlcl9vbl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGFzZXJfb2ZmX3RpbWVfdHEgPSB7IC5uYW1lID0gImxhc2VyX29mZl90aW1lX3RxIiwgLmRlc2NyID0gIkxhc2VyLW9mZiB0aW1lIGluIHRpbWUgcXVhbnRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsYXNlcl9vZmZfdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3JhbmdlX3ZhbHVlX3RxID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJSYW5nZSB2YWx1ZSB1c2VkIGZvciB0aGlzIGxpbmsgLSBpbiB0aW1lIHF1YW50YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1JBTkdFX1ZBTFVFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19kaXN0YW5jZSA9IHsgLm5hbWUgPSAiZGlzdGFuY2UiLCAuZGVzY3IgPSAiRGlzdGFuY2UgdG8gdGhlIE9OVSAoRGlmZmVycyBmcm9tIHJhbmdlIHZhbHVlIGluIHRoYXQgdGhpcyBpZ25vcmVzIGludGVybmFsIGRlbGF5cykiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0RJU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIG9mIHRoZSBhbGFybXMgb24gdGhpcyBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfdHVubmVsX2lkID0geyAubmFtZSA9ICJ0dW5uZWxfaWQiLCAuZGVzY3IgPSAiVHVubmVsIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfVFVOTkVMX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgdHVubmVsX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFUE9OIGxpbmsuICBBIHZhbHVlIG9mIDB4RkYgaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmsgaGFzIG5vdCBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhbiBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19taW5fbGFzZXJfb3ZlcmhlYWQgPSB7IC5uYW1lID0gIm1pbl9sYXNlcl9vdmVyaGVhZCIsIC5kZXNjciA9ICJNaW4gTGFzZXIgT3ZlcmhlYWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBtaW5fbGFzZXJfb3ZlcmhlYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2tleV9leGNoYW5nZV9jb25maWcgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jb25maWciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19lcG9uX2VuY3J5cHRpb24gPSB7IC5uYW1lID0gImVwb25fZW5jcnlwdGlvbiIsIC5kZXNjciA9ICJFUE9OIEVuY3J5cHRpb24gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRVBPTl9FTkNSWVBUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZXBvbl9lbmNyeXB0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfZmVjX2VuYWJsZSA9IHsgLm5hbWUgPSAiZmVjX2VuYWJsZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGZlY19lbmFibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19vYW1faGVhcnRiZWF0X2NvbmZpZyA9IHsgLm5hbWUgPSAib2FtX2hlYXJ0YmVhdF9jb25maWciLCAuZGVzY3IgPSAiT0FNIGhlYXJ0YmVhdCBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBvYW1faGVhcnRiZWF0X2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ191cHN0cmVhbV9iYW5kd2lkdGggPSB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aCIsIC5kZXNjciA9ICJVcHN0cmVhbSBCYW5kd2lkdGgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB1cHN0cmVhbV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ191YmRfaW5mbyA9IHsgLm5hbWUgPSAidWJkX2luZm8iLCAuZGVzY3IgPSAiUmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBVQkQuIFVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgd2hhdCB2YWx1ZSB0aGUgZmlybXdhcmUgY2hvc2UgZm9yIGEgZmllbGQgc2V0IHRvICdhdXRvbWF0aWMnLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfVUJEX0lORk8sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB1YmRfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19jbG9ja190cmFuc3BvcnRfZW5hYmxlID0geyAubmFtZSA9ICJjbG9ja190cmFuc3BvcnRfZW5hYmxlIiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRvIGVuYWJsZSBjbG9jayB0cmFuc3BvcnQgb24gdGhpcyBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19wZW5kaW5nX2dyYW50cyA9IHsgLm5hbWUgPSAicGVuZGluZ19ncmFudHMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBwZW5kaW5nIGdyYW50cy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgcGVuZGluZ19ncmFudHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xpbmtfdHlwZSA9IHsgLm5hbWUgPSAibGlua190eXBlIiwgLmRlc2NyID0gIkxpbmsgVHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgbGlua190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19saW5rX3JhdGUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfc3RhdGVfZmxhZ3MsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGxpZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19sYXNlcl9vbl90aW1lX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xhc2VyX29mZl90aW1lX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3JhbmdlX3ZhbHVlX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Rpc3RhbmNlLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2FsYXJtX3N0YXRlLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3R1bm5lbF9pZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19vbnVfaWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbWluX2xhc2VyX292ZXJoZWFkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2tleV9leGNoYW5nZV9jb25maWcsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfZXBvbl9lbmNyeXB0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2ZlY19lbmFibGUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfb2FtX2hlYXJ0YmVhdF9jb25maWcsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfdXBzdHJlYW1fYmFuZHdpZHRoLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3ViZF9pbmZvLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Nsb2NrX3RyYW5zcG9ydF9lbmFibGUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfcGVuZGluZ19ncmFudHMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGlua190eXBlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlua19yYXRlIiwgLmRlc2NyID0gIlRoaXMgbGluaydzIGRvd25zdHJlYW0gYW5kIHVwc3RyZWFtIHJhdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH0sIHsgLm5hbWUgPSAic3RhdGVfZmxhZ3MiLCAuZGVzY3IgPSAiRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAgIFJlZ2lzdGVyZWQgc3RhdGUgZmxhZyBpcyBjb250cm9sZWQgYnkgdGhlIHN0YXRpYyByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGZvciBsaW5rcyBvbiBhIHByb3RlY3RlZC1zdGFuZGJ5IFBPTi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgc3RhdGVfZmxhZ3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgfSwgeyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIkxMSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH0sIHsgLm5hbWUgPSAibGFzZXJfb25fdGltZV90cSIsIC5kZXNjciA9ICJMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsYXNlcl9vbl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxhc2VyX29mZl90aW1lX3RxIiwgLmRlc2NyID0gIkxhc2VyLW9mZiB0aW1lIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsYXNlcl9vZmZfdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJSYW5nZSB2YWx1ZSB1c2VkIGZvciB0aGlzIGxpbmsgLSBpbiB0aW1lIHF1YW50YS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZGlzdGFuY2UiLCAuZGVzY3IgPSAiRGlzdGFuY2UgdG8gdGhlIE9OVSAoRGlmZmVycyBmcm9tIHJhbmdlIHZhbHVlIGluIHRoYXQgdGhpcyBpZ25vcmVzIGludGVybmFsIGRlbGF5cykiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIG9mIHRoZSBhbGFybXMgb24gdGhpcyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSB9LCB7IC5uYW1lID0gInR1bm5lbF9pZCIsIC5kZXNjciA9ICJUdW5uZWwgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgdHVubmVsX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVQT04gbGluay4gIEEgdmFsdWUgb2YgMHhGRiBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBoYXMgbm90IGJlZW4gYXNzb2NpYXRlZCB3aXRoIGFuIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWluX2xhc2VyX292ZXJoZWFkIiwgLmRlc2NyID0gIk1pbiBMYXNlciBPdmVyaGVhZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBtaW5fbGFzZXJfb3ZlcmhlYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29uZmlnIiwgLmRlc2NyID0gIkVuY3J5cHRpb24ga2V5IGV4Y2hhbmdlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB9LCB7IC5uYW1lID0gImVwb25fZW5jcnlwdGlvbiIsIC5kZXNjciA9ICJFUE9OIEVuY3J5cHRpb24gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGVwb25fZW5jcnlwdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgfSwgeyAubmFtZSA9ICJmZWNfZW5hYmxlIiwgLmRlc2NyID0gIkZFQyBlbmFibGUgc3RhdGUgZm9yIHRoaXMgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZmVjX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gfSwgeyAubmFtZSA9ICJvYW1faGVhcnRiZWF0X2NvbmZpZyIsIC5kZXNjciA9ICJPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgb2FtX2hlYXJ0YmVhdF9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aCIsIC5kZXNjciA9ICJVcHN0cmVhbSBCYW5kd2lkdGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgdXBzdHJlYW1fYmFuZHdpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB9LCB7IC5uYW1lID0gInViZF9pbmZvIiwgLmRlc2NyID0gIlJldHVybnMgdGhlIGFjdHVhbCB2YWx1ZXMgZnJvbSB0aGUgVUJELiBVc2VmdWwgaWYgeW91IHdhbnQgdG8gc2VlIHdoYXQgdmFsdWUgdGhlIGZpcm13YXJlIGNob3NlIGZvciBhIGZpZWxkIHNldCB0byAnYXV0b21hdGljJy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgdWJkX2luZm8pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91YmRfaW5mbyB9LCB7IC5uYW1lID0gImNsb2NrX3RyYW5zcG9ydF9lbmFibGUiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gZW5hYmxlIGNsb2NrIHRyYW5zcG9ydCBvbiB0aGlzIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwZW5kaW5nX2dyYW50cyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBwZW5kaW5nX2dyYW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxpbmtfdHlwZSIsIC5kZXNjciA9ICJMaW5rIFR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgbGlua190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3R5cGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJyeF9kYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9kYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2RhdGFfZnJhbWVzID0geyAubmFtZSA9ICJyeF9kYXRhX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9kYXRhX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAicnhfb2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X29hbV9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X29hbV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X29hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbXBjcF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X21wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X21wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X3VuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X211bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfcmVwb3J0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfcmVwb3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfcmVwb3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mY3NfZXJyb3IgPSB7IC5uYW1lID0gInJ4X2Zjc19lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZDU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mY3NfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfb3ZlcnNpemVfZXJyb3IgPSB7IC5uYW1lID0gInJ4X292ZXJzaXplX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09WRVJTSVpFX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X292ZXJzaXplX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X3J1bnRfZXJyb3IgPSB7IC5uYW1lID0gInJ4X3J1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X3J1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbGluZV9jb2RlX2Vycm9yID0geyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBsaW5lIGNvZGUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9saW5lX2NvZGVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbGluZV9jb2RlX2Vycm9yX21heCA9IHsgLm5hbWUgPSAicnhfbGluZV9jb2RlX2Vycm9yX21heCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgbWF4IHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUl9NQVgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbGluZV9jb2RlX2Vycm9yX21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJ0eF9kYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9kYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2RhdGFfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9kYXRhX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9kYXRhX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gInR4X2ZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAidHhfb2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X29hbV9mcmFtZXMgPSB7IC5uYW1lID0gInR4X29hbV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X29hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfbXBjcF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X21wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X21wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X3VuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X211bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZ2F0ZXMgPSB7IC5uYW1lID0gInR4X2dhdGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZ2F0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2dhdGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZGF0YV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc182NCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzY1XzEyNywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18yNTZfNTExLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfNTEyXzEwMjMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18xNTE5XzIwNDcsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18yMDQ4XzQwOTUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc185MjE3XzE2MzgzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9vYW1fYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X29hbV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X21wY3BfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF91bmljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfcmVwb3J0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZmNzX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9vdmVyc2l6ZV9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfcnVudF9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbGluZV9jb2RlX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9saW5lX2NvZGVfZXJyb3JfbWF4LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9kYXRhX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X29hbV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfbXBjcF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9nYXRlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF9kYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2RhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZGF0YV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2RhdGFfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29hbV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9tcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9icm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3VuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF91bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9tdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X211bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcmVwb3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9yZXBvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2Zjc19lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mY3NfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X292ZXJzaXplX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3J1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfcnVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBsaW5lIGNvZGUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9saW5lX2NvZGVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfbGluZV9jb2RlX2Vycm9yX21heCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgbWF4IHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2RhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9kYXRhX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZGF0YV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9vYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9vYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfb2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9vYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X21wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9tcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9icm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9nYXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGdhdGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZ2F0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBmb3JjZV9yZWRpc2NvdmVyeSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBkZWxldGVfbGluayAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19kZWxldGVfbGlua19wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBrZXlfZXhjaGFuZ2VfZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEiLCAuZGVzY3IgPSAiVGhlIE9MVCBmYWlsZWQgdG8gcmVjZWl2ZSBhbiB1cGRhdGVkIGVuY3J5cHRpb24ga2V5IHdpdGhpbiB0aGUgZXhwZWN0ZWQgdGltZSBwZXJpb2QgYWZ0ZXIgZW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgaGFzIGJlZW4gaW5pdGlhdGVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBlbmNyeXB0aW9uX2VuYWJsZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG1wY3BfcmVnX2Fja190aW1lb3V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHJhbmdlX3ZhbHVlX2NoYW5nZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9yYW5nZV92YWx1ZV90cSA9IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiTmV3IHJhbmdlIHZhbHVlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX3JhbmdlX3ZhbHVlX3RxIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIk5ldyByYW5nZSB2YWx1ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gc2VudCB3aGVuIGEgcmFuZ2UgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfcHJvdGVjdGlvbl9zdGF0dXMgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3RhdHVzIiwgLmRlc2NyID0gIlRoZSBsaW5rJ3MgcG9zdC1zd2l0Y2ggcm9sZSAod29ya2luZyBvciBzdGFuZGJ5KS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhLCBwcm90ZWN0aW9uX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9yYW5nZV92YWx1ZV90cSA9IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiQ3VycmVudCByYW5nZSB2YWx1ZSBpbiB0aW1lIHF1YW50YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1JBTkdFX1ZBTFVFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfcHJvdGVjdGlvbl9zdGF0dXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9yYW5nZV92YWx1ZV90cSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zdGF0dXMiLCAuZGVzY3IgPSAiVGhlIGxpbmsncyBwb3N0LXN3aXRjaCByb2xlICh3b3JraW5nIG9yIHN0YW5kYnkpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEsIHByb3RlY3Rpb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiQ3VycmVudCByYW5nZSB2YWx1ZSBpbiB0aW1lIHF1YW50YS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIiwgLmRlc2NyID0gIlRoZSBsaW5rIGhhcyB1bmRlcmdvbmUgYSBwcm90ZWN0aW9uIHN3aXRjaCBldmVudC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaW5pdGlhbF9yYW5nZV90cSA9IHsgLm5hbWUgPSAiaW5pdGlhbF9yYW5nZV90cSIsIC5kZXNjciA9ICJSYW5nZSBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIGZpcnN0IGZyYW1lIHJlY2VpdmVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfSU5JVElBTF9SQU5HRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSwgaW5pdGlhbF9yYW5nZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfY3VycmVudF9yYW5nZV90cSA9IHsgLm5hbWUgPSAiY3VycmVudF9yYW5nZV90cSIsIC5kZXNjciA9ICJSYW5nZSBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIGN1cnJlbnQgZnJhbWUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9DVVJSRU5UX1JBTkdFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhLCBjdXJyZW50X3JhbmdlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pbml0aWFsX3JhbmdlX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfY3VycmVudF9yYW5nZV90cSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW5pdGlhbF9yYW5nZV90cSIsIC5kZXNjciA9ICJSYW5nZSBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIGZpcnN0IGZyYW1lIHJlY2VpdmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEsIGluaXRpYWxfcmFuZ2VfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY3VycmVudF9yYW5nZV90cSIsIC5kZXNjciA9ICJSYW5nZSBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIGN1cnJlbnQgZnJhbWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSwgY3VycmVudF9yYW5nZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhIiwgLmRlc2NyID0gIkEgcmVnaXN0ZXIgcmVxdWVzdGVkIHdhcyByZWNlaXZlZCBmb3IgYSBsaW5rIHdpdGggdGhlIHNhbWUgTUFDIGFkZHJlc3MgYXMgYSBsaW5rIHRoYXQgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbGlua19zcGVlZF9taXNtYXRjaCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX3ByZXZpb3VzX3JhdGUgPSB7IC5uYW1lID0gInByZXZpb3VzX3JhdGUiLCAuZGVzY3IgPSAiUE9OIHJhdGUgbGluayBpbml0aWFsbHkgcmVnaXN0ZXJlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEsIHByZXZpb3VzX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2N1cnJlbnRfcmF0ZSA9IHsgLm5hbWUgPSAiY3VycmVudF9yYXRlIiwgLmRlc2NyID0gIlBPTiByYXRlIGxpbmsgaXMgY3VycmVudGx5IGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYXQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEsIGN1cnJlbnRfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9wcmV2aW91c19yYXRlLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9jdXJyZW50X3JhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJldmlvdXNfcmF0ZSIsIC5kZXNjciA9ICJQT04gcmF0ZSBsaW5rIGluaXRpYWxseSByZWdpc3RlcmVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhLCBwcmV2aW91c19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSwgeyAubmFtZSA9ICJjdXJyZW50X3JhdGUiLCAuZGVzY3IgPSAiUE9OIHJhdGUgbGluayBpcyBjdXJyZW50bHkgYXR0ZW1wdGluZyB0byByZWdpc3RlciBhdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSwgY3VycmVudF9yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSIsIC5kZXNjciA9ICJIb3N0IHdpbGwgcmVjZWl2ZSB0aGlzIGluZGljYXRpb24gaWYgYSBsaW5rIHJlZ2lzdGVycyB0aGVuIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIGxhdGVyIGF0IGEgZGlmZmVyZW50IHNwZWVkLCBvciBpZiB0aGUgbGluayByZWdpc3RlcnMgYXQgYSBkaWZmZXJlbnQgc3BlZWQgdGhhbiB0aGUgc3BlZWQgd2l0aCB3aGljaCBpdCB3YXMgcHJlLXByb3Zpc2lvbmVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBtcGNwX3JlcG9ydF90aW1lb3V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSIsIC5kZXNjciA9ICJUaGUgcHJvdmlzaW9uZWQgbGltaXQgYmV0d2VlbiByZXBvcnRzIGZvciB0aGUgc3BlY2lmaWVkIGxpbmsgaGFzIGJlZW4gZXhjZWVkZWQuICBUaGlzIGxpbmsgd2lsbCBiZSBkZS1yZWdpc3RlcmVkLCBhbmQgdGhlIGFsYXJtX3N0YXR1cyBzZXQgd2hlbiB0aGlzIG9jY3Vycy4gIFRoZSBhbGFybV9zdGF0dXMgd2lsbCBiZSBjbGVhcmVkIHdoZW4gdGhlIGxpbmsgYXR0ZW1wdHMgdG8gcmVnaXN0ZXIgYWdhaW4uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG9hbV9rZWVwYWxpdmVfdGltZW91dCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEiLCAuZGVzY3IgPSAiVGhlIHByb3Zpc2lvbmVkIHRpbWUgbGltaXQgYmV0d2VlbiByZWNlaXZpbmcgdXBzdHJlYW0gaW5mbyBmcmFtZXMgaGFzIGJlZW4gZXhjZWVkZWQuICBOb3JtYWxseSBhbiBPTlUgd2lsbCByZXNldCBpdHMgT0FNIHN0YXRlIG1hY2hpbmUgd2hlbiB0aGlzIG9jY3VycnMgYW5kIHRoZSBob3N0IG11c3QgcmUtbmVnb3RpYXRlIE9BTSBhbmQgcmVwcm92aXNpb24gdGhlIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG1wY3BfZGlzY292ZXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfbGlua19pbmZvID0geyAubmFtZSA9ICJsaW5rX2luZm8iLCAuZGVzY3IgPSAiSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb3ZlcmVkIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSwgbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX2luZm8iLCAuZGVzY3IgPSAiSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb3ZlcmVkIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEsIGxpbmtfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhIiwgLmRlc2NyID0gIkEgbGluayBoYXMgY29tcGxldGVkIE1QQ1AgbGluayByZWdpc3RyYXRpb24uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG1wY3BfZGVyZWdpc3RlcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfbGlua19pbmZvID0geyAubmFtZSA9ICJsaW5rX2luZm8iLCAuZGVzY3IgPSAiSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEsIGxpbmtfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfbGlua19pbmZvIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlua19pbmZvIiwgLmRlc2NyID0gIkluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSwgbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEiLCAuZGVzY3IgPSAiUmFpc2VkIGFmdGVyIGFuICdhZGRfbGluaycgb3BlcmF0aW9uIG9uIGFuIEVQT04gTkkgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfc2VuZF9wZXJpb2QgPSB7IC5uYW1lID0gInNlbmRfcGVyaW9kIiwgLmRlc2NyID0gIlRoZSBwZXJpb2QgYXQgd2hpY2ggdG8gc2VuZCBPQU0gaW5mbyBmcmFtZXMgKGluIHNlY29uZHMpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhLCBzZW5kX3BlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X3NlbmRfcGVyaW9kIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlbmRfcGVyaW9kIiwgLmRlc2NyID0gIlRoZSBwZXJpb2QgYXQgd2hpY2ggdG8gc2VuZCBPQU0gaW5mbyBmcmFtZXMgKGluIHNlY29uZHMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSwgc2VuZF9wZXJpb2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEiLCAuZGVzY3IgPSAiU3RhcnQgdGhlIE9BTSBrZWVwYWxpdmUgdGltZXIgYWdhaW5zdCB0aGlzIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0ga2V5X2V4Y2hhbmdlX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9wZXJpb2QgPSB7IC5uYW1lID0gInBlcmlvZCIsIC5kZXNjciA9ICJLZXkgZXhjaGFuZ2UgcGVyaW9kIGluIHNlY29uZHMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9ELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSwgcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X3BlcmlvZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBlcmlvZCIsIC5kZXNjciA9ICJLZXkgZXhjaGFuZ2UgcGVyaW9kIGluIHNlY29uZHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEsIHBlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEiLCAuZGVzY3IgPSAiQXBwbHkgdGhlIGNvcnJlc3BvbmRpbmcgcHJvdmlzaW9uaW5nIGZvciAnZXBvbl9saW5rLmtleV9leGNoYW5nZV9jb25maWcnIGFnYWluc3QgdGhpcyBsaW5rIGFuZCB0aGVuIHN0YXJ0IGtleSBleGNoYW5nZSB0aW1lciB3aXRoIHRoZSBnaXZlbiBwZXJpb2QuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGtleV9leGNoYW5nZV9zdG9wICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBrZXlfZXhjaGFuZ2Vfc3RhcnRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBrZXlfZXhjaGFuZ2Vfc3RvcHBlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBzdGF0aWNfcmVnaXN0cmF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fbGFzZXJvbl90aW1lX3RxID0geyAubmFtZSA9ICJsYXNlcm9uX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb24gdGltZSBpbiB0aW1lIHF1YW50YS5cXCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9OX1RJTUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgbGFzZXJvbl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2xhc2Vyb2ZmX3RpbWVfdHEgPSB7IC5uYW1lID0gImxhc2Vyb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb2ZmIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST0ZGX1RJTUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgbGFzZXJvZmZfdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9yYW5nZV92YWx1ZV90cSA9IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiUmFuZ2UgdmFsdWUgdXNlZCBmb3IgdGhpcyBsaW5rIC0gaW4gdGltZSBxdWFudGEuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1JBTkdFX1ZBTFVFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3BlbmRpbmdfZ3JhbnRzID0geyAubmFtZSA9ICJwZW5kaW5nX2dyYW50cyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9QRU5ESU5HX0dSQU5UUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBwZW5kaW5nX2dyYW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fbGFzZXJvbl90aW1lX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9sYXNlcm9mZl90aW1lX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9yYW5nZV92YWx1ZV90cSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fcGVuZGluZ19ncmFudHMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGFzZXJvbl90aW1lX3RxIiwgLmRlc2NyID0gIkxhc2VyLW9uIHRpbWUgaW4gdGltZSBxdWFudGEuXFwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEsIGxhc2Vyb25fdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJsYXNlcm9mZl90aW1lX3RxIiwgLmRlc2NyID0gIkxhc2VyLW9mZiB0aW1lIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgbGFzZXJvZmZfdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJSYW5nZSB2YWx1ZSB1c2VkIGZvciB0aGlzIGxpbmsgLSBpbiB0aW1lIHF1YW50YS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcGVuZGluZyBncmFudHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBwZW5kaW5nX2dyYW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhIiwgLmRlc2NyID0gIlN0YXRpY2FsbHkgcmVnaXN0ZXJzIHRoZSBsb2dpY2FsIGxpbmsiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSByZXJhbmdlX2ZhaWx1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGluamVjdF9mcmFtZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19pbmplY3RfZnJhbWVfZnJhbWUgPSB7IC5uYW1lID0gImZyYW1lIiwgLmRlc2NyID0gIkNvbXBsZXRlIGNvbnRlbnRzIG9mIHRoZSBmcmFtZSBiZWdpbm5pbmcgd2l0aCB0aGUgREEgdXAgdGhyb3VnaCBidXQgbm90IGluY2x1ZGluZyB0aGUgQ1JDLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSwgZnJhbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19pbmplY3RfZnJhbWVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2ZyYW1lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZnJhbWUiLCAuZGVzY3IgPSAiQ29tcGxldGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGJlZ2lubmluZyB3aXRoIHRoZSBEQSB1cCB0aHJvdWdoIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBDUkMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEsIGZyYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEiLCAuZGVzY3IgPSAiU2VuZCBhbiBhcmJpdHJhcnkgZnJhbWUgYWNyb3NzIHRoZSBzcGVjaWZpZWQgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gZnJhbWVfY2FwdHVyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZnJhbWUgPSB7IC5uYW1lID0gImZyYW1lIiwgLmRlc2NyID0gIkNvbnRlbnRzIG9mIHRoZSBmcmFtZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhLCBmcmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2ZyYW1lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmcmFtZSIsIC5kZXNjciA9ICJDb250ZW50cyBvZiB0aGUgZnJhbWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSwgZnJhbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEiLCAuZGVzY3IgPSAiQSBmcmFtZSBtYXRjaGluZyBob3N0LXNwZWNpZmllZCBjcml0ZXJpYSB3YXMgcmVjZWl2ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGxpbmtfZGVsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19saW5rX2RlbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0ID0geyAubmFtZSA9ICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19lbmNyeXB0aW9uX2VuYWJsZWQgPSB7IC5uYW1lID0gImVuY3J5cHRpb25fZW5hYmxlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZW5jcnlwdGlvbl9lbmFibGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGVuY3J5cHRpb25fZW5hYmxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdGFydGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfc3RhcnRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9zdGFydGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2tleV9leGNoYW5nZV9zdG9wcGVkID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX3N0b3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19saW5rX2RlbGV0ZWQgPSB7IC5uYW1lID0gImxpbmtfZGVsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGlua19kZWxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX0RFTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGxpbmtfZGVsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19saW5rX3NwZWVkX21pc21hdGNoID0geyAubmFtZSA9ICJsaW5rX3NwZWVkX21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsaW5rX3NwZWVkX21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBsaW5rX3NwZWVkX21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfZGVyZWdpc3RlcmVkID0geyAubmFtZSA9ICJtcGNwX2RlcmVnaXN0ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9kZXJlZ2lzdGVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX2RlcmVnaXN0ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX2Rpc2NvdmVyZWQgPSB7IC5uYW1lID0gIm1wY3BfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9kaXNjb3ZlcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG1wY3BfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX3JlZ19hY2tfdGltZW91dCA9IHsgLm5hbWUgPSAibXBjcF9yZWdfYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1wY3BfcmVnX2Fja190aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbXBjcF9yZWdfYWNrX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfbXBjcF9yZXBvcnRfdGltZW91dCA9IHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9yZXBvcnRfdGltZW91dFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbXBjcF9yZXBvcnRfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19vYW1fa2VlcGFsaXZlX3RpbWVvdXQgPSB7IC5uYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib2FtX2tlZXBhbGl2ZV90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG9hbV9rZWVwYWxpdmVfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQgPSB7IC5uYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQgPSB7IC5uYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQgPSB7IC5uYW1lID0gInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfcmFuZ2VfdmFsdWVfY2hhbmdlZCA9IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfY2hhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmFuZ2VfdmFsdWVfY2hhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcmFuZ2VfdmFsdWVfY2hhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19yZXJhbmdlX2ZhaWx1cmUgPSB7IC5uYW1lID0gInJlcmFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVyYW5nZV9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHJlcmFuZ2VfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lID0geyAubmFtZSA9ICJzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19lbmNyeXB0aW9uX2VuYWJsZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfZmFpbHVyZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2tleV9leGNoYW5nZV9zdGFydGVkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3N0b3BwZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19saW5rX2RlbGV0ZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19saW5rX3NwZWVkX21pc21hdGNoLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfbXBjcF9kZXJlZ2lzdGVyZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX2Rpc2NvdmVyZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX3JlZ19hY2tfdGltZW91dCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfcmVwb3J0X3RpbWVvdXQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19vYW1fa2VlcGFsaXZlX3RpbWVvdXQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3JhbmdlX3ZhbHVlX2NoYW5nZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19yZXJhbmdlX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJlbmNyeXB0aW9uX2VuYWJsZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImVuY3J5cHRpb25fZW5hYmxlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGVuY3J5cHRpb25fZW5hYmxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9zdGFydGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX3N0b3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxpbmtfZGVsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGlua19kZWxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbGlua19kZWxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGlua19zcGVlZF9taXNtYXRjaCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGlua19zcGVlZF9taXNtYXRjaFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGxpbmtfc3BlZWRfbWlzbWF0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtcGNwX2RlcmVnaXN0ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9kZXJlZ2lzdGVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX2RlcmVnaXN0ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9kaXNjb3ZlcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbXBjcF9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibXBjcF9yZWdfYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1wY3BfcmVnX2Fja190aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbXBjcF9yZWdfYWNrX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtcGNwX3JlcG9ydF90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX3JlcG9ydF90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbXBjcF9yZXBvcnRfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib2FtX2tlZXBhbGl2ZV90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV9jaGFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyYW5nZV92YWx1ZV9jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcmFuZ2VfdmFsdWVfY2hhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJlcmFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVyYW5nZV9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcmVyYW5nZV9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZXBvbl9uaSA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX25pIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9rZXlfZXBvbl9uaSA9IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJUaGUgaW5kZXggb2YgYSBzcGVjaWZpYyBFUE9OIE5JIGluc3RhbmNlIGFzIHNlZW4gYnkgdGhlIGhvc3QuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2tleV9lcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlRoZSBpbmRleCBvZiBhIHNwZWNpZmljIEVQT04gTkkgaW5zdGFuY2UgYXMgc2VlbiBieSB0aGUgaG9zdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIHVzZWQgZm9yIGFsbCBmcmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBPTFQgb24gdGhlIFBPTi4gIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQgYmVmb3JlIEVQT05fTkkgaXMgZmlyc3QgZW5hYmxlZCwgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2Vwb25fbmlfZW4gPSB7IC5uYW1lID0gImVwb25fbmlfZW4iLCAuZGVzY3IgPSAiSW5kaWNhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlcG9uX25pX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX3JlZ2lzdHJhdGlvbl9iZWhhdmlvciA9IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2JlaGF2aW9yIiwgLmRlc2NyID0gIkRldGVybWluZXMgaG93IHJlZ2lzdHJhdGlvbiByZXF1ZXN0cyBmcm9tIHVua25vd24gbGlua3MgYXJlIGhhbmRsZWQuICBTZXQgdG8gJ05vdGlmeSBVbmtub3duJyB0byBmb3JjZSBhbGwgbGlua3MgdG8gYmUgcHJlLXByb3Zpc2lvbmVkLiAgSWYgaW4gJ05vdGlmeSBVbmtub3duJyBtb2RlLCBNUENQIFJlZ2lzdHJhdGlvbiBvZiBhbiB1bmtub3duIGxpbmsgd2lsbCBiZSBkZW5pZWQsIGFuZCBhICdXaGl0ZSBMaXN0IFZpb2xhdGlvblwiIHdpbGwgYmUgc2VudCB0byB0aGUgaG9zdC4gSWYgc2V0IHRvICdBdXRvbWF0aWMnLCB0aGUgbGluayByZWdpc3RlcnMgZnVsbHkgd2l0aG91dCBob3N0IGludGVyYWN0aW9uLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9iZWhhdmlvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX210dV8xZyA9IHsgLm5hbWUgPSAibXR1XzFnIiwgLmRlc2NyID0gIk1heGltdW0gZnJhbWUgc2l6ZSAoaW5jbHVkaW5nIEZDUykgb24gdGhlIDFHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFuIG9kZCB2YWx1ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG10dV8xZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tdHVfMTBnID0geyAubmFtZSA9ICJtdHVfMTBnIiwgLmRlc2NyID0gIk1heGltdW0gZnJhbWUgc2l6ZSAoaW5jbHVkaW5nIEZDUykgb24gdGhlIDEwRyBwYXRoLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBhbiBvZGQgdmFsdWUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbXR1XzEwZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19taW5pbXVtX2ZpYmVyX2xlbmd0aCA9IHsgLm5hbWUgPSAibWluaW11bV9maWJlcl9sZW5ndGgiLCAuZGVzY3IgPSAiVGhlIG1pbmltdW0gZmliZXIgbGVuZ3RoLCBpbiBtZXRlcnMsIGF0IHdoaWNoIHdlIGV4cGVjdCB0byBmaW5kIGFuIE9OVS4gTm90ZXM6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZmliZXIgbGVuZ3RoIGNhbm5vdCBleGNlZWQgMTAwIGttLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFNvbWUgT05VcyBjYW4gcmVnaXN0ZXIgYXQgZGlzdGFuY2VzIHRoYXQgYXJlIGxlc3MgdGhhbiB0aGUgcHJvdmlzaW9uZWQgbWluaW11bS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbWluaW11bV9maWJlcl9sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbWF4aW11bV9maWJlcl9sZW5ndGggPSB7IC5uYW1lID0gIm1heGltdW1fZmliZXJfbGVuZ3RoIiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGZpYmVyIGxlbmd0aCwgaW4gbWV0ZXJzLCBhdCB3aGljaCB3ZSBleHBlY3QgdG8gZmluZCBhbiBPTlUuIE5vdGVzOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGZpYmVyIGxlbmd0aCBjYW5ub3QgZXhjZWVkIDEwMCBrbS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBTb21lIE9OVXMgY2FuIHJlZ2lzdGVyIGF0IGRpc3RhbmNlcyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gdGhlIHByb3Zpc2lvbmVkIG1heGltdW0uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1heGltdW1fZmliZXJfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2dyYW50X3NwYWNpbmdfdHEgPSB7IC5uYW1lID0gImdyYW50X3NwYWNpbmdfdHEiLCAuZGVzY3IgPSAiVGhlIGRlYWQgdGltZSBvbiB0aGUgUE9OIGJldHdlZW4gdXBzdHJlYW0gYnVyc3RzLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9HUkFOVF9TUEFDSU5HX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGdyYW50X3NwYWNpbmdfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyA9IHsgLm5hbWUgPSAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gRVBPTiBsaW5rcyByZWdpc3RyYXRpb24gYW5kIHJlcG9ydGluZy4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMgPSB7IC5uYW1lID0gIm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyIsIC5kZXNjciA9ICJQZXJpb2Qgb2YgTVBDUCBkaXNjb3Zlcnkgd2luZG93cy4gIEluIHRoaXMgdGltZSBwZXJpb2QsIG9uZSBkaXNjb3ZlcnkgZ2F0ZSB3aWxsIGJlIHNlbnQgZm9yIGV2ZXJ5IGVuYWJsZWQgUlAuICBUaGUgZGlzY292ZXJ5IGdhdGVzIHdpbGwgYmUgc3BhY2VkIGVxdWFsbHkgYWNyb3NzIHRoZSB0aW1lIHBlcmlvZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVBDUF9ESVNDT1ZFUllfUEVSSU9EX01TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIG9mIHRoZSBhbGFybXMgb24gdGhpcyBFUE9OIE5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FsbF9saW5rcyA9IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLmRlc2NyID0gIkxpc3Qgb2YgYWxsIGxpbmtzIG9uIHRoZSBFUE9OIE5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhbGxfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZW5jcnlwdGlvbl9jZmcgPSB7IC5uYW1lID0gImVuY3J5cHRpb25fY2ZnIiwgLmRlc2NyID0gIkVuY3J5cHRpb24gY29uZmlndXJhdGlvbiB0aGF0IGFwcGxpZXMgdG8gdGhlIEVQT04gTkkgYXMgYSB3aG9sZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZW5jcnlwdGlvbl9jZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmciLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2Nsb2NrX3RyYW5zcG9ydF9jZmcgPSB7IC5uYW1lID0gImNsb2NrX3RyYW5zcG9ydF9jZmciLCAuZGVzY3IgPSAiQ2xvY2sgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgY2xvY2tfdHJhbnNwb3J0X2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19kcm9wZG93bl93ZWlnaHRzID0geyAubmFtZSA9ICJkcm9wZG93bl93ZWlnaHRzIiwgLmRlc2NyID0gIkRyb3AtZG93biBXZWlnaHRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZHJvcGRvd25fd2VpZ2h0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSA9IHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlIiwgLmRlc2NyID0gIkFwcHJveGltYXRlIFNvbGljaXRlZCBVc2FnZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfYm91bmRzXzggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hcHByb3hpbWF0ZV90ZG1fdXNhZ2UgPSB7IC5uYW1lID0gImFwcHJveGltYXRlX3RkbV91c2FnZSIsIC5kZXNjciA9ICJBcHByb3hpbWF0ZSBURE0gVXNhZ2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX25vX3JlcG9ydHNfc29ha190aW1lID0geyAubmFtZSA9ICJub19yZXBvcnRzX3NvYWtfdGltZSIsIC5kZXNjciA9ICJQZXJpb2Qgb2YgdGltZSBhZnRlciBsYXN0IHJlcG9ydCByZWNlaXZlZCB0byBzZW5kIG5vIHJlcG9ydHMgYWxhcm0gKGluIG1zKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgPSB7IC5uYW1lID0gInBvbl9hZ2dyZWdhdGVfc2hhcGVyIiwgLmRlc2NyID0gIlBPTiBBZ2dyZWdhdGUgU2hhcGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEgPSB7IC5uYW1lID0gImVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSIsIC5kZXNjciA9ICJFc3RpbWF0ZWQgUE9OIExhdGVuY3kgKFRRKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfYm91bmRzXzggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19vbnVfdXBncmFkZV9wYXJhbXMgPSB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJPTlUgdXBncmFkZSBwYXJhbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuID0geyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4iLCAuZGVzY3IgPSAiRW5hYmxlIDEwRyBBdXRvbm9tb3VzIFJvZ3VlIERlY3Rpb24gZHVyaW5nIGRpc2NvdmVyeSB3aW5kb3ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2F1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuID0geyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIsIC5kZXNjciA9ICJFbmFibGUgMUcgQXV0b25vbW91cyBSb2d1ZSBEZWN0aW9uIGR1cmluZyBkaXNjb3Zlcnkgd2luZG93IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzFHX0VOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCA9IHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCIsIC5kZXNjciA9ICJTZXQgdGhyZXNob2xkIGZvciBudW1iZXIgb2YgU3luY1BhdHRlcm5zIHJlY2VpdmVkIHdpdGhvdXQgYSBCdXJzdCBEZWxpbWl0ZXIgdG8gdHJpZ2dlciB0aGUgZmF1bHQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19USFJFU0hPTEQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2Vwb25fbmlfZW4sICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX3JlZ2lzdHJhdGlvbl9iZWhhdmlvciwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbXR1XzFnLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tdHVfMTBnLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19taW5pbXVtX2ZpYmVyX2xlbmd0aCwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbWF4aW11bV9maWJlcl9sZW5ndGgsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2dyYW50X3NwYWNpbmdfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYWxhcm1fc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FsbF9saW5rcywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZW5jcnlwdGlvbl9jZmcsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NmZywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfY2xvY2tfdHJhbnNwb3J0X2NmZywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZHJvcGRvd25fd2VpZ2h0cywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hcHByb3hpbWF0ZV90ZG1fdXNhZ2UsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX25vX3JlcG9ydHNfc29ha190aW1lLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19wb25fYWdncmVnYXRlX3NoYXBlciwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19vbnVfdXBncmFkZV9wYXJhbXMsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2F1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2F1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIHVzZWQgZm9yIGFsbCBmcmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBPTFQgb24gdGhlIFBPTi4gIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQgYmVmb3JlIEVQT05fTkkgaXMgZmlyc3QgZW5hYmxlZCwgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJlcG9uX25pX2VuIiwgLmRlc2NyID0gIkluZGljYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBFUE9OIE5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZXBvbl9uaV9lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiLCAuZGVzY3IgPSAiRGV0ZXJtaW5lcyBob3cgcmVnaXN0cmF0aW9uIHJlcXVlc3RzIGZyb20gdW5rbm93biBsaW5rcyBhcmUgaGFuZGxlZC4gIFNldCB0byAnTm90aWZ5IFVua25vd24nIHRvIGZvcmNlIGFsbCBsaW5rcyB0byBiZSBwcmUtcHJvdmlzaW9uZWQuICBJZiBpbiAnTm90aWZ5IFVua25vd24nIG1vZGUsIE1QQ1AgUmVnaXN0cmF0aW9uIG9mIGFuIHVua25vd24gbGluayB3aWxsIGJlIGRlbmllZCwgYW5kIGEgJ1doaXRlIExpc3QgVmlvbGF0aW9uXCIgd2lsbCBiZSBzZW50IHRvIHRoZSBob3N0LiBJZiBzZXQgdG8gJ0F1dG9tYXRpYycsIHRoZSBsaW5rIHJlZ2lzdGVycyBmdWxseSB3aXRob3V0IGhvc3QgaW50ZXJhY3Rpb24uICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIH0sIHsgLm5hbWUgPSAibXR1XzFnIiwgLmRlc2NyID0gIk1heGltdW0gZnJhbWUgc2l6ZSAoaW5jbHVkaW5nIEZDUykgb24gdGhlIDFHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFuIG9kZCB2YWx1ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG10dV8xZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtdHVfMTBnIiwgLmRlc2NyID0gIk1heGltdW0gZnJhbWUgc2l6ZSAoaW5jbHVkaW5nIEZDUykgb24gdGhlIDEwRyBwYXRoLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBhbiBvZGQgdmFsdWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtdHVfMTBnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1pbmltdW1fZmliZXJfbGVuZ3RoIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIGZpYmVyIGxlbmd0aCwgaW4gbWV0ZXJzLCBhdCB3aGljaCB3ZSBleHBlY3QgdG8gZmluZCBhbiBPTlUuIE5vdGVzOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGZpYmVyIGxlbmd0aCBjYW5ub3QgZXhjZWVkIDEwMCBrbS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBTb21lIE9OVXMgY2FuIHJlZ2lzdGVyIGF0IGRpc3RhbmNlcyB0aGF0IGFyZSBsZXNzIHRoYW4gdGhlIHByb3Zpc2lvbmVkIG1pbmltdW0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtYXhpbXVtX2ZpYmVyX2xlbmd0aCIsIC5kZXNjciA9ICJUaGUgbWF4aW11bSBmaWJlciBsZW5ndGgsIGluIG1ldGVycywgYXQgd2hpY2ggd2UgZXhwZWN0IHRvIGZpbmQgYW4gT05VLiBOb3RlczogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBmaWJlciBsZW5ndGggY2Fubm90IGV4Y2VlZCAxMDAga20uIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gU29tZSBPTlVzIGNhbiByZWdpc3RlciBhdCBkaXN0YW5jZXMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIHRoZSBwcm92aXNpb25lZCBtYXhpbXVtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbWF4aW11bV9maWJlcl9sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZ3JhbnRfc3BhY2luZ190cSIsIC5kZXNjciA9ICJUaGUgZGVhZCB0aW1lIG9uIHRoZSBQT04gYmV0d2VlbiB1cHN0cmVhbSBidXJzdHMuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBncmFudF9zcGFjaW5nX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMiLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIEVQT04gbGlua3MgcmVnaXN0cmF0aW9uIGFuZCByZXBvcnRpbmcuIFRoaXMgdmFsdWUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiLCAuZGVzY3IgPSAiUGVyaW9kIG9mIE1QQ1AgZGlzY292ZXJ5IHdpbmRvd3MuICBJbiB0aGlzIHRpbWUgcGVyaW9kLCBvbmUgZGlzY292ZXJ5IGdhdGUgd2lsbCBiZSBzZW50IGZvciBldmVyeSBlbmFibGVkIFJQLiAgVGhlIGRpc2NvdmVyeSBnYXRlcyB3aWxsIGJlIHNwYWNlZCBlcXVhbGx5IGFjcm9zcyB0aGUgdGltZSBwZXJpb2QuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIG9mIHRoZSBhbGFybXMgb24gdGhpcyBFUE9OIE5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIH0sIHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLmRlc2NyID0gIkxpc3Qgb2YgYWxsIGxpbmtzIG9uIHRoZSBFUE9OIE5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYWxsX2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCB9LCB7IC5uYW1lID0gImVuY3J5cHRpb25fY2ZnIiwgLmRlc2NyID0gIkVuY3J5cHRpb24gY29uZmlndXJhdGlvbiB0aGF0IGFwcGxpZXMgdG8gdGhlIEVQT04gTkkgYXMgYSB3aG9sZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGVuY3J5cHRpb25fY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2NmZyIsIC5kZXNjciA9ICJDbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGNsb2NrX3RyYW5zcG9ydF9jZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAiZHJvcGRvd25fd2VpZ2h0cyIsIC5kZXNjciA9ICJEcm9wLWRvd24gV2VpZ2h0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZHJvcGRvd25fd2VpZ2h0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNyB9LCB7IC5uYW1lID0gImFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSIsIC5kZXNjciA9ICJBcHByb3hpbWF0ZSBTb2xpY2l0ZWQgVXNhZ2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOCB9LCB7IC5uYW1lID0gImFwcHJveGltYXRlX3RkbV91c2FnZSIsIC5kZXNjciA9ICJBcHByb3hpbWF0ZSBURE0gVXNhZ2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGFwcHJveGltYXRlX3RkbV91c2FnZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJub19yZXBvcnRzX3NvYWtfdGltZSIsIC5kZXNjciA9ICJQZXJpb2Qgb2YgdGltZSBhZnRlciBsYXN0IHJlcG9ydCByZWNlaXZlZCB0byBzZW5kIG5vIHJlcG9ydHMgYWxhcm0gKGluIG1zKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG5vX3JlcG9ydHNfc29ha190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBvbl9hZ2dyZWdhdGVfc2hhcGVyIiwgLmRlc2NyID0gIlBPTiBBZ2dyZWdhdGUgU2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBwb25fYWdncmVnYXRlX3NoYXBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyIH0sIHsgLm5hbWUgPSAiZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxIiwgLmRlc2NyID0gIkVzdGltYXRlZCBQT04gTGF0ZW5jeSAoVFEpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfYm91bmRzXzggfSwgeyAubmFtZSA9ICJvbnVfdXBncmFkZV9wYXJhbXMiLCAuZGVzY3IgPSAiT05VIHVwZ3JhZGUgcGFyYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9wYXJhbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB9LCB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIsIC5kZXNjciA9ICJFbmFibGUgMTBHIEF1dG9ub21vdXMgUm9ndWUgRGVjdGlvbiBkdXJpbmcgZGlzY292ZXJ5IHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4iLCAuZGVzY3IgPSAiRW5hYmxlIDFHIEF1dG9ub21vdXMgUm9ndWUgRGVjdGlvbiBkdXJpbmcgZGlzY292ZXJ5IHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIiwgLmRlc2NyID0gIlNldCB0aHJlc2hvbGQgZm9yIG51bWJlciBvZiBTeW5jUGF0dGVybnMgcmVjZWl2ZWQgd2l0aG91dCBhIEJ1cnN0IERlbGltaXRlciB0byB0cmlnZ2VyIHRoZSBmYXVsdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHNldF9lcG9uX25pX2VuX3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0IHRoZSBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGlzc3VlX3Jzc2lfZ3JhbnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZ3JhbnRlZF9saW5rID0geyAubmFtZSA9ICJncmFudGVkX2xpbmsiLCAuZGVzY3IgPSAiTG9naWNhbCBsaW5rIHRvIGdyYW50LCB3aGljaCBzaG91bGQgZWl0aGVyIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgdW5pY2FzdCBsaW5rIG9mIGludGVyZXN0IG9uIHRoZSBQT04gb3IsIDAgZm9yIGlkbGUgcG93ZXIgbWVhc3VyZW1lbnQuIDAgd2lsbCB1c2UgYSBsaW5rIHRoYXQgd2lsbCBub3QgcmVzdWx0IGluIHVwc3RyZWFtIHRyYW5zbWlzc2lvbiBieSBhbnkgZGV2aWNlIG9uIHRoZSBQT04uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTkssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIGdyYW50ZWRfbGluayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfdHJpZ2dlcl93aWR0aCA9IHsgLm5hbWUgPSAidHJpZ2dlcl93aWR0aCIsIC5kZXNjciA9ICJSc3NpIFRyaWdnZXIgV2lkdGggaW4gbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIHRyaWdnZXJfd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3RyaWdnZXJfZGVsYXkgPSB7IC5uYW1lID0gInRyaWdnZXJfZGVsYXkiLCAuZGVzY3IgPSAiUnNzaSBUcmlnZ2VyIERlbGF5IGluIG5zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX0RFTEFZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCB0cmlnZ2VyX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9zYW1wbGVfcGVyaW9kID0geyAubmFtZSA9ICJzYW1wbGVfcGVyaW9kIiwgLmRlc2NyID0gIlJzc2kgU2FtcGUgUGVyaW9kIGluIHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9ELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCBzYW1wbGVfcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9ncmFudGVkX2xpbmssICZwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF90cmlnZ2VyX3dpZHRoLCAmcHJvcF9kZXNjcl9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfdHJpZ2dlcl9kZWxheSwgJnByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3NhbXBsZV9wZXJpb2QgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImdyYW50ZWRfbGluayIsIC5kZXNjciA9ICJMb2dpY2FsIGxpbmsgdG8gZ3JhbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciB1bmljYXN0IGxpbmsgb2YgaW50ZXJlc3Qgb24gdGhlIFBPTiBvciwgMCBmb3IgaWRsZSBwb3dlciBtZWFzdXJlbWVudC4gMCB3aWxsIHVzZSBhIGxpbmsgdGhhdCB3aWxsIG5vdCByZXN1bHQgaW4gdXBzdHJlYW0gdHJhbnNtaXNzaW9uIGJ5IGFueSBkZXZpY2Ugb24gdGhlIFBPTi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCBncmFudGVkX2xpbmspLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAidHJpZ2dlcl93aWR0aCIsIC5kZXNjciA9ICJSc3NpIFRyaWdnZXIgV2lkdGggaW4gbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCB0cmlnZ2VyX3dpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInRyaWdnZXJfZGVsYXkiLCAuZGVzY3IgPSAiUnNzaSBUcmlnZ2VyIERlbGF5IGluIG5zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSwgdHJpZ2dlcl9kZWxheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzYW1wbGVfcGVyaW9kIiwgLmRlc2NyID0gIlJzc2kgU2FtcGUgUGVyaW9kIGluIHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSwgc2FtcGxlX3BlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhIiwgLmRlc2NyID0gIklzc3VlcyBhbiBSU1NJIGdyYW50IHRvIHJlYWQgUlggUG93ZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGFkZF9saW5rICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hZGRfbGlua19tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9saW5rX3JhdGUgPSB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBvZiBsaW5rIHRvIHByZS1wcm92aXNpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfUkFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEsIHJhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfYWRkX2xpbmtfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9saW5rX21hY19hZGRyZXNzLCAmcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9saW5rX3JhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAicmF0ZSIsIC5kZXNjciA9ICJSYXRlIG9mIGxpbmsgdG8gcHJlLXByb3Zpc2lvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSwgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhIiwgLmRlc2NyID0gIlByZS1wcm92aXNpb24gYW4gRVBPTiBsaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gYWRkX211bHRpY2FzdF9saW5rICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19yYXRlID0geyAubmFtZSA9ICJyYXRlIiwgLmRlc2NyID0gIlJhdGUgb2YgbGluayB0byBwcmUtcHJvdmlzaW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEsIHJhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX3JhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJyYXRlIiwgLmRlc2NyID0gIlJhdGUgb2YgbGluayB0byBwcmUtcHJvdmlzaW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSwgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEiLCAuZGVzY3IgPSAiUHJlLXByb3Zpc2lvbiBhbiBFUE9OIG11bHRpY2FzdCBsaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfd29ya2luZ19saW5rX2luZm8gPSB7IC5uYW1lID0gIndvcmtpbmdfbGlua19pbmZvIiwgLmRlc2NyID0gIkxpbmsgaW5mbyBmb3IgdGhlIGFzc29jaWF0ZWQgd29ya2luZyBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSwgd29ya2luZ19saW5rX2luZm8pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mbyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX21hY19hZGRyZXNzLCAmcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX3dvcmtpbmdfbGlua19pbmZvIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gIndvcmtpbmdfbGlua19pbmZvIiwgLmRlc2NyID0gIkxpbmsgaW5mbyBmb3IgdGhlIGFzc29jaWF0ZWQgd29ya2luZyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhLCB3b3JraW5nX2xpbmtfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhIiwgLmRlc2NyID0gIkFkZHMgYSBwcm90ZWN0ZWQgc3RhbmRieSBsaW5rLiAgT25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLCB0aGUgbGluayBpcyBjb25zaWRlcmVkIFwic3RhbmRieVwiIGZvciB0aGUgcHVwb3NlcyBvZiBwcm90ZWN0aW9uIHN3aXRjaGluZy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIG5vX3JlcG9ydHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX25vX3JlcG9ydHNfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfTk9fUkVQT1JUU19JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfbm9fcmVwb3J0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfbm9fcmVwb3J0c19hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhIiwgLmRlc2NyID0gIkxvc3Mgb2YgYWxsIHJlcG9ydHMgb24gYWxsIGxpbmtzIG9uIHRoZSBFUE9OIE5JIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBsbGlkX3F1YXJhbnRpbmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xsaWQgPSB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTExJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xpbmtfcmF0ZSA9IHsgLm5hbWUgPSAibGlua19yYXRlIiwgLmRlc2NyID0gIkxpbmsgUmF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCBsaW5rX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9saW5rX21hYyA9IHsgLm5hbWUgPSAibGlua19tYWMiLCAuZGVzY3IgPSAiTGluayBNQUMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCBsaW5rX21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfcmFuZ2VfdmFsdWVfdHEgPSB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIGluIHRpbWUgcXVhbnRhIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9SQU5HRV9WQUxVRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xsaWQsICZwcm9wX2Rlc2NyX2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9saW5rX3JhdGUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9saW5rX21hYywgJnByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX3JhbmdlX3ZhbHVlX3RxIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIkxMSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiTGluayBSYXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSwgbGlua19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSwgeyAubmFtZSA9ICJsaW5rX21hYyIsIC5kZXNjciA9ICJMaW5rIE1BQyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEsIGxpbmtfbWFjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIGluIHRpbWUgcXVhbnRhIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSIsIC5kZXNjciA9ICJMTElEIFF1YXJhbnRpbmVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9uZXdfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCBhZnRlciBhICdzZXRfZXBvbl9uaV9lbl9zdGF0ZScgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX3JlcmFuZ2VfZGVsdGEgPSB7IC5uYW1lID0gInJlcmFuZ2VfZGVsdGEiLCAuZGVzY3IgPSAiUmUtcmFuZ2UgZGVsdGEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEsIHJlcmFuZ2VfZGVsdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX3JlcmFuZ2VfZGVsdGEgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlcmFuZ2VfZGVsdGEiLCAuZGVzY3IgPSAiUmUtcmFuZ2UgZGVsdGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhLCByZXJhbmdlX2RlbHRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbHkgcmUtcmFuZ2UgZGVsdGEiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHJlcmFuZ2VfZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfcmVyYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9sbGlkID0geyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIkxMSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MTElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9saW5rX21hYyA9IHsgLm5hbWUgPSAibGlua19tYWMiLCAuZGVzY3IgPSAiTGluayBNQUMgIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTElOS19NQUMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBsaW5rX21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfbGxpZCwgJnByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9saW5rX21hYyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAibGxpZCIsIC5kZXNjciA9ICJMTElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGxsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9LCB7IC5uYW1lID0gImxpbmtfbWFjIiwgLmRlc2NyID0gIkxpbmsgTUFDICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBsaW5rX21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHJvZ3VlX2xsaWRfc2NhbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX21vZGUgPSB7IC5uYW1lID0gIm1vZGUiLCAuZGVzY3IgPSAiVHJ1ZSA9IFNjYW4gYWxsIExMSURTIG9uIHRoZSBQT04iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhLCBtb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fbGxpZCA9IHsgLm5hbWUgPSAibGxpZCIsIC5kZXNjciA9ICJTcGVjaWZpYyBMTElEIHRvIHNjYW4gb3IgMCB0byBzY2FuIGFsbCB3aGVuIG1vZGUgaXMgQUxMIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9tb2RlLCAmcHJvcF9kZXNjcl9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9sbGlkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1vZGUiLCAuZGVzY3IgPSAiVHJ1ZSA9IFNjYW4gYWxsIExMSURTIG9uIHRoZSBQT04iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIlNwZWNpZmljIExMSUQgdG8gc2NhbiBvciAwIHRvIHNjYW4gYWxsIHdoZW4gbW9kZSBpcyBBTEwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEsIGxsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhIiwgLmRlc2NyID0gIklzc3VlIGEgcmVxdWVzdCB0byBzY2FuIGFsbCBMTElEcyBvciBhIHNwZWNpZmljIExMSUQgb24gYSBQT04iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHN0YXJ0X29udV91cGdyYWRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9saXN0X29mX29udV9pZHMgPSB7IC5uYW1lID0gImxpc3Rfb2Zfb251X2lkcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVXMgdG8gdXBncmFkZSB0aGUgZmlybXdhcmUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpc3Rfb2Zfb251X2lkcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVXMgdG8gdXBncmFkZSB0aGUgZmlybXdhcmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEsIGxpc3Rfb2Zfb251X2lkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEiLCAuZGVzY3IgPSAiU3RhcnQgT05VIEZpcm13YXJlIFVwZ3JhZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIG9udV91cGdyYWRlX2NvbXBsZXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdWNjZXNzIG9yIGZhaWx1cmUuICBBZ2FpbnN0IGVudGlyZSB1cGdyYWRlIHByb2Nlc3MuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9saXN0X29mX2ZhaWxlZF9lbnRpdGllcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfc3RhdHVzLCAmcHJvcF9kZXNjcl9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiT05VIFVwZ3JhZGUgQ29tcGxldGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHJvZ3VlX3NjYW5fY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfcmV0dXJuX2luZF9zdGF0dXMgPSB7IC5uYW1lID0gInJldHVybl9pbmRfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiBjb21wbGV0ZWQgc2NhbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEsIHJldHVybl9pbmRfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfcmV0dXJuX2luZF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJldHVybl9pbmRfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiBjb21wbGV0ZWQgc2NhbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEsIHJldHVybl9pbmRfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIkluZGNpYXRpb24gdGhhdCBhIHNjYW4gaXMgY29tcGxldGUsIGFueSBlcnJvciBpcyBhbHNvIHJldHVybmVkLiAiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIG1wY3BfdGltZXN0YW1wX2NoYW5nZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfbXBjcF90aW1lc3RhbXAgPSB7IC5uYW1lID0gIm1wY3BfdGltZXN0YW1wIiwgLmRlc2NyID0gIlRoZSBNUENQIHRpbWUgYXQgd2hpY2ggdGhlIHB1bHNlIHdhcyByZWNlaXZlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEX0lEX01QQ1BfVElNRVNUQU1QLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhLCBtcGNwX3RpbWVzdGFtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfbXBjcF90aW1lc3RhbXAgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1wY3BfdGltZXN0YW1wIiwgLmRlc2NyID0gIlRoZSBNUENQIHRpbWUgYXQgd2hpY2ggdGhlIHB1bHNlIHdhcyByZWNlaXZlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhLCBtcGNwX3RpbWVzdGFtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhIiwgLmRlc2NyID0gIkEgY2xvY2sgdHJhbnNwb3J0IHB1bHNlIHdhcyByZWNlaXZlZCBhdCB0aGUgZ2l2ZW4gTVBDUCB0aW1lc3RhbXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlID0geyAubmFtZSA9ICJhdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUgPSB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX2xsaWRfcXVhcmFudGluZWQgPSB7IC5uYW1lID0gImxsaWRfcXVhcmFudGluZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxsaWRfcXVhcmFudGluZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgbGxpZF9xdWFyYW50aW5lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfbXBjcF90aW1lc3RhbXBfY2hhbmdlZCA9IHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF90aW1lc3RhbXBfY2hhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19ub19yZXBvcnRzID0geyAubmFtZSA9ICJub19yZXBvcnRzIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJub19yZXBvcnRzXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIG5vX3JlcG9ydHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX29udV91cGdyYWRlX2NvbXBsZXRlID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X3VwZ3JhZGVfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV91cGdyYWRlX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19yZXJhbmdlX2ZhaWx1cmUgPSB7IC5uYW1lID0gInJlcmFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVyYW5nZV9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcmVyYW5nZV9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19yb2d1ZV9zY2FuX2NvbXBsZXRlID0geyAubmFtZSA9ICJyb2d1ZV9zY2FuX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9zY2FuX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUk9HVUVfU0NBTl9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX3NjYW5fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkID0geyAubmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0geyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfbGxpZF9xdWFyYW50aW5lZCwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCAmcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX25vX3JlcG9ydHMsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfcmVyYW5nZV9mYWlsdXJlLCAmcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3JvZ3VlX3NjYW5fY29tcGxldGUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxsaWRfcXVhcmFudGluZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxsaWRfcXVhcmFudGluZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgbGxpZF9xdWFyYW50aW5lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1wY3BfdGltZXN0YW1wX2NoYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgbXBjcF90aW1lc3RhbXBfY2hhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm5vX3JlcG9ydHMiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm5vX3JlcG9ydHNcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgbm9fcmVwb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJlcmFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVyYW5nZV9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJlcmFuZ2VfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJvZ3VlX3NjYW5fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX3NjYW5fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZXBvbl9vbnVfMTBnX3VzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19rZXlfZXBvbl9uaSA9IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIHdpdGggd2hpY2ggdGhpcyBPTlUgaW50ZXJmYWNlIGlzIGFzc29jaWF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19rZXlfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE9OVSBpbnRlcmZhY2Ugd2l0aGluIGl0cyBFUE9OIE5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xMGdfdXNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2tleV9lcG9uX25pLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfa2V5X29udV9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgd2l0aCB3aGljaCB0aGlzIE9OVSBpbnRlcmZhY2UgaXMgYXNzb2NpYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBPTlUgaW50ZXJmYWNlIHdpdGhpbiBpdHMgRVBPTiBOSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXksIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xMGdfdXMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX2NvZGVfd29yZHNfdG90YWwgPSB7IC5uYW1lID0gImZlY19jb2RlX3dvcmRzX3RvdGFsIiwgLmRlc2NyID0gIkZFQyBzdGF0cyBjb2RlIHdvcmRzIHRvdGFsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19jb2RlX3dvcmRzX3RvdGFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2ZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscyA9IHsgLm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzIiwgLmRlc2NyID0gIkZFQyBzdGF0cyBjb2RlIHdvcmRzIGRlY29kZSBmYWlscyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSwgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2ZlY196ZXJvZXNfY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfemVyb2VzX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgc3RhdHMgemVyb3MgY29ycmVjdGVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY196ZXJvZXNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2ZlY19vbmVzX2NvcnJlY3RlZCA9IHsgLm5hbWUgPSAiZmVjX29uZXNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBzdGF0cyBvbmVzIGNvcmVjdGVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfb25lc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMTBnX3VzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfY29kZV93b3Jkc190b3RhbCwgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfemVyb2VzX2NvcnJlY3RlZCwgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX29uZXNfY29ycmVjdGVkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19jb2RlX3dvcmRzX3RvdGFsIiwgLmRlc2NyID0gIkZFQyBzdGF0cyBjb2RlIHdvcmRzIHRvdGFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfY29kZV93b3Jkc190b3RhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgZGVjb2RlIGZhaWxzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX3plcm9lc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIHplcm9zIGNvcnJlY3RlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSwgZmVjX3plcm9lc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX29uZXNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBzdGF0cyBvbmVzIGNvcmVjdGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfb25lc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xMGdfdXMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfY2ZnX2FsbF9saW5rcyA9IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLmRlc2NyID0gIkxpc3Qgb2YgTUFDIEFkZHJlc3NlcyBmb3IgYWxsIGxpbmtzIG9uIHRoZSBPTlUgSWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhLCBhbGxfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMTBnX3VzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19jZmdfYWxsX2xpbmtzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLmRlc2NyID0gIkxpc3Qgb2YgTUFDIEFkZHJlc3NlcyBmb3IgYWxsIGxpbmtzIG9uIHRoZSBPTlUgSWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMTBnX3VzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMTBnX3VzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xMGdfdXMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xMGdfdXNfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX29udV8xZ191cyA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgd2l0aCB3aGljaCB0aGlzIE9OVSBpbnRlcmZhY2UgaXMgYXNzb2NpYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2tleV9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgT05VIGludGVyZmFjZSB3aXRoaW4gaXRzIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xZ191c19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19rZXlfZXBvbl9uaSwgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfa2V5X29udV9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSB3aXRoIHdoaWNoIHRoaXMgT05VIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgT05VIGludGVyZmFjZSB3aXRoaW4gaXRzIEVQT04gTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXksIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMWdfdXMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9nb29kX2ZyYW1lcyA9IHsgLm5hbWUgPSAiZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiR29vZCBGcmFtZSBDb3VudCwgaW5jbHVkaW5nIG5vbkZFQyBhbmQgRkVDIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBnb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2dvb2RfYnl0ZXMgPSB7IC5uYW1lID0gImdvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiR29vZCBCeXRlIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZ29vZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X292ZXJzel9mcmFtZXMgPSB7IC5uYW1lID0gIm92ZXJzel9mcmFtZXMiLCAuZGVzY3IgPSAiT3ZlcnNpemVkIGZyYW1lIGNvdW50IChmcmFtZXMgbGFyZ2VyIHRoYW4gMjAwMCBieXRlcykiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgb3ZlcnN6X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X25vbl9mZWNfZ29vZF9mcmFtZXMgPSB7IC5uYW1lID0gIm5vbl9mZWNfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiTm9uIEZFQyBHb29kIEZyYW1lIENvdW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIG5vbl9mZWNfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9ub25fZmVjX2dvb2RfYnl0ZXMgPSB7IC5uYW1lID0gIm5vbl9mZWNfZ29vZF9ieXRlcyIsIC5kZXNjciA9ICJOb24gRkVDIEdvb2QgQnl0ZSBDb3VudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIG5vbl9mZWNfZ29vZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19nb29kX2ZyYW1lcyA9IHsgLm5hbWUgPSAiZmVjX2dvb2RfZnJhbWVzIiwgLmRlc2NyID0gIkZFQyBHb29kIEZyYW1lIENvdW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2dvb2RfYnl0ZXMgPSB7IC5uYW1lID0gImZlY19nb29kX2J5dGVzIiwgLmRlc2NyID0gIkZFQyBHb29kIEJ5dGUgQ291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19nb29kX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2ZyYW1lc19leGNfZXJycyA9IHsgLm5hbWUgPSAiZmVjX2ZyYW1lc19leGNfZXJycyIsIC5kZXNjciA9ICJGRUMgRnJhbWVzIHdoaWNoIGV4Y2VlZGVkIDggc3ltYm9sIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZnJhbWVzX2V4Y19lcnJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2Jsa3Nfbm9fZXJycyA9IHsgLm5hbWUgPSAiZmVjX2Jsa3Nfbm9fZXJycyIsIC5kZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggbm8gZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19ibGtzX25vX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfYmxrc19jb3JyX2VycnMgPSB7IC5uYW1lID0gImZlY19ibGtzX2NvcnJfZXJycyIsIC5kZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggY29ycmVjdGFibGUgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2Jsa3NfY29ycl9lcnJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2Jsa3NfdW5jb3JyX2VycnMgPSB7IC5uYW1lID0gImZlY19ibGtzX3VuY29ycl9lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCB1bmNvcnJlY3RhYmxlIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX1VOQ09SUl9FUlJTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2Jsa3NfdW5jb3JyX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfY29ycl9ieXRlcyA9IHsgLm5hbWUgPSAiZmVjX2NvcnJfYnl0ZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBCeXRlcy9TeW1ib2xzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfY29ycl9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX3plcm9lcyA9IHsgLm5hbWUgPSAiZmVjX2NvcnJfemVyb2VzIiwgLmRlc2NyID0gIkZFQyBDb3JyZWN0ZWQgWmVyb2VzLCA4YiBkb21haW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfY29ycl96ZXJvZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfY29ycl9vbmVzID0geyAubmFtZSA9ICJmZWNfY29ycl9vbmVzIiwgLmRlc2NyID0gIkZFQyBDb3JyZWN0ZWQgT25lcywgOGIgZG9tYWluIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfT05FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX29uZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF91bmRlcnN6X2ZyYW1lcyA9IHsgLm5hbWUgPSAidW5kZXJzel9mcmFtZXMiLCAuZGVzY3IgPSAiVW5kZXJzaXplIGZyYW1lIGNvdW50IChmcmFtZXMgbGVzcyB0aGFuIDY0IGJ5dGVzKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgdW5kZXJzel9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9lcnJvcnN6X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZXJyb3Jzel9mcmFtZXMiLCAuZGVzY3IgPSAiRXJyb3JlZCBmcmFtZSAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGVycm9yc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2dvb2RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2dvb2RfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfb3ZlcnN6X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9ub25fZmVjX2dvb2RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X25vbl9mZWNfZ29vZF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2dvb2RfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2ZyYW1lc19leGNfZXJycywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfYmxrc19ub19lcnJzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19ibGtzX2NvcnJfZXJycywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfYmxrc191bmNvcnJfZXJycywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfY29ycl9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfY29ycl96ZXJvZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2NvcnJfb25lcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF91bmRlcnN6X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9lcnJvcnN6X2ZyYW1lcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImdvb2RfZnJhbWVzIiwgLmRlc2NyID0gIkdvb2QgRnJhbWUgQ291bnQsIGluY2x1ZGluZyBub25GRUMgYW5kIEZFQyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBnb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJnb29kX2J5dGVzIiwgLmRlc2NyID0gIkdvb2QgQnl0ZSBDb3VudCwgaW5jbHVkaW5nIG5vbkZFQyBhbmQgRkVDIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGdvb2RfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3ZlcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJPdmVyc2l6ZWQgZnJhbWUgY291bnQgKGZyYW1lcyBsYXJnZXIgdGhhbiAyMDAwIGJ5dGVzKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBvdmVyc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5vbl9mZWNfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiTm9uIEZFQyBHb29kIEZyYW1lIENvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIG5vbl9mZWNfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibm9uX2ZlY19nb29kX2J5dGVzIiwgLmRlc2NyID0gIk5vbiBGRUMgR29vZCBCeXRlIENvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIG5vbl9mZWNfZ29vZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiRkVDIEdvb2QgRnJhbWUgQ291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19nb29kX2J5dGVzIiwgLmRlc2NyID0gIkZFQyBHb29kIEJ5dGUgQ291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2dvb2RfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2ZyYW1lc19leGNfZXJycyIsIC5kZXNjciA9ICJGRUMgRnJhbWVzIHdoaWNoIGV4Y2VlZGVkIDggc3ltYm9sIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZnJhbWVzX2V4Y19lcnJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19ibGtzX25vX2VycnMiLCAuZGVzY3IgPSAiRkVDIEJsb2NrcyB3aXRoIG5vIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfYmxrc19ub19lcnJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19ibGtzX2NvcnJfZXJycyIsIC5kZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggY29ycmVjdGFibGUgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19ibGtzX2NvcnJfZXJycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfYmxrc191bmNvcnJfZXJycyIsIC5kZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggdW5jb3JyZWN0YWJsZSBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2Jsa3NfdW5jb3JyX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJfYnl0ZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBCeXRlcy9TeW1ib2xzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb3JyX3plcm9lcyIsIC5kZXNjciA9ICJGRUMgQ29ycmVjdGVkIFplcm9lcywgOGIgZG9tYWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX3plcm9lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycl9vbmVzIiwgLmRlc2NyID0gIkZFQyBDb3JyZWN0ZWQgT25lcywgOGIgZG9tYWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX29uZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5kZXJzel9mcmFtZXMiLCAuZGVzY3IgPSAiVW5kZXJzaXplIGZyYW1lIGNvdW50IChmcmFtZXMgbGVzcyB0aGFuIDY0IGJ5dGVzKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCB1bmRlcnN6X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlcnJvcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJFcnJvcmVkIGZyYW1lICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBlcnJvcnN6X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2NmZ19hbGxfbGlua3MgPSB7IC5uYW1lID0gImFsbF9saW5rcyIsIC5kZXNjciA9ICJMaXN0IG9mIE1BQyBBZGRyZXNzZXMgZm9yIGFsbCBsaW5rcyBvbiB0aGUgT05VIElkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xZ191c19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19jZmdfYWxsX2xpbmtzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBNQUMgQWRkcmVzc2VzIGZvciBhbGwgbGlua3Mgb24gdGhlIE9OVSBJZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhLCBhbGxfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMWdfdXMgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xZ191c19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzFnX3VzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzFnX3VzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMWdfdXMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xZ191c19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZXBvbl9wYXRoXzEwZ19kcyA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19rZXlfZXBvbl9uaSA9IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDEwRyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2tleV9lcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfZHMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2NmZ19mZWNfc3RhdGUgPSB7IC5uYW1lID0gImZlY19zdGF0ZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9GRUNfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSwgZmVjX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2NmZ19wcmJzX2dlbmVyYXRvciA9IHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xMGdfZHNfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19jZmdfZmVjX3N0YXRlLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2NmZ19wcmJzX2dlbmVyYXRvciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmZWNfc3RhdGUiLCAuZGVzY3IgPSAiRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDEwRyBkb3duc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGEsIGZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ19kcyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYnl0ZXMgPSB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXMgPSB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfYnl0ZXMgPSB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfb2FtX2J5dGVzID0geyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG9hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9nYXRlX2ZyYW1lcyA9IHsgLm5hbWUgPSAiZ2F0ZV9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBnYXRlX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfbXBjcF9mcmFtZXMgPSB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2Fib3J0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzY1XzEyNywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNTEyXzEwMjMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF91bmljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X29hbV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X29hbV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9nYXRlX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X21wY3BfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWJvcnRfZnJhbWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJnYXRlX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGdhdGVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGFib3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ19kcyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ19kcyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ19kcyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX3BhdGhfMTBnX3VzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfdXMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2tleV9lcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfZmVjX3N0YXRlID0geyAubmFtZSA9ICJmZWNfc3RhdGUiLCAuZGVzY3IgPSAiRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDEwRyB1cHN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhLCBmZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX3N5bmNfdGltZV90cSA9IHsgLm5hbWUgPSAic3luY190aW1lX3RxIiwgLmRlc2NyID0gIlRpbWUgcXVhbnRhIG9mIHN5bmMgYXQgc3RhcnQgb2YgVVMgYnVyc3QuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSwgc3luY190aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX3ByYnNfY2hlY2tlciA9IHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhLCBwcmJzX2NoZWNrZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfcHJic19zdGF0dXMgPSB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19mZWNfc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX3N5bmNfdGltZV90cSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfcHJic19jaGVja2VyLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19wcmJzX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmZWNfc3RhdGUiLCAuZGVzY3IgPSAiRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDEwRyB1cHN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhLCBmZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9LCB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC5kZXNjciA9ICJUaW1lIHF1YW50YSBvZiBzeW5jIGF0IHN0YXJ0IG9mIFVTIGJ1cnN0LiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHN5bmNfdGltZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfdXMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2J5dGVzID0geyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9icm9hZGNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0RBVEFfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vYW1fYnl0ZXMgPSB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X29hbV9mcmFtZXMgPSB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9yZXBvcnRfZnJhbWVzID0geyAubmFtZSA9ICJyZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgcmVwb3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWJvcnRfZnJhbWVzID0geyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mY3NfZXJyb3IgPSB7IC5uYW1lID0gImZjc19lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY3JjXzhfZXJyb3IgPSB7IC5uYW1lID0gImNyY184X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBjcmNfOF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb3V0X29mX3Nsb3QgPSB7IC5uYW1lID0gIm91dF9vZl9zbG90IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb3V0X29mX3Nsb3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X292ZXJzaXplX2Vycm9yID0geyAubmFtZSA9ICJvdmVyc2l6ZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG92ZXJzaXplX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9ydW50X2Vycm9yID0geyAubmFtZSA9ICJydW50X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JVTlRfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIHJ1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzY1XzEyNywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNTEyXzEwMjMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF91bmljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X21wY3BfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb2FtX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3JlcG9ydF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hYm9ydF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mY3NfZXJyb3IsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jcmNfOF9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X291dF9vZl9zbG90LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb3ZlcnNpemVfZXJyb3IsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9ydW50X2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIHJlcG9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYWJvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZjc19lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImNyY184X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBjcmNfOF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvdXRfb2Zfc2xvdCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG91dCBvZiBzbG90IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG91dF9vZl9zbG90KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgcnVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ191cyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ191cyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ191cyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX3BhdGhfMWdfZHMgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX2RzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMUcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfZHNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2tleV9lcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxRyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RlZmF1bHRfZmVjX3N0YXRlID0geyAubmFtZSA9ICJkZWZhdWx0X2ZlY19zdGF0ZSIsIC5kZXNjciA9ICJEZWZhdWx0IEZFQyBlbmFibGUgc3RhdGUgZm9yIHRoZSAxRyBkb3duc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIGRlZmF1bHRfZmVjX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfY2ZnX3JhbWFuX21vZGUgPSB7IC5uYW1lID0gInJhbWFuX21vZGUiLCAuZGVzY3IgPSAiUmFtYW4gbWl0aWdhdGlvbiBtb2RlIGZvciB0aGUgMUcgZG93bnN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFJhbWFuIG1pdGlnYXRpb24gY2Fubm90IGNvZXhpc3Qgd2l0aCB0dXJibyBtb2RlLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgcmFtYW5fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfdHVyYm9fMmdfbW9kZSA9IHsgLm5hbWUgPSAidHVyYm9fMmdfbW9kZSIsIC5kZXNjciA9ICJPcGVyYXRlIHRoZSAxRyBkb3duc3RyZWFtIHBhdGggYXQgdGhlIHR1cmJvIDJHIGRhdGEgcmF0ZSBvbiB0aGlzIEVQT04gTkkuICBSYW1hbiBtaXRpZ2F0aW9uIGNhbm5vdCBjb2V4aXN0IHdpdGggdHVyYm8gbW9kZS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfVFVSQk9fMkdfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIHR1cmJvXzJnX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfY2ZnX3ByYnNfZ2VuZXJhdG9yID0geyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ19kc19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RlZmF1bHRfZmVjX3N0YXRlLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfY2ZnX3JhbWFuX21vZGUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfdHVyYm9fMmdfbW9kZSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2NmZ19wcmJzX2dlbmVyYXRvciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRlZmF1bHRfZmVjX3N0YXRlIiwgLmRlc2NyID0gIkRlZmF1bHQgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhLCBkZWZhdWx0X2ZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAicmFtYW5fbW9kZSIsIC5kZXNjciA9ICJSYW1hbiBtaXRpZ2F0aW9uIG1vZGUgZm9yIHRoZSAxRyBkb3duc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgUmFtYW4gbWl0aWdhdGlvbiBjYW5ub3QgY29leGlzdCB3aXRoIHR1cmJvIG1vZGUuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhLCByYW1hbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlIH0sIHsgLm5hbWUgPSAidHVyYm9fMmdfbW9kZSIsIC5kZXNjciA9ICJPcGVyYXRlIHRoZSAxRyBkb3duc3RyZWFtIHBhdGggYXQgdGhlIHR1cmJvIDJHIGRhdGEgcmF0ZSBvbiB0aGlzIEVQT04gTkkuICBSYW1hbiBtaXRpZ2F0aW9uIGNhbm5vdCBjb2V4aXN0IHdpdGggdHVyYm8gbW9kZS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIHR1cmJvXzJnX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYnl0ZXMgPSB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9tdWx0aWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9vYW1fYnl0ZXMgPSB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X29hbV9mcmFtZXMgPSB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9nYXRlX2ZyYW1lcyA9IHsgLm5hbWUgPSAiZ2F0ZV9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBnYXRlX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ19kc19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9vYW1fYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X29hbV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2dhdGVfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9tcGNwX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWJvcnRfZnJhbWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImdhdGVfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBnYXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGdhdGVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX2RzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fcGF0aF8xZ191cyA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxRyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfdXNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2tleV9lcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxRyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX3VzIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19kZWZhdWx0X2ZlY19zdGF0ZSA9IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAuZGVzY3IgPSAiRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgdXBzdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSwgZGVmYXVsdF9mZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19jZmdfc3luY190aW1lX3RxID0geyAubmFtZSA9ICJzeW5jX3RpbWVfdHEiLCAuZGVzY3IgPSAiVGltZSBxdWFudGEgb2Ygc3luYyBhdCBzdGFydCBvZiBVUyBidXJzdC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSwgc3luY190aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBwcmJzX2NoZWNrZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19jZmdfZGVmYXVsdF9mZWNfc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19jZmdfc3luY190aW1lX3RxLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfY2ZnX3ByYnNfY2hlY2tlciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19wcmJzX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRlZmF1bHRfZmVjX3N0YXRlIiwgLmRlc2NyID0gIkRlZmF1bHQgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDFHIHVwc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSwgZGVmYXVsdF9mZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9LCB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC5kZXNjciA9ICJUaW1lIHF1YW50YSBvZiBzeW5jIGF0IHN0YXJ0IG9mIFVTIGJ1cnN0LiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSwgc3luY190aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBwcmJzX2NoZWNrZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYnl0ZXMgPSB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXMgPSB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfYnl0ZXMgPSB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfbXBjcF9mcmFtZXMgPSB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vYW1fYnl0ZXMgPSB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfcmVwb3J0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicmVwb3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIHJlcG9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWJvcnRfZnJhbWVzID0geyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2Zjc19lcnJvciA9IHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GQ1NfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2NyY184X2Vycm9yID0geyAubmFtZSA9ICJjcmNfOF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIENSQzggZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgY3JjXzhfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfb3V0X29mX3Nsb3QgPSB7IC5uYW1lID0gIm91dF9vZl9zbG90IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb3V0X29mX3Nsb3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfb3ZlcnNpemVfZXJyb3IgPSB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfcnVudF9lcnJvciA9IHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ191c19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9tcGNwX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfb2FtX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vYW1fZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9yZXBvcnRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hYm9ydF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2Zjc19lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY3JjXzhfZXJyb3IsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X291dF9vZl9zbG90LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfcnVudF9lcnJvciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicmVwb3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgcmVwb3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZjc19lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJjcmNfOF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIENSQzggZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGNyY184X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm91dF9vZl9zbG90IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG91dF9vZl9zbG90KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG92ZXJzaXplX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX3VzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ191c19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fcnAgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9ycCAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcnBfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBjb250YWluaW5nIHRoaXMgUlAuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9rZXlfbGlua19yYXRlID0geyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiTGluayByYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJQLiAgTXVzdCBiZSBvbmUgb2YgMTAvMTAsIDEwLzEsIG9yIDEvMS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfa2V5LCBsaW5rX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcnBfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9ycF9rZXlfZXBvbl9uaSwgJnByb3BfZGVzY3JfZXBvbl9ycF9rZXlfbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgY29udGFpbmluZyB0aGlzIFJQLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibGlua19yYXRlIiwgLmRlc2NyID0gIkxpbmsgcmF0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBSUC4gIE11c3QgYmUgb25lIG9mIDEwLzEwLCAxMC8xLCBvciAxLzEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2tleSwgbGlua19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcnBfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3JwX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3JwIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfYmFzZV9sbGlkID0geyAubmFtZSA9ICJiYXNlX2xsaWQiLCAuZGVzY3IgPSAiQmFzZSAobG93ZXN0KSBsb2dpY2FsIGxpbmsgaWRlbnRpZmllciBmb3IgdGhpcyBSUC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQsIG5vciB3aGlsZSBhbnkgbm9uLXN5c3RlbSBsaW5rcyBleGlzdC4gIFRoZSBzdW0gb2YgdGhpcyB2YWx1ZSBhbmQgbWF4X2xpbmtzIGZvciB0aGlzIFJQIG11c3QgYmUgMHg3ZWZmIG9yIHNtYWxsZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBiYXNlX2xsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21wY3BfZGlzY19lbiA9IHsgLm5hbWUgPSAibXBjcF9kaXNjX2VuIiwgLmRlc2NyID0gIkdvdmVybnMgd2hldGhlciBkaXNjb3ZlcnkgZ2F0ZXMgZm9yIHRoaXMgUlAgYXJlIGlzc3VlZCAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIG1wY3BfZGlzY19lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21wY3BfZGlzY19nbnRfbGVuX3RxID0geyAubmFtZSA9ICJtcGNwX2Rpc2NfZ250X2xlbl90cSIsIC5kZXNjciA9ICJMZW5ndGggb2YgZGlzY292ZXJ5IGdyYW50cyBpbiB0aW1lIHF1YW50YSBmb3IgdGhpcyBSUC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbXBjcF9kaXNjX2dudF9sZW5fdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbXBjcF9yZXBvcnRfdGltZW91dCA9IHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgbXMgYmVmb3JlIGxpbmtzIGFyZSBkZXJlZ2lzdGVyZWQgZHVlIHRvIG5vIHJlcG9ydCByZWNlaXZlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cgPSB7IC5uYW1lID0gIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgTVBDUCByZWdpc3RyYXRpb25zIHBlciBkaXNjb3Zlcnkgd2luZG93IG9uIHRoaXMgUlAgKDAgaW5kaWNhdGVzIHVubGltaXRlZCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1csIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19tYXhfbGlua3MgPSB7IC5uYW1lID0gIm1heF9saW5rcyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBsaW5rcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbWF4X2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX2RlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoID0geyAubmFtZSA9ICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCIsIC5kZXNjciA9ICJEZWZhdWx0IHVwc3RyZWFtIGJhbmR3aWR0aCBmb3IgbmV3bHkgY3JlYXRlZCBsaW5rcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfREVGQVVMVF9VUFNUUkVBTV9CQU5EV0lEVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfcmF0ZV9vZl9yZWZyYWN0aW9uID0geyAubmFtZSA9ICJyYXRlX29mX3JlZnJhY3Rpb24iLCAuZGVzY3IgPSAiUmF0ZSBvZiBSZWZyYWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCByYXRlX29mX3JlZnJhY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2RvdWJsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcnBfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9ycF9jZmdfYmFzZV9sbGlkLCAmcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19tcGNwX2Rpc2NfZW4sICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21wY3BfZGlzY19nbnRfbGVuX3RxLCAmcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19tcGNwX3JlcG9ydF90aW1lb3V0LCAmcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19tYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93LCAmcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19tYXhfbGlua3MsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX2RlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCAmcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19yYXRlX29mX3JlZnJhY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmFzZV9sbGlkIiwgLmRlc2NyID0gIkJhc2UgKGxvd2VzdCkgbG9naWNhbCBsaW5rIGlkZW50aWZpZXIgZm9yIHRoaXMgUlAuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLCBub3Igd2hpbGUgYW55IG5vbi1zeXN0ZW0gbGlua3MgZXhpc3QuICBUaGUgc3VtIG9mIHRoaXMgdmFsdWUgYW5kIG1heF9saW5rcyBmb3IgdGhpcyBSUCBtdXN0IGJlIDB4N2VmZiBvciBzbWFsbGVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgYmFzZV9sbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NfZW4iLCAuZGVzY3IgPSAiR292ZXJucyB3aGV0aGVyIGRpc2NvdmVyeSBnYXRlcyBmb3IgdGhpcyBSUCBhcmUgaXNzdWVkICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbXBjcF9kaXNjX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjX2dudF9sZW5fdHEiLCAuZGVzY3IgPSAiTGVuZ3RoIG9mIGRpc2NvdmVyeSBncmFudHMgaW4gdGltZSBxdWFudGEgZm9yIHRoaXMgUlAuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX2Rpc2NfZ250X2xlbl90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtcGNwX3JlcG9ydF90aW1lb3V0IiwgLmRlc2NyID0gIk51bWJlciBvZiBtcyBiZWZvcmUgbGlua3MgYXJlIGRlcmVnaXN0ZXJlZCBkdWUgdG8gbm8gcmVwb3J0IHJlY2VpdmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbXBjcF9yZXBvcnRfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93IiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIE1QQ1AgcmVnaXN0cmF0aW9ucyBwZXIgZGlzY292ZXJ5IHdpbmRvdyBvbiB0aGlzIFJQICgwIGluZGljYXRlcyB1bmxpbWl0ZWQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtYXhfbGlua3MiLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgbGlua3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIG1heF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCIsIC5kZXNjciA9ICJEZWZhdWx0IHVwc3RyZWFtIGJhbmR3aWR0aCBmb3IgbmV3bHkgY3JlYXRlZCBsaW5rcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB9LCB7IC5uYW1lID0gInJhdGVfb2ZfcmVmcmFjdGlvbiIsIC5kZXNjciA9ICJSYXRlIG9mIFJlZnJhY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIHJhdGVfb2ZfcmVmcmFjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfZG91YmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwaW8gPT09PSAqLworCisvKiBHcm91cDogZ3BpbyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwaW9fa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApLiIsIC5hY2Nlc3MgPSAwLCAucHJvcGVydHkgPSBCQ01PTFRfR1BJT19LRVlfSURfUkVTRVJWRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwaW9fa2V5X2dwaW9faWQgPSB7IC5uYW1lID0gImdwaW9faWQiLCAuZGVzY3IgPSAiR1BJTyBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwaW9fa2V5LCBncGlvX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncGlvX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwaW9fa2V5X3Jlc2VydmVkLCAmcHJvcF9kZXNjcl9ncGlvX2tleV9ncGlvX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImdwaW9faWQiLCAuZGVzY3IgPSAiR1BJTyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19rZXksIGdwaW9faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwaW8gLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncGlvX2NmZ19kaXJlY3Rpb24gPSB7IC5uYW1lID0gImRpcmVjdGlvbiIsIC5kZXNjciA9ICJHUElPIFBJTiBkaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwaW9fY2ZnX2RhdGEsIGRpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluX2RpciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwaW9fY2ZnX3ZhbHVlID0geyAubmFtZSA9ICJ2YWx1ZSIsIC5kZXNjciA9ICJWYWx1ZSB0byB3cml0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSwgdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3ZhbHVlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bpb19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncGlvX2NmZ19kaXJlY3Rpb24sICZwcm9wX2Rlc2NyX2dwaW9fY2ZnX3ZhbHVlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRpcmVjdGlvbiIsIC5kZXNjciA9ICJHUElPIFBJTiBkaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwaW9fY2ZnX2RhdGEsIGRpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluX2RpciB9LCB7IC5uYW1lID0gInZhbHVlIiwgLmRlc2NyID0gIlZhbHVlIHRvIHdyaXRlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSwgdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3ZhbHVlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwaW9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fYWxsb2MgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfa2V5X2FsbG9jX2lkID0geyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYyBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2tleV9wb25fbmksICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfa2V5X2FsbG9jX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5LCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfc3RhdGUgPSB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgQWxsb2MgSUQgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfc2xhID0geyAubmFtZSA9ICJzbGEiLCAuZGVzY3IgPSAiQWxsb2MgSUQgU0xBIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRoZSBhbGxvYyBJRCBpcyBhc3NpZ25lZCB0byIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY2ZnX2NvbGxlY3Rfc3RhdHMgPSB7IC5uYW1lID0gImNvbGxlY3Rfc3RhdHMiLCAuZGVzY3IgPSAiRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgdGhpcyBhbGxvYyBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIGNvbGxlY3Rfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY2ZnX3N0YXRlLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19zbGEsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY2ZnX29udV9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfY29sbGVjdF9zdGF0cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEFsbG9jIElEIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH0sIHsgLm5hbWUgPSAic2xhIiwgLmRlc2NyID0gIkFsbG9jIElEIFNMQSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSwgc2xhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FsbG9jX3NsYSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhlIGFsbG9jIElEIGlzIGFzc2lnbmVkIHRvIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciB0aGlzIGFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBjb2xsZWN0X3N0YXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBCeXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9yeF9ieXRlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0gc2V0X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfc3RhdGUgPSB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3NldF9zdGF0ZV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXRzIHRoZSBhbGxvYydzIGFjdGl2YXRpb24gc3RhdGUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCBuZWNlc3Nhcnkgc2luY2UgYWxsb2NzIGFyZSBhY3RpdmF0ZWQvZGVhY3RpdmF0ZWQgYXV0b21hdGljYWxseSBhbG9uZyB3aXRoIHRoZSBPTlUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBnZXRfc3RhdHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9zdGF0c19udW1fb2ZfY3ljbGVzID0geyAubmFtZSA9ICJudW1fb2ZfY3ljbGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgY3ljbGVzIHRvIHJ1biBzdGF0aXN0aWNzIGNvbGxlY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhLCBudW1fb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2NfZ2V0X3N0YXRzX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfbnVtX29mX2N5Y2xlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJudW1fb2ZfY3ljbGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgY3ljbGVzIHRvIHJ1biBzdGF0aXN0aWNzIGNvbGxlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEsIG51bV9vZl9jeWNsZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEiLCAuZGVzY3IgPSAiUnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0gZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2VfbnNyX3VzZWQgPSB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX3VzZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgdXNlZCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfdXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfYWxsb2NhdGVkID0geyAubmFtZSA9ICJhdmVyYWdlX25zcl9hbGxvY2F0ZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgYWxsb2NhdGVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9zcl9yZXBvcnQgPSB7IC5uYW1lID0gImF2ZXJhZ2Vfc3JfcmVwb3J0IiwgLmRlc2NyID0gIkF2ZXJhZ2UgU1IgcmVwb3J0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9zcl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2VfbnNyX3VzZWQsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX3NyX3JlcG9ydCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX3VzZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgdXNlZCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2VfbnNyX3VzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfYWxsb2NhdGVkIiwgLmRlc2NyID0gIkF2ZXJhZ2UgTlNSIGFsbG9jYXRlZCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhdmVyYWdlX3NyX3JlcG9ydCIsIC5kZXNjciA9ICJBdmVyYWdlIFNSIHJlcG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2Vfc3JfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQ29sbGVjdGVkIGFsbG9jIElEIHN0YXRpc3RpY3MgZnJvbSBnZXRfc3RhdHMgb3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19hdXRvX2NmZ19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2NfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncG9uX2dlbV9wb3J0ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25fZ2VtX3BvcnQgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2tleV9nZW1fcG9ydF9pZCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2tleV9nZW1fcG9ydF9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIkdFTSBQb3J0IElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX2dlbV9wb3J0X3N0YXRlID0geyAubmFtZSA9ICJnZW1fcG9ydF9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEdFTSBwb3J0IHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZ2VtX3BvcnRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSB7IC5uYW1lID0gImRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gbW9kZSBvZiB0aGUgR0VNIFBvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUgPSB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLmRlc2NyID0gIlRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBvZiB0aGUgcGFja2V0cyBhcnJpdmluZyBvbiB0aGlzIEdFTSBQb3J0IG9uIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX2NvbnRyb2wgPSB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIEdFTSBQb3J0IElEIGluIHRoZSBPTFQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX2RlYnVnX2Zsb3dfY29uZmlnID0geyAubmFtZSA9ICJkZWJ1Z19mbG93X2NvbmZpZyIsIC5kZXNjciA9ICJUcmFmZmljIGZsb3cgZGVidWcgb3B0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBkZWJ1Z19mbG93X2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19tYWNfdGFibGVfZW50cnlfbGltaXQgPSB7IC5uYW1lID0gIm1hY190YWJsZV9lbnRyeV9saW1pdCIsIC5kZXNjciA9ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgTUFDIHRhYmxlIGVudHJpZXMgYWxsb3dlZCBmb3IgdGhpcyBHRU0gcG9ydCAoMCA9IG5vIGxpbWl0KS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIG1hY190YWJsZV9lbnRyeV9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2dlbV9wb3J0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX29udV9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZ2VtX3BvcnRfc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX2Rvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ191cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfY29udHJvbCwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZGVidWdfZmxvd19jb25maWcsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX21hY190YWJsZV9lbnRyeV9saW1pdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkdFTSBwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRoaXMgR0VNIHBvcnQgaXMgYXNzaWduZWQgdG8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEdFTSBwb3J0IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBnZW1fcG9ydF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgfSwgeyAubmFtZSA9ICJkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgZG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUgb2YgdGhlIEdFTSBQb3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIsIC5kZXNjciA9ICJUaGUgZGVzdGluYXRpb24gcXVldWUgb2YgdGhlIHBhY2tldHMgYXJyaXZpbmcgb24gdGhpcyBHRU0gUG9ydCBvbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgR0VNIFBvcnQgSUQgaW4gdGhlIE9MVCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJkZWJ1Z19mbG93X2NvbmZpZyIsIC5kZXNjciA9ICJUcmFmZmljIGZsb3cgZGVidWcgb3B0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZGVidWdfZmxvd19jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnIH0sIHsgLm5hbWUgPSAibWFjX3RhYmxlX2VudHJ5X2xpbWl0IiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIG51bWJlciBvZiBNQUMgdGFibGUgZW50cmllcyBhbGxvd2VkIGZvciB0aGlzIEdFTSBwb3J0ICgwID0gbm8gbGltaXQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9yeF9wYWNrZXRzID0geyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gIlJlY2VpdmVkIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF90eF9wYWNrZXRzID0geyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3R4X2J5dGVzID0geyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9yeF9wYWNrZXRzLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfcnhfYnl0ZXMsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF90eF9wYWNrZXRzLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfdHhfYnl0ZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fZ2VtX3BvcnQgLSBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJuZXcgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fZ2VtX3BvcnQgLSBzZXRfc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldHMgdGhlIEdFTSBwb3J0J3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBHRU0gcG9ydHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9pd2YgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9rZXlfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2l3Zl9tb2RlID0geyAubmFtZSA9ICJpd2ZfbW9kZSIsIC5kZXNjciA9ICJJV0YgbWFwcGluZyBtb2RlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgaXdmX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9pd2ZfbW9kZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ191c190cGlkX3Blcl9mbG93ID0geyAubmFtZSA9ICJ1c190cGlkX3Blcl9mbG93IiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBwZXIgZmxvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgdXNfdHBpZF9wZXJfZmxvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfdXNfb3RhZ19kaXJlY3RfdHBpZCA9IHsgLm5hbWUgPSAidXNfb3RhZ19kaXJlY3RfdHBpZCIsIC5kZXNjciA9ICJUUElEIHZhbHVlIG9mIHRoZSBWTEFOIHRhZyBhZGRlZCB0byB1cHN0cmVhbSBwYWNrZXQgd2hlbiBJV0YgbW9kZSBpcyBzZXQgdG8gZGlyZWN0IG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIHVzX290YWdfZGlyZWN0X3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF9wYml0ID0geyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF9wYml0IiwgLmRlc2NyID0gIlAtYml0IHZhbHVlIG9mIHRoZSBWTEFOIHRhZyBhZGRlZCB0byB1cHN0cmVhbSBwYWNrZXQgd2hlbiBJV0YgbW9kZSBpcyBzZXQgdG8gZGlyZWN0IG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIHVzX290YWdfZGlyZWN0X3BiaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfZHNfdHBpZCA9IHsgLm5hbWUgPSAiZHNfdHBpZCIsIC5kZXNjciA9ICJQYWNrZXRzIG1hcmtlZCB3aXRoIG9uZSBvZiB0aGUgZml2ZSBjb25maWd1cmVkIERTIFRQSUQgb3B0aW9ucyB3aWxsIGJlIGZvcndhcmRlZCwgYWxsIHRoZSByZXN0IHdpbGwgYmUgZHJvcHBlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgZHNfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gIm1hY190YWJsZV9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIk1BQyB0YWJsZSBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJNQUMgdGFibGUgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19tYWNfdGFibGVfY291bnQgPSB7IC5uYW1lID0gIm1hY190YWJsZV9jb3VudCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgTUFDIHRhYmxlIGVudHJpZXMgY29uZmlndXJlZCBpbiB0aGUgTUFDIHRhYmxlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgbWFjX3RhYmxlX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19mb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCA9IHsgLm5hbWUgPSAiZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQiLCAuZGVzY3IgPSAiRm9yYmlkZGVuIHJhbmdlIGZvciBWbGFucywgRmxvd3MgYW5kIEdlbXMgc3RhcnQgdmFsdWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfaXdmX21vZGUsICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ191c190cGlkX3Blcl9mbG93LCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfdXNfb3RhZ19kaXJlY3RfdHBpZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX3VzX290YWdfZGlyZWN0X3BiaXQsICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19kc190cGlkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19tYWNfdGFibGVfY291bnQsICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19mb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaXdmX21vZGUiLCAuZGVzY3IgPSAiSVdGIG1hcHBpbmcgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIGl3Zl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaXdmX21vZGUgfSwgeyAubmFtZSA9ICJ1c190cGlkX3Blcl9mbG93IiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBwZXIgZmxvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIHVzX3RwaWRfcGVyX2Zsb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzJfaGV4IH0sIHsgLm5hbWUgPSAidXNfb3RhZ19kaXJlY3RfdHBpZCIsIC5kZXNjciA9ICJUUElEIHZhbHVlIG9mIHRoZSBWTEFOIHRhZyBhZGRlZCB0byB1cHN0cmVhbSBwYWNrZXQgd2hlbiBJV0YgbW9kZSBpcyBzZXQgdG8gZGlyZWN0IG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCB1c19vdGFnX2RpcmVjdF90cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF9wYml0IiwgLmRlc2NyID0gIlAtYml0IHZhbHVlIG9mIHRoZSBWTEFOIHRhZyBhZGRlZCB0byB1cHN0cmVhbSBwYWNrZXQgd2hlbiBJV0YgbW9kZSBpcyBzZXQgdG8gZGlyZWN0IG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCB1c19vdGFnX2RpcmVjdF9wYml0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZHNfdHBpZCIsIC5kZXNjciA9ICJQYWNrZXRzIG1hcmtlZCB3aXRoIG9uZSBvZiB0aGUgZml2ZSBjb25maWd1cmVkIERTIFRQSUQgb3B0aW9ucyB3aWxsIGJlIGZvcndhcmRlZCwgYWxsIHRoZSByZXN0IHdpbGwgYmUgZHJvcHBlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIGRzX3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4IH0sIHsgLm5hbWUgPSAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIk1BQyB0YWJsZSBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgfSwgeyAubmFtZSA9ICJtYWNfdGFibGVfY291bnQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1BQyB0YWJsZSBlbnRyaWVzIGNvbmZpZ3VyZWQgaW4gdGhlIE1BQyB0YWJsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIG1hY190YWJsZV9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCIsIC5kZXNjciA9ICJGb3JiaWRkZW4gcmFuZ2UgZm9yIFZsYW5zLCBGbG93cyBhbmQgR2VtcyBzdGFydCB2YWx1ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfaGl0X2V2ZW50ID0geyAubmFtZSA9ICJkc19oaXRfZXZlbnQiLCAuZGVzY3IgPSAiRFMgaGl0IGV2ZW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfSElUX0VWRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfaGl0X2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfbWlzc19ldmVudCA9IHsgLm5hbWUgPSAiZHNfbWlzc19ldmVudCIsIC5kZXNjciA9ICJEUyBtaXNzIGV2ZW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIGRzX21pc3NfZXZlbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19kcm9wX2R1ZV90b19taXNzX2V2ZW50ID0geyAubmFtZSA9ICJkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50IiwgLmRlc2NyID0gIkRTIGRyb3AgZHVlIHRvIG1pc3MgZXZlbnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19NSVNTX0VWRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2RzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCA9IHsgLm5hbWUgPSAiZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50IiwgLmRlc2NyID0gIkRTIGRyb3AgZHVlIHRvIGhpdCBldmVudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2RzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtID0geyAubmFtZSA9ICJkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSIsIC5kZXNjciA9ICJEUyBkcm9wIHRvIGRpc2FibGVkIEdFTSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfVE9fRElTQUJMRURfR0VNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfZHJvcF90b19kaXNhYmxlZF9nZW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9uZXdfbWFjX2Rpc2NvdmVyZWQgPSB7IC5uYW1lID0gIm5ld19tYWNfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJOZXcgTUFDIGRpc2NvdmVyZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RJU0NPVkVSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBuZXdfbWFjX2Rpc2NvdmVyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9tb3ZlX2V2ZW50ID0geyAubmFtZSA9ICJtb3ZlX2V2ZW50IiwgLmRlc2NyID0gIk1vdmUgZXZlbnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgbW92ZV9ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X25ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsID0geyAubmFtZSA9ICJuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCIsIC5kZXNjciA9ICJOZXcgTUFDIGRyb3AgZHVlIHRvIGZpZm8gZnVsbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRFJPUF9EVUVfVE9fRklGT19GVUxMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2Zfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfaGl0X2V2ZW50LCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2RzX21pc3NfZXZlbnQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19kcm9wX2R1ZV90b19oaXRfZXZlbnQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfZHJvcF90b19kaXNhYmxlZF9nZW0sICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfbmV3X21hY19kaXNjb3ZlcmVkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X21vdmVfZXZlbnQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkc19oaXRfZXZlbnQiLCAuZGVzY3IgPSAiRFMgaGl0IGV2ZW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIGRzX2hpdF9ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkc19taXNzX2V2ZW50IiwgLmRlc2NyID0gIkRTIG1pc3MgZXZlbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfbWlzc19ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50IiwgLmRlc2NyID0gIkRTIGRyb3AgZHVlIHRvIG1pc3MgZXZlbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQiLCAuZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gaGl0IGV2ZW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSIsIC5kZXNjciA9ICJEUyBkcm9wIHRvIGRpc2FibGVkIEdFTSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJuZXdfbWFjX2Rpc2NvdmVyZWQiLCAuZGVzY3IgPSAiTmV3IE1BQyBkaXNjb3ZlcmVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIG5ld19tYWNfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtb3ZlX2V2ZW50IiwgLmRlc2NyID0gIk1vdmUgZXZlbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgbW92ZV9ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCIsIC5kZXNjciA9ICJOZXcgTUFDIGRyb3AgZHVlIHRvIGZpZm8gZnVsbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIGZsdXNoX21hY190YWJsZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX3ZpZCA9IHsgLm5hbWUgPSAidmlkIiwgLmRlc2NyID0gIlZJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhLCB2aWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2Zsb3dfaWQgPSB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRkxPVyBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29udHJvbCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX3ZpZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2Zsb3dfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uIH0sIHsgLm5hbWUgPSAidmlkIiwgLmRlc2NyID0gIlZJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEsIHZpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIkZMT1cgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEiLCAuZGVzY3IgPSAiRmx1c2ggTUFDIFRhYmxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gc2Nhbl9tYWNfdGFibGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiRW50cnkgTUFDIGFkZHJlc3MuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX3NjYW5fbWFjX3RhYmxlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiRW50cnkgTUFDIGFkZHJlc3MuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSIsIC5kZXNjciA9ICJTY2FucyBNQUMgdGFibGUgZm9yIGEgZ2l2ZW4gTUFDIGFkZHJlc3MgdGhlbiByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBzY2FuX21hY190YWJsZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIkVudHJ5IE1BQyBhZGRyZXNzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9lbnRyaWVzID0geyAubmFtZSA9ICJlbnRyaWVzIiwgLmRlc2NyID0gIlNjYW4gcmVzdWx0cyBmb3IgdGhpcyBlbnRyeS4gIElmIHRoaXMgbGlzdCBpcyBlbXB0eSwgdGhlIE1BQyBhZGRyZXNzIHdhcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfRU5UUklFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSwgZW50cmllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX21hY19hZGRyZXNzLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZW50cmllcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiRW50cnkgTUFDIGFkZHJlc3MuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAiZW50cmllcyIsIC5kZXNjciA9ICJTY2FuIHJlc3VsdHMgZm9yIHRoaXMgZW50cnkuICBJZiB0aGlzIGxpc3QgaXMgZW1wdHksIHRoZSBNQUMgYWRkcmVzcyB3YXMgbm90IGZvdW5kIGluIHRoZSB0YWJsZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhLCBlbnRyaWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIkEgTUFDIHRhYmxlIHNjYW4gaW5pdGlhdGVkIHVzaW5nIHRoZSBcInNjYW5fbWFjX3RhYmxlXCIgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfYXV0b19jZmdfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIGZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBzY2FuX21hY190YWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19zY2FuX21hY190YWJsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBzY2FuX21hY190YWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdyA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIkZsb3cgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5LCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9wb25fbmksICZwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9mbG93X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIkZsb3cgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX2RzX2VncmVzc19mbG93IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2dlbV9wb3J0ID0geyAubmFtZSA9ICJnZW1fcG9ydCIsIC5kZXNjciA9ICJHRU0gcG9ydCBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEsIGdlbV9wb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19wYml0X2NvbnRyb2wgPSB7IC5uYW1lID0gInBiaXRfY29udHJvbCIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCB0aGUgUGJpdHMgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUgbWFwcGluZyBWTEFOIHRhZyAoSW5uZXIvT3V0ZXIpIFZMQU4gUGJpdHMgbG9jYXRpb24gYW5kIGFkZGVkIHRvIHRoZSBjb25maWd1cmVkIEdFTSBwb3J0IElEIHZhbHVlIHRvIGNyZWF0ZSB0aGUgRmluYWwgR0VNIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEsIHBiaXRfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19nZW1fcG9ydCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3BiaXRfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ2VtX3BvcnQiLCAuZGVzY3IgPSAiR0VNIHBvcnQgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhLCBnZW1fcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJwYml0X2NvbnRyb2wiLCAuZGVzY3IgPSAiSWYgZW5hYmxlZCwgdGhlIFBiaXRzIHZhbHVlIGlzIHRha2VuIGZyb20gdGhlIG1hcHBpbmcgVkxBTiB0YWcgKElubmVyL091dGVyKSBWTEFOIFBiaXRzIGxvY2F0aW9uIGFuZCBhZGRlZCB0byB0aGUgY29uZmlndXJlZCBHRU0gcG9ydCBJRCB2YWx1ZSB0byBjcmVhdGUgdGhlIEZpbmFsIEdFTSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEsIHBiaXRfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3cgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3ZsYW5faWQgPSB7IC5uYW1lID0gInZsYW5faWQiLCAuZGVzY3IgPSAidmxhbiBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSwgdmxhbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9wb25fbmksICZwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfdmxhbl9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ2bGFuX2lkIiwgLmRlc2NyID0gInZsYW4gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXksIHZsYW5faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfbWFwcGluZ19tZXRob2QgPSB7IC5uYW1lID0gIm1hcHBpbmdfbWV0aG9kIiwgLmRlc2NyID0gIlRoZSBNYXBwaW5nIG1ldGhvZCBkZWZpbmVzIGhvdyB0aGUgZmxvdyBJRCB3aWxsIGJlIGRldGVybWluZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEsIG1hcHBpbmdfbWV0aG9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19tYXBwaW5nX3RhZyA9IHsgLm5hbWUgPSAibWFwcGluZ190YWciLCAuZGVzY3IgPSAiRGVmaW5lIGlmIHRoZSBvdXRlciBvciB0aGUgaW5uZXIgVkxBTiB0YWcgb2YgdGhlIHBhY2tldCB3aWxsIGRldGVybWluZSB0aGUgZmxvdyBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgbWFwcGluZ190YWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX3ZsYW5fYWN0aW9uID0geyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC5kZXNjciA9ICJEZWZpbmUgdGhlIG91dGVyIFZMQU4gdGFnIG1hbmlwdWxhdGlvbiBvbiB0aGUgcGFja2V0OiB0cmFuc3BhcmVudCBvciByZW1vdmUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEsIHZsYW5fYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZHNfdmxhbl9hY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19tYXBwaW5nX21ldGhvZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19tYXBwaW5nX3RhZywgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ192bGFuX2FjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1hcHBpbmdfbWV0aG9kIiwgLmRlc2NyID0gIlRoZSBNYXBwaW5nIG1ldGhvZCBkZWZpbmVzIGhvdyB0aGUgZmxvdyBJRCB3aWxsIGJlIGRldGVybWluZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgbWFwcGluZ19tZXRob2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgfSwgeyAubmFtZSA9ICJtYXBwaW5nX3RhZyIsIC5kZXNjciA9ICJEZWZpbmUgaWYgdGhlIG91dGVyIG9yIHRoZSBpbm5lciBWTEFOIHRhZyBvZiB0aGUgcGFja2V0IHdpbGwgZGV0ZXJtaW5lIHRoZSBmbG93IElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEsIG1hcHBpbmdfdGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIH0sIHsgLm5hbWUgPSAidmxhbl9hY3Rpb24iLCAuZGVzY3IgPSAiRGVmaW5lIHRoZSBvdXRlciBWTEFOIHRhZyBtYW5pcHVsYXRpb24gb24gdGhlIHBhY2tldDogdHJhbnNwYXJlbnQgb3IgcmVtb3ZlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEsIHZsYW5fYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZHNfdmxhbl9hY3Rpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25faXdmX21hY190YWJsZSA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX2l3Zl9tYWNfdGFibGUgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJNQUMgYWRkcmVzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9rZXlfdmxhbiA9IHsgLm5hbWUgPSAidmxhbiIsIC5kZXNjciA9ICJWTEFOIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5LCB2bGFuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9tYWNfYWRkcmVzcywgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV92bGFuIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1BQyBhZGRyZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5LCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJ2bGFuIiwgLmRlc2NyID0gIlZMQU4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIHZsYW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBhc3NpZ25lZCB0byB0cmFmZmljIHRoYXQgbWF0Y2hlcyB0aGlzIE1BQyB0YWJsZSBlbnRyeS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdGhlIE1BQyBlbnRyeSBpcyBzdGF0aWMuICBTdGF0aWMgZW50cmllcyBkb24ndCBhZ2UuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgSUQgb2YgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgYXBwbGllcyB0byBhdXRvbWF0aWNhbGx5LWxlYXJuZWQgZW50cmllcy4gIE1hbnVhbGx5LWFkZGVkIGVudHJpZXMgd2lsbCBoYXZlIHRoZSB2YWx1ZSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiVGhlIE9OVSBJRCBmb3IgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgdmFsaWQgaWYgZ2VtX3BvcnRfaWQgaXMgdmFsaWQuICBPdGhlcndpc2UgdGhpcyB3aWxsIGJlIHNldCB0byBCQ01PTFRfR1BPTl9PTlVfSURfSU5WQUxJRC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19mbG93X2lkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX3N0YXQsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfZ2VtX3BvcnRfaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfb251X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBhc3NpZ25lZCB0byB0cmFmZmljIHRoYXQgbWF0Y2hlcyB0aGlzIE1BQyB0YWJsZSBlbnRyeS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRoZSBNQUMgZW50cnkgaXMgc3RhdGljLiAgU3RhdGljIGVudHJpZXMgZG9uJ3QgYWdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIEdFTSBwb3J0IElEIG9mIHRoZSB0cmFmZmljIHRoYXQgY3JlYXRlZCB0aGlzIHRhYmxlIGVudHJ5LiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gYXV0b21hdGljYWxseS1sZWFybmVkIGVudHJpZXMuICBNYW51YWxseS1hZGRlZCBlbnRyaWVzIHdpbGwgaGF2ZSB0aGUgdmFsdWUgQkNNT0xUX1BPTl9HRU1fUE9SVF9JRF9JTlZBTElELiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiVGhlIE9OVSBJRCBmb3IgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgdmFsaWQgaWYgZ2VtX3BvcnRfaWQgaXMgdmFsaWQuICBPdGhlcndpc2UgdGhpcyB3aWxsIGJlIHNldCB0byBCQ01PTFRfR1BPTl9PTlVfSURfSU5WQUxJRC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfbWFjX3RhYmxlIC0gbmV3X21hYyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2Zsb3dfaWQgPSB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIGZsb3cgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgZW50cnkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2Zsb3dfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBlbnRyeS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEsIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgbmV3IE1BQyBhZGRyZXNzIC8gVklEIGNvbWJpbmF0aW9uIGlzIHNlZW4gaW4gdGhlIHVwc3RyZWFtIHRyYWZmaWMgc3RyZWFtLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3Zl9tYWNfdGFibGUgLSBtYWNfYWdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX2l3Zl9tYWNfdGFibGUgLSBtYWNfbW92ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9vbGRfZmxvd19pZCA9IHsgLm5hbWUgPSAib2xkX2Zsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIGZsb3cgSUQgaW4gdGhlIGN1cnJlbnQgTUFDIHRhYmxlIGVudHJ5LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfT0xEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEsIG9sZF9mbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9uZXdfZmxvd19pZCA9IHsgLm5hbWUgPSAibmV3X2Zsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIGZsb3cgSUQgc2VlbiBpbiB0aGUgdHJhZmZpYyBzdHJlYW0uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9ORVdfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSwgbmV3X2Zsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX29sZF9mbG93X2lkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfbmV3X2Zsb3dfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9sZF9mbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIGluIHRoZSBjdXJyZW50IE1BQyB0YWJsZSBlbnRyeS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhLCBvbGRfZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJuZXdfZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBzZWVuIGluIHRoZSB0cmFmZmljIHN0cmVhbS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhLCBuZXdfZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiB0aGUgTUFDIHRhYmxlIGlzIGluIG1vdmUgbW9kZSBhbmQgYSBwYWNrZXQgaXMgc2VlbiB0aGF0IG1hdGNoZXMgb24gTUFDIGFkZHJlc3MgLyBWSUQgYnV0IGRvZXNuJ3QgbWF0Y2ggb24gZmxvdyBJRC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfbWFjX3RhYmxlIC0gbWFjX2Ryb3BwZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBvZiB0aGUgZW50cnkgdGhhdCB3YXMgZHJvcHBlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEsIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2Zsb3dfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIGZsb3cgSUQgb2YgdGhlIGVudHJ5IHRoYXQgd2FzIGRyb3BwZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhbiBlbnRyeSBjYW5ub3QgYmUgbGVhcm5lZCBzaW5jZSB0aGUgTUFDIHRhYmxlIGlzIGZ1bGwuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX21hY19hZ2VkID0geyAubmFtZSA9ICJtYWNfYWdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWFjX2FnZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhLCBtYWNfYWdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19tYWNfZHJvcHBlZCA9IHsgLm5hbWUgPSAibWFjX2Ryb3BwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1hY19kcm9wcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbWFjX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbWFjX21vdmUgPSB7IC5uYW1lID0gIm1hY19tb3ZlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtYWNfbW92ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG1hY19tb3ZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX25ld19tYWMgPSB7IC5uYW1lID0gIm5ld19tYWMiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm5ld19tYWNcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG5ld19tYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbWFjX2FnZWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19tYWNfZHJvcHBlZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX21hY19tb3ZlLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbmV3X21hYyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFjX2FnZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1hY19hZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbWFjX2FnZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtYWNfZHJvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWFjX2Ryb3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhLCBtYWNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1hY19tb3ZlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtYWNfbW92ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG1hY19tb3ZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibmV3X21hYyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibmV3X21hY1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG5ld19tYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncG9uX2l3Zl91c19mbG93ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25faXdmX3VzX2Zsb3cgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2tleV9nZW1fcG9ydF9pZCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX0dFTV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5LCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl91c19mbG93X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfZ2VtX3BvcnRfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJHRU0gUG9ydCAgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5LCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3Zl91c19mbG93IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJGbG93IElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ19tYWNfbGVhcm5pbmcgPSB7IC5uYW1lID0gIm1hY19sZWFybmluZyIsIC5kZXNjciA9ICJNQUMgbGVhcm5pbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfTUFDX0xFQVJOSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIG1hY19sZWFybmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX3ZsYW5fYWN0aW9uID0geyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC5kZXNjciA9ICJWTEFOIGFjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCB2bGFuX2FjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfdmxhbl90YWcgPSB7IC5uYW1lID0gInZsYW5fdGFnIiwgLmRlc2NyID0gIlZsYW4gdGFnIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fVEFHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIHZsYW5fdGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdmxhbl90YWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ190cGlkX2luZGV4ID0geyAubmFtZSA9ICJ0cGlkX2luZGV4IiwgLmRlc2NyID0gIlRQSUQgaW5kZXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCB0cGlkX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ19mbG93X2lkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ19tYWNfbGVhcm5pbmcsICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX3ZsYW5fYWN0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ192bGFuX3RhZywgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfdHBpZF9pbmRleCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIkZsb3cgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWFjX2xlYXJuaW5nIiwgLmRlc2NyID0gIk1BQyBsZWFybmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgbWFjX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidmxhbl9hY3Rpb24iLCAuZGVzY3IgPSAiVkxBTiBhY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIHZsYW5fYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXNfdmxhbl9hY3Rpb24gfSwgeyAubmFtZSA9ICJ2bGFuX3RhZyIsIC5kZXNjciA9ICJWbGFuIHRhZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgdmxhbl90YWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RhZyB9LCB7IC5uYW1lID0gInRwaWRfaW5kZXgiLCAuZGVzY3IgPSAiVFBJRCBpbmRleCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgdHBpZF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncG9uX25pID09PT0gKi8KKworLyogR3JvdXA6IGdwb25fbmkgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb25fc3RhdHVzID0geyAubmFtZSA9ICJwb25fc3RhdHVzIiwgLmRlc2NyID0gIlBPTiBzdGF0dXMgcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG9uX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hdmFpbGFibGVfYmFuZHdpZHRoID0geyAubmFtZSA9ICJhdmFpbGFibGVfYmFuZHdpZHRoIiwgLmRlc2NyID0gIlBPTiBhdmFpbGFibGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGF2YWlsYWJsZV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX251bWJlcl9vZl9hY3RpdmVfb251cyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhY3RpdmUgT05VcyBvbiB0aGUgUE9OIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG51bWJlcl9vZl9hY3RpdmVfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGFjdGl2ZSBzdGFuZGJ5IG9udXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb25fZGlzdGFuY2UgPSB7IC5uYW1lID0gInBvbl9kaXN0YW5jZSIsIC5kZXNjciA9ICJQT04gZGlzdGFuY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBvbl9kaXN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kaXN0YW5jZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Jhbmdpbmdfd2luZG93X3NpemUgPSB7IC5uYW1lID0gInJhbmdpbmdfd2luZG93X3NpemUiLCAuZGVzY3IgPSAiUmFuZ2luZyB3aW5kb3cgc2l6ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcmFuZ2luZ193aW5kb3dfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkgPSB7IC5uYW1lID0gInByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSIsIC5kZXNjciA9ICJPTlUgcHJlLWFzc2lnbmVkIGVxdWFsaXphdGlvbiBkZWxheSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2VxZF9jeWNsZXNfbnVtYmVyID0geyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC5kZXNjciA9ICJIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBlcWRfY3ljbGVzX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb3dlcl9sZXZlbCA9IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAuZGVzY3IgPSAiT05VIHBvd2VyIGxldmVsIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTEVWRUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcG93ZXJfbGV2ZWwgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kc19mZWNfbW9kZSA9IHsgLm5hbWUgPSAiZHNfZmVjX21vZGUiLCAuZGVzY3IgPSAiRFMgRkVDIG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZHNfZmVjX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZHJpZnRfY29udHJvbCA9IHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC5kZXNjciA9ICJEcmlmdCBjb250cm9sIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRyaWZ0X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZHJpZnRfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiRFMgQkVSIHJlcG9ydGluZyBpbnRlcnZhbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbG9zX2FsYXJtX3RocmVzaG9sZCA9IHsgLm5hbWUgPSAibG9zX2FsYXJtX3RocmVzaG9sZCIsIC5kZXNjciA9ICJMT1MgYWxhcm0gdGhyZXNob2xkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbG9zX2FsYXJtX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2xvc19pbml0aWFsX3ZhbHVlID0geyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC5kZXNjciA9ICJMT1MgaW5pdGlhbCB2YWx1ZSBmb2xsb3dpbmcgUE9OIGFjdGl2YXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbG9zX2luaXRpYWxfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19vbnVfYWxhcm1zX3RocmVzaG9sZHMgPSB7IC5uYW1lID0gIm9udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgb251X2FsYXJtc190aHJlc2hvbGRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19iZXJfbW9uaXRvciA9IHsgLm5hbWUgPSAiYmVyX21vbml0b3IiLCAuZGVzY3IgPSAiQkVSIG1vbml0b3IgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGJlcl9tb25pdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcGxvYW1fYWNrX3RpbWVvdXQgPSB7IC5uYW1lID0gInBsb2FtX2Fja190aW1lb3V0IiwgLmRlc2NyID0gIlRpbWVvdXQgZm9yIHJlY2VpdmluZyBBQ0sgcGxvYW0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcGxvYW1fYWNrX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfb251X2FjdGl2YXRpb24gPSB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uIiwgLmRlc2NyID0gIk9OVSBhY3RpdmF0aW9uIGNvbnRyb2wgcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19zbl9hY3F1aXNpdGlvbiA9IHsgLm5hbWUgPSAic25fYWNxdWlzaXRpb24iLCAuZGVzY3IgPSAiU2VyaWFsIE51bWJlciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgc25fYWNxdWlzaXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfa2V5X2V4Y2hhbmdlID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwga2V5X2V4Y2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZyA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgPSB7IC5uYW1lID0gImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2Nicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlID0geyAubmFtZSA9ICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgbm9uIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kYmEgPSB7IC5uYW1lID0gImRiYSIsIC5kZXNjciA9ICJEQkEgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZGJhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RiYSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvd2VyX21hbmFnZW1lbnQgPSB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnQiLCAuZGVzY3IgPSAiT05VIHBvd2VyIG1hbmFnZW1lbnQgY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzID0geyAubmFtZSA9ICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MiLCAuZGVzY3IgPSAiUm9ndWUgT05VIGRldGVjdGlvbiBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgPSB7IC5uYW1lID0gInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciLCAuZGVzY3IgPSAiUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmJzX2dlbmVyYXRvciA9IHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX21pbl9kYXRhX2FsbG9jX2lkID0geyAubmFtZSA9ICJtaW5fZGF0YV9hbGxvY19pZCIsIC5kZXNjciA9ICJNaW4gZGF0YSBBbGxvYyBJRCB2YWx1ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9hbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiA9IHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAuZGVzY3IgPSAiT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ191c19iYW5kd2lkdGhfbGltaXQgPSB7IC5uYW1lID0gInVzX2JhbmR3aWR0aF9saW1pdCIsIC5kZXNjciA9ICJUb3RhbCBQT04gdXBzdHJlYW0gYmFuZHdpZHRoIGxpbWl0IGluIGJ5dGVzIHBlciBzZWNvbmQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCB1c19iYW5kd2lkdGhfbGltaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYWxsX29udXMgPSB7IC5uYW1lID0gImFsbF9vbnVzIiwgLmRlc2NyID0gIkFsbCBPTlVzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfT05VUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBhbGxfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2FsbF9tY2FzdF9nZW1fcG9ydHMgPSB7IC5uYW1lID0gImFsbF9tY2FzdF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIG11bHRpY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYWxsX21jYXN0X2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZGVidWcgPSB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gIlBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcyA9IHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIk9OVSB1cGdyYWRlIHBhcmFtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgb251X3VwZ3JhZGVfcGFyYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0ID0geyAubmFtZSA9ICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0IiwgLmRlc2NyID0gIlBTIHR5cGUgQyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QU19DX1dBSVRfQkVGT1JFX0RFQUNUSVZBVElPTl9USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sID0geyAubmFtZSA9ICJiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wiLCAuZGVzY3IgPSAiT3B0aW9uIHRvIGRpc2FibGUgdGhlIGJpcDMyIGluZGljYXRpb24gd2hlbiB0aGUgdmFsdWUgaXMgemVybyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcG9uX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYXZhaWxhYmxlX2JhbmR3aWR0aCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbnVtYmVyX29mX2FjdGl2ZV9vbnVzLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcHJic19zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvbl9kaXN0YW5jZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcmFuZ2luZ193aW5kb3dfc2l6ZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5LCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19lcWRfY3ljbGVzX251bWJlciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcG93ZXJfbGV2ZWwsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RzX2ZlY19tb2RlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kcmlmdF9jb250cm9sLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19sb3NfYWxhcm1fdGhyZXNob2xkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19sb3NfaW5pdGlhbF92YWx1ZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfb251X2FsYXJtc190aHJlc2hvbGRzLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19iZXJfbW9uaXRvciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcGxvYW1fYWNrX3RpbWVvdXQsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX29udV9hY3RpdmF0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19zbl9hY3F1aXNpdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfa2V5X2V4Y2hhbmdlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RiYSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcG93ZXJfbWFuYWdlbWVudCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmJzX2NoZWNrZXIsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByYnNfZ2VuZXJhdG9yLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19taW5fZGF0YV9hbGxvY19pZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3VzX2JhbmR3aWR0aF9saW1pdCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYWxsX29udXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2FsbF9tY2FzdF9nZW1fcG9ydHMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RlYnVnLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19vbnVfdXBncmFkZV9wYXJhbXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3BzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2JpcDMyX2luZGljYXRpb25fY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdHVzIiwgLmRlc2NyID0gIlBPTiBzdGF0dXMgcGFyYW1ldGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG9uX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0dXMgfSwgeyAubmFtZSA9ICJhdmFpbGFibGVfYmFuZHdpZHRoIiwgLmRlc2NyID0gIlBPTiBhdmFpbGFibGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGF2YWlsYWJsZV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9hY3RpdmVfb251cyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYWN0aXZlIE9OVXMgb24gdGhlIFBPTiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzIiwgLmRlc2NyID0gIm51bWJlciBvZiBhY3RpdmUgc3RhbmRieSBvbnVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH0sIHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLmRlc2NyID0gIlBPTiBkaXN0YW5jZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG9uX2Rpc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlIH0sIHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIHdpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCByYW5naW5nX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSIsIC5kZXNjciA9ICJPTlUgcHJlLWFzc2lnbmVkIGVxdWFsaXphdGlvbiBkZWxheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImVxZF9jeWNsZXNfbnVtYmVyIiwgLmRlc2NyID0gIkhvdyBtYW55IHJhbmdpbmcgd2luZG93cyBhcmUgb3BlbmVkIGR1cmluZyBhIHNpbmdsZSBPTlUgYWN0aXZhdGlvbiBwcm9jZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBlcWRfY3ljbGVzX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbGV2ZWwgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcG93ZXJfbGV2ZWwgfSwgeyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC5kZXNjciA9ICJEUyBGRUMgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZHNfZmVjX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC5kZXNjciA9ICJEcmlmdCBjb250cm9sIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZHJpZnRfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIH0sIHsgLm5hbWUgPSAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIsIC5kZXNjciA9ICJEUyBCRVIgcmVwb3J0aW5nIGludGVydmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxvc19hbGFybV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiTE9TIGFsYXJtIHRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbG9zX2FsYXJtX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxvc19pbml0aWFsX3ZhbHVlIiwgLmRlc2NyID0gIkxPUyBpbml0aWFsIHZhbHVlIGZvbGxvd2luZyBQT04gYWN0aXZhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbG9zX2luaXRpYWxfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAuZGVzY3IgPSAiT05VIGFsYXJtcyB0aHJlc2hvbGRzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG9udV9hbGFybXNfdGhyZXNob2xkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzIH0sIHsgLm5hbWUgPSAiYmVyX21vbml0b3IiLCAuZGVzY3IgPSAiQkVSIG1vbml0b3IgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBiZXJfbW9uaXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB9LCB7IC5uYW1lID0gInBsb2FtX2Fja190aW1lb3V0IiwgLmRlc2NyID0gIlRpbWVvdXQgZm9yIHJlY2VpdmluZyBBQ0sgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBsb2FtX2Fja190aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uIiwgLmRlc2NyID0gIk9OVSBhY3RpdmF0aW9uIGNvbnRyb2wgcGFyYW1ldGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgb251X2FjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIH0sIHsgLm5hbWUgPSAic25fYWNxdWlzaXRpb24iLCAuZGVzY3IgPSAiU2VyaWFsIE51bWJlciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHNuX2FjcXVpc2l0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIH0sIHsgLm5hbWUgPSAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgfSwgeyAubmFtZSA9ICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgbm9uIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yIH0sIHsgLm5hbWUgPSAiZGJhIiwgLmRlc2NyID0gIkRCQSBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkYmEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC5kZXNjciA9ICJSb2d1ZSBPTlUgZGV0ZWN0aW9uIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIH0sIHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC5kZXNjciA9ICJQZXJpb2RpYyBTdGFuZGJ5IFBPTiBtb25pdG9yaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfYWxsb2NfaWQiLCAuZGVzY3IgPSAiTWluIGRhdGEgQWxsb2MgSUQgdmFsdWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG1pbl9kYXRhX2FsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIiwgLmRlc2NyID0gIk9wdGlvbiB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgZGVhY3RpdmF0aW9uIG9mIE9OVXMgZHVlIHRvIGFsYXJtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB9LCB7IC5uYW1lID0gInVzX2JhbmR3aWR0aF9saW1pdCIsIC5kZXNjciA9ICJUb3RhbCBQT04gdXBzdHJlYW0gYmFuZHdpZHRoIGxpbWl0IGluIGJ5dGVzIHBlciBzZWNvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCB1c19iYW5kd2lkdGhfbGltaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxsX29udXMiLCAuZGVzY3IgPSAiQWxsIE9OVXMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYWxsX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggfSwgeyAubmFtZSA9ICJhbGxfbWNhc3RfZ2VtX3BvcnRzIiwgLmRlc2NyID0gIkFsbCBtdWx0aWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGFsbF9tY2FzdF9nZW1fcG9ydHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB9LCB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gIlBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWcgfSwgeyAubmFtZSA9ICJvbnVfdXBncmFkZV9wYXJhbXMiLCAuZGVzY3IgPSAiT05VIHVwZ3JhZGUgcGFyYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9wYXJhbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB9LCB7IC5uYW1lID0gInBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQiLCAuZGVzY3IgPSAiUFMgdHlwZSBDIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImJpcDMyX2luZGljYXRpb25fY29udHJvbCIsIC5kZXNjciA9ICJPcHRpb24gdG8gZGlzYWJsZSB0aGUgYmlwMzIgaW5kaWNhdGlvbiB3aGVuIHRoZSB2YWx1ZSBpcyB6ZXJvIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2ZlY19jb2Rld29yZHMgPSB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgRkVDIGNvZGV3b3JkcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBGRUMgY29kZXdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9iaXA4X2J5dGVzID0geyAubmFtZSA9ICJiaXA4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXA4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCBiaXA4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9iaXA4X2Vycm9ycyA9IHsgLm5hbWUgPSAiYmlwOF9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYmlwOCBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfRVJST1JTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCBiaXA4X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX3BhY2tldHMgPSB7IC5uYW1lID0gInJ4X2dlbV9wYWNrZXRzIiwgLmRlc2NyID0gIlJlY2VpdmVkIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1fcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX2Ryb3BwZWQgPSB7IC5uYW1lID0gInJ4X2dlbV9kcm9wcGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgR0VNIElEIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1fZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX2lkbGUgPSB7IC5uYW1lID0gInJ4X2dlbV9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIGlkbGUgR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fY29ycmVjdGVkID0geyAubmFtZSA9ICJyeF9nZW1fY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGNvcnJlY3RlZCBHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1fY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1faWxsZWdhbCA9IHsgLm5hbWUgPSAicnhfZ2VtX2lsbGVnYWwiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWxsZWdhbCBHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2lsbGVnYWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX3ZhbGlkID0geyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBhbGxvY2F0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc19pbnZhbGlkID0geyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGludmFsaWQgYWxsb2NhdGlvbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2Rpc2FibGVkID0geyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkaXNhYmxlZCBhbGxvY2F0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXMgPSB7IC5uYW1lID0gInJ4X3Bsb2FtcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXNfbm9uX2lkbGUgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC5kZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBlcnJvciBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXNfZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfY3B1ID0geyAubmFtZSA9ICJyeF9jcHUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9vbWNpID0geyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9kcm9wcGVkX3Rvb19zaG9ydCA9IHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fc2hvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX2xvbmcgPSB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fbG9uZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfY3JjX2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfY3JjX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gY3JjIGVycm9yIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9jcmNfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9rZXlfZXJyb3JzID0geyAubmFtZSA9ICJyeF9rZXlfZXJyb3JzIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBrZXkgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2tleV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2ZyYWdtZW50c19lcnJvcnMgPSB7IC5uYW1lID0gInJ4X2ZyYWdtZW50c19lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGZyYWdtZW50YXRpb24gZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2ZyYWdtZW50c19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3BhY2tldHNfZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9nZW0gPSB7IC5uYW1lID0gInR4X2dlbSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2dlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfcGxvYW1zID0geyAubmFtZSA9ICJ0eF9wbG9hbXMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgUGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfZ2VtX2ZyYWdtZW50cyA9IHsgLm5hbWUgPSAidHhfZ2VtX2ZyYWdtZW50cyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhZ21lbnRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9nZW1fZnJhZ21lbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9jcHUgPSB7IC5uYW1lID0gInR4X2NwdSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X29tY2kgPSB7IC5uYW1lID0gInR4X29tY2kiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgT01DSSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQgPSB7IC5uYW1lID0gInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoID0geyAubmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfZHJvcHBlZF90cGlkX21pc3MgPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdHBpZF9taXNzIiwgLmRlc2NyID0gIkRyb3BwZWQgYmVjYXVzZSBvZiBUUElEIG1pc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfZHJvcHBlZF92aWRfbWlzcyA9IHsgLm5hbWUgPSAidHhfZHJvcHBlZF92aWRfbWlzcyIsIC5kZXNjciA9ICJEcm9wcGVkIGJlY2F1c2Ugb2YgVklEIG1pc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdmlkX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2ZlY19jb2Rld29yZHMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9mZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfYmlwOF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2JpcDhfZXJyb3JzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX3BhY2tldHMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fZHJvcHBlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9pZGxlLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX2NvcnJlY3RlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9pbGxlZ2FsLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfdmFsaWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc19pbnZhbGlkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXNfbm9uX2lkbGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXNfZXJyb3IsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wbG9hbXNfZHJvcHBlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2NwdSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X29tY2ksICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fc2hvcnQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9kcm9wcGVkX3Rvb19sb25nLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfY3JjX2Vycm9ycywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2tleV9lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9mcmFnbWVudHNfZXJyb3JzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfcGFja2V0c19kcm9wcGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfZ2VtLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfcGxvYW1zLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfZ2VtX2ZyYWdtZW50cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2NwdSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X29tY2ksICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfZHJvcHBlZF90cGlkX21pc3MsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX3ZpZF9taXNzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlJlY2VpdmVkIEZFQyBjb2Rld29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdW5jb3JyZWN0ZWQgRkVDIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwOF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyBwcm90ZWN0ZWQgYnkgYmlwOCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwOF9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYmlwOCBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCBiaXA4X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9nZW1fcGFja2V0cyIsIC5kZXNjciA9ICJSZWNlaXZlZCBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZ2VtX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBHRU0gSUQgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2dlbV9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIGlkbGUgR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2dlbV9jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1fY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2dlbV9pbGxlZ2FsIiwgLmRlc2NyID0gIlJlY2VpdmVkIGlsbGVnYWwgR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9pbGxlZ2FsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX3ZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIGFsbG9jYXRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkaXNhYmxlZCBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3Bsb2FtcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBQbG9hbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZXJyb3IgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19kcm9wcGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfY3B1IiwgLmRlc2NyID0gIlJlY2VpdmVkIENQVSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX3Nob3J0IiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBzaG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfY3JjX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gY3JjIGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfY3JjX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9rZXlfZXJyb3JzIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBrZXkgZXJyb3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9rZXlfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYWdtZW50c19lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGZyYWdtZW50YXRpb24gZXJyb3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9mcmFnbWVudHNfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHNfZHJvcHBlZCIsIC5kZXNjciA9ICJHbG9iYWwgZHJvcHBlZCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2dlbSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZ2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3Bsb2FtcyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBQbG9hbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZ2VtX2ZyYWdtZW50cyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhZ21lbnRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZ2VtX2ZyYWdtZW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9jcHUiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgQ1BVIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfb21jaSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdHBpZF9taXNzIiwgLmRlc2NyID0gIkRyb3BwZWQgYmVjYXVzZSBvZiBUUElEIG1pc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLmRlc2NyID0gIkRyb3BwZWQgYmVjYXVzZSBvZiBWSUQgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdmlkX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzZXRfcG9uX3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Bvbl9zdGF0ZSA9IHsgLm5hbWUgPSAicG9uX3N0YXRlIiwgLmRlc2NyID0gIlBPTiBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhLCBwb25fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX3N0YXRlIiwgLmRlc2NyID0gIlBPTiBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEsIHBvbl9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldCBQT04gU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHJlc2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9yZXNldF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gZGlzYWJsZV9zZXJpYWxfbnVtYmVyICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCA9IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wsICZwcm9wX2Rlc2NyX2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEiLCAuZGVzY3IgPSAiRGlzYWJsZSBTZXJpYWwgTnVtYmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzZXRfb251X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSA9IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuICBUaGUgZGVmYXVsdCBvcGVyYXRpb24gbWF5IGJlIGNvbmZpZ3VyZWQgYnkgdGhlIEdQT04gTkkgY29uZmlndXJhdGlvbiBvYmplY3QgOiBncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc2V0X29udV9zdGF0ZV9vbnVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBHUE9OIE5JIGNvbmZpZ3VyYXRpb24gb2JqZWN0IDogZ3Bvbl9uaS5jZmcuc25fYWNxdWlzaXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0IHRoZSBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJldmlvdXNfc3RhdGUgPSB7IC5uYW1lID0gInByZXZpb3VzX3N0YXRlIiwgLmRlc2NyID0gIlByZXZpb3VzIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgcHJldmlvdXNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfbmV3X3N0YXRlID0geyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9yZXN1bHQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcmV2aW91c19zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gInByZXZpb3VzX3N0YXRlIiwgLmRlc2NyID0gIlByZXZpb3VzIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgcHJldmlvdXNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBsb3MgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2xvc19zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9MT1NfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfbG9zX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9sb3Nfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2xvc19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2xvc19kYXRhIiwgLmRlc2NyID0gIkxPUyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvc19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfbG9zX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfb251cyA9IHsgLm5hbWUgPSAib251cyIsIC5kZXNjciA9ICJPTlVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEsIG9udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9vbnVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251cyIsIC5kZXNjciA9ICJPTlVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEsIG9udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEiLCAuZGVzY3IgPSAiQWZ0ZXIgYSBzd2l0Y2hvdmVyIGlzIGNvbXBsZXRlIGFuZCBhbGwgT05VIHJhbmdpbmcgdGltZXMgaGF2ZSBzdGFiaWxpemVkLCB0aGlzIGluZGljYXRpb24gaXMgc2VudCB0byBpbmZvcm0gdGhlIGhvc3Qgb2YgYWxsIG5ldyBPTlUgRVFEcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX251bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9ERVRFQ1RFRF9ERUxJTUlURVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhLCBudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZW5lcmd5X2RldGVjdF9zaWduYWwgPSB7IC5uYW1lID0gImVuZXJneV9kZXRlY3Rfc2lnbmFsIiwgLmRlc2NyID0gImVuZXJneSBkZXRlY3Qgc2lnbmFsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhLCBlbmVyZ3lfZGV0ZWN0X3NpZ25hbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX251bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZW5lcmd5X2RldGVjdF9zaWduYWwgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyIiwgLmRlc2NyID0gIm51bWJlciBvZiBkZXRlY3RlZCBkZWxpbWl0ZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlbmVyZ3lfZGV0ZWN0X3NpZ25hbCIsIC5kZXNjciA9ICJlbmVyZ3kgZGV0ZWN0IHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhLCBlbmVyZ3lfZGV0ZWN0X3NpZ25hbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gb251X2Rpc2NvdmVyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX29udV9kaXNjb3ZlcmVkX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfcmFuZ2luZ190aW1lID0geyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAicmFuZ2luZyB0aW1lIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251X2lkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfb251X2Rpc2NvdmVyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX29udV9kaXNjb3ZlcmVkX3NlcmlhbF9udW1iZXIsICZwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfcmFuZ2luZ190aW1lLCAmcHJvcF9kZXNjcl9ncG9uX25pX29udV9kaXNjb3ZlcmVkX29udV9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJyYW5naW5nIHRpbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJvbnVfaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGlzY292ZXJlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gY3B1X3BhY2tldHNfZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9lcnJvciA9IHsgLm5hbWUgPSAiZXJyb3IiLCAuZGVzY3IgPSAiVGhlIGVycm9yIHRoYXQgd2FzIGVuY291bnRlcmVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGVycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9nZW1fcG9ydF9pZCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIEdFTSBwb3J0IHRoYXQgY2F1c2VkIHRoZSBlcnJvci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhLCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZXJyb3IsICZwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9nZW1fcG9ydF9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXJyb3IiLCAuZGVzY3IgPSAiVGhlIGVycm9yIHRoYXQgd2FzIGVuY291bnRlcmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGVycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBHRU0gcG9ydCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSIsIC5kZXNjciA9ICJBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgXCJjcHVfcGFja2V0c1wiIHByb3h5IG9wZXJhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGNwdV9wYWNrZXRzICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSA9IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX2NhbGNfY3JjID0geyAubmFtZSA9ICJjYWxjX2NyYyIsIC5kZXNjciA9ICJjYWxjIGNyYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgY2FsY19jcmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX2dlbV9wb3J0X2xpc3QgPSB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAuZGVzY3IgPSAiZ2VtIHBvcnQgbGlzdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBnZW1fcG9ydF9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfcGFja2V0X3R5cGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfY2FsY19jcmMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZ2VtX3BvcnRfbGlzdCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgY2FsY19jcmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9saXN0IiwgLmRlc2NyID0gImdlbSBwb3J0IGxpc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgZ2VtX3BvcnRfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSIsIC5kZXNjciA9ICJHUE9OIENQVSBQYWNrZXRzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBicm9hZGNhc3RfcGxvYW1fcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Bsb2FtID0geyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Bsb2FtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJCcm9hZGNhc3QgUExPQU0gUGFja2V0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSByb2d1ZV9kZXRlY3Rpb25fd2luZG93ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3dpbmRvd190eXBlID0geyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHNpbGVudCBtZWFzdXJlbWVudCB0byBleGVjdXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgd2luZG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2FsbG9jX2lkID0geyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBTExPQyBJRCB0byBzY2FuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0byBzY2FuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0geyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAuZGVzY3IgPSAiTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgc2Vjb25kX3Jhbmdpbmdfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3dpbmRvd190eXBlLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfYWxsb2NfaWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19vbnVfaWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zZWNvbmRfcmFuZ2luZ193aW5kb3cgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBTExPQyBJRCB0byBzY2FuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0byBzY2FuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInNlY29uZF9yYW5naW5nX3dpbmRvdyIsIC5kZXNjciA9ICJOb3QgY3VycmVudGx5IHN1cHBvcnRlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHNlY29uZF9yYW5naW5nX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEiLCAuZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIFdpbmRvdyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF93aW5kb3dfdHlwZSA9IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9tZWFzdXJlbWVudF9zdGF0dXMgPSB7IC5uYW1lID0gIm1lYXN1cmVtZW50X3N0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMgb2YgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcmVzdWx0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBtZWFzdXJlbWVudF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVS1JRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lzX2RlbGluZWF0aW9uID0geyAubmFtZSA9ICJpc19kZWxpbmVhdGlvbiIsIC5kZXNjciA9ICJCdXJzdCBEZWxpbmVhdGlvbiBkZXRlY3RlZCBkdXJpbmcgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgaXNfZGVsaW5lYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZWQgPSB7IC5uYW1lID0gImlzX2VkIiwgLmRlc2NyID0gIklzIEVEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgaXNfZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcnhfZGF0YSA9IHsgLm5hbWUgPSAicnhfZGF0YSIsIC5kZXNjciA9ICJDYXB0dXJlZCBQTE9BTXUgbWVzc2FnZSBpZiB0aGUgYnVyc3QgZGVsaW5pZWF0aW9uIHdhcyBkZXRlY3RlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHJ4X2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPSB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX29udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX29udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yID0geyAubmFtZSA9ICJwbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IiLCAuZGVzY3IgPSAiQ3JjIGVycm9yIGluIHRoZSByZWNlaXZlZCBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBwbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfd2luZG93X3R5cGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9tZWFzdXJlbWVudF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9hbGxvY19pZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX29udV9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lzX2RlbGluZWF0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9yeF9kYXRhLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfb251X2lkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC5kZXNjciA9ICJTaWxlbnQgV2luZG93IG9yIEN1dCBvZmYgV2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgd2luZG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IH0sIHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgbWVhc3VyZW1lbnRfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VLUlEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImlzX2RlbGluZWF0aW9uIiwgLmRlc2NyID0gIkJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19kZWxpbmVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImlzX2VkIiwgLmRlc2NyID0gIklzIEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgaXNfZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyeF9kYXRhIiwgLmRlc2NyID0gIkNhcHR1cmVkIFBMT0FNdSBtZXNzYWdlIGlmIHRoZSBidXJzdCBkZWxpbmllYXRpb24gd2FzIGRldGVjdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHJ4X2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX29udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX2NyY19lcnJvciIsIC5kZXNjciA9ICJDcmMgZXJyb3IgaW4gdGhlIHJlY2VpdmVkIHBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSb2d1ZSBkZXRlY3Rpb24gY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHRvZF9yZXF1ZXN0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gdG9kX3JlcXVlc3RfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfdG9kX3N0cmluZyA9IHsgLm5hbWUgPSAidG9kX3N0cmluZyIsIC5kZXNjciA9ICJ0b2Rfc3RyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgdG9kX3N0cmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3NmYyA9IHsgLm5hbWUgPSAic2ZjIiwgLmRlc2NyID0gInNmYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgc2ZjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfc2VjID0geyAubmFtZSA9ICJydGNfb2Zmc2V0X3NlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X3NlYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X3NlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9ydGNfb2Zmc2V0X25zZWMgPSB7IC5uYW1lID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X25zZWMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfbnNlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfdG9kX3N0cmluZywgJnByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfc2ZjLCAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9ydGNfb2Zmc2V0X3NlYywgJnByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcnRjX29mZnNldF9uc2VjLCAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidG9kX3N0cmluZyIsIC5kZXNjciA9ICJ0b2Rfc3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCB0b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH0sIHsgLm5hbWUgPSAic2ZjIiwgLmRlc2NyID0gInNmYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgc2ZjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJ0Y19vZmZzZXRfc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfc2VjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X3NlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X25zZWMiLCAuZGVzY3IgPSAicnRjX29mZnNldF9uc2VjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X25zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiVE9EIHJlcXVlc3QgY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAib251IHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfb251X2xpc3QgPSB7IC5uYW1lID0gIm9udV9saXN0IiwgLmRlc2NyID0gIm9udSBsaXN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX0xJU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhLCBvbnVfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9vbnVfc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfb251X2xpc3QgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAib251IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUgfSwgeyAubmFtZSA9ICJvbnVfbGlzdCIsIC5kZXNjciA9ICJvbnUgbGlzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhLCBvbnVfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAicHJvdGVjdGlvbiBzd2l0Y2hpbmcgdHlwZSBjIHNldCBtdWx0aXBsZSBvbnUgc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXJ0X29udV91cGdyYWRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9saXN0X29mX29udV9pZHMgPSB7IC5uYW1lID0gImxpc3Rfb2Zfb251X2lkcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVSBJRHMgdG8gdXBncmFkZSB0aGUgZmlybXdhcmUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpc3Rfb2Zfb251X2lkcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVSBJRHMgdG8gdXBncmFkZSB0aGUgZmlybXdhcmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEsIGxpc3Rfb2Zfb251X2lkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEiLCAuZGVzY3IgPSAiT0xUIHRvIE9OVSBmaXJtd2FyZSB0cmFuc2ZlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gb251X3VwZ3JhZGVfY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzID0geyAubmFtZSA9ICJsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVS1JRHMgdGhlIHVwZ3JhZGUgZmFpbGVkIGZvci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVS1JRHMgdGhlIHVwZ3JhZGUgZmFpbGVkIGZvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSIsIC5kZXNjciA9ICJPTlUgVXBncmFkZSBDb21wbGV0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2NwdV9wYWNrZXRzX2ZhaWx1cmUgPSB7IC5uYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNwdV9wYWNrZXRzX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgY3B1X3BhY2tldHNfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkID0geyAubmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19lbmFibGVfYWxsX29udXNfY29tcGxldGVkID0geyAubmFtZSA9ICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlbmFibGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2xvcyA9IHsgLm5hbWUgPSAibG9zIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb3NcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBsb3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX29udV9kaXNjb3ZlcmVkID0geyAubmFtZSA9ICJvbnVfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19vbnVfdXBncmFkZV9jb21wbGV0ZSA9IHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV91cGdyYWRlX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgPSB7IC5uYW1lID0gInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkID0geyAubmFtZSA9ICJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdGVfY2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ190b2RfcmVxdWVzdF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidG9kX3JlcXVlc3RfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2NwdV9wYWNrZXRzX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19sb3MsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfb251X2Rpc2NvdmVyZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ190b2RfcmVxdWVzdF9jb21wbGV0ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjcHVfcGFja2V0c19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGNwdV9wYWNrZXRzX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlbmFibGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb3MiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxvc1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBsb3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X2Rpc2NvdmVyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X3VwZ3JhZGVfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X3VwZ3JhZGVfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInRvZF9yZXF1ZXN0X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fb251ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25fb251IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9wb25fbmksICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9vbnVfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBPTlUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJPTlUgc2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfcGFzc3dvcmQgPSB7IC5uYW1lID0gInBhc3N3b3JkIiwgLmRlc2NyID0gIk9OVSBwYXNzd29yZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUEFTU1dPUkQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHBhc3N3b3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2F1dG9fcGFzc3dvcmRfbGVhcm5pbmcgPSB7IC5uYW1lID0gImF1dG9fcGFzc3dvcmRfbGVhcm5pbmciLCAuZGVzY3IgPSAiRW5hYmxlXFxEaXNhYmxlIGF1dG9tYXRpYyBwYXNzd29yZCBsZWFybmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQVVUT19QQVNTV09SRF9MRUFSTklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYXV0b19wYXNzd29yZF9sZWFybmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ191c19mZWMgPSB7IC5uYW1lID0gInVzX2ZlYyIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgVVMgRkVDIGZvciBPTlUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgdXNfZmVjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX29tY2lfcG9ydF9pZCA9IHsgLm5hbWUgPSAib21jaV9wb3J0X2lkIiwgLmRlc2NyID0gIk9NQ0kgcG9ydCBJRCAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb21jaV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsID0geyAubmFtZSA9ICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIiwgLmRlc2NyID0gIkRTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2Flc19lbmNyeXB0aW9uX2tleSA9IHsgLm5hbWUgPSAiYWVzX2VuY3J5cHRpb25fa2V5IiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFlc19lbmNyeXB0aW9uX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlN0YXRlIG9mIGFsbCBPTlUgYWxhcm1zLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19yYW5naW5nX3RpbWUgPSB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJPTlUgcmFuZ2luZyB0aW1lLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHJhbmdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5ID0geyAubmFtZSA9ICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiLCAuZGVzY3IgPSAiVGhpcyBPTlUgd2FzIGRpc2FibGVkIGFmdGVyIFNOIGRpc2NvdmVyeSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kZWFjdGl2YXRpb25fcmVhc29uID0geyAubmFtZSA9ICJkZWFjdGl2YXRpb25fcmVhc29uIiwgLmRlc2NyID0gIlJlYXNvbiBmb3IgdGhlIGxhc3QgT05VIGRlYWN0aXZhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBkZWFjdGl2YXRpb25fcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19hbGxfZ2VtX3BvcnRzID0geyAubmFtZSA9ICJhbGxfZ2VtX3BvcnRzIiwgLmRlc2NyID0gIkFsbCB1bmljYXN0IEdFTSBwb3J0cyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9nZW1fcG9ydHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19hbGxfYWxsb2NzID0geyAubmFtZSA9ICJhbGxfYWxsb2NzIiwgLmRlc2NyID0gIkFsbCBhbGxvYyBJRHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhbGxfYWxsb2NzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbnVfcHNfdHlwZV9jID0geyAubmFtZSA9ICJvbnVfcHNfdHlwZV9jIiwgLmRlc2NyID0gIm9udSBwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9wc190eXBlX2MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfZXh0ZW5kZWRfZ3VhcmRfdGltZSA9IHsgLm5hbWUgPSAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgdGhpcyBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBleHRlbmRlZF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbnVfc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19zZXJpYWxfbnVtYmVyLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfcGFzc3dvcmQsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19hdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfdXNfZmVjLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfb21jaV9wb3J0X2lkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2Flc19lbmNyeXB0aW9uX2tleSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsYXJtX3N0YXRlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfcmFuZ2luZ190aW1lLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5LCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfZGVhY3RpdmF0aW9uX3JlYXNvbiwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsbF9nZW1fcG9ydHMsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19hbGxfYWxsb2NzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfb251X3BzX3R5cGVfYywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2V4dGVuZGVkX2d1YXJkX3RpbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IE9OVSBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAiT05VIHNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9LCB7IC5uYW1lID0gInBhc3N3b3JkIiwgLmRlc2NyID0gIk9OVSBwYXNzd29yZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHBhc3N3b3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwIH0sIHsgLm5hbWUgPSAiYXV0b19wYXNzd29yZF9sZWFybmluZyIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgYXV0b21hdGljIHBhc3N3b3JkIGxlYXJuaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYXV0b19wYXNzd29yZF9sZWFybmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInVzX2ZlYyIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgVVMgRkVDIGZvciBPTlUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCB1c19mZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbWNpX3BvcnRfaWQiLCAuZGVzY3IgPSAiT01DSSBwb3J0IElEICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIG9tY2lfcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIiwgLmRlc2NyID0gIkRTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFlc19lbmNyeXB0aW9uX2tleSIsIC5kZXNjciA9ICJBRVMgZW5jcnlwdGlvbiBrZXkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFlc19lbmNyeXB0aW9uX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSBvZiBhbGwgT05VIGFsYXJtcy4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgfSwgeyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAiT05VIHJhbmdpbmcgdGltZS4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHJhbmdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiLCAuZGVzY3IgPSAiVGhpcyBPTlUgd2FzIGRpc2FibGVkIGFmdGVyIFNOIGRpc2NvdmVyeSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGlvbl9yZWFzb24iLCAuZGVzY3IgPSAiUmVhc29uIGZvciB0aGUgbGFzdCBPTlUgZGVhY3RpdmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgZGVhY3RpdmF0aW9uX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gfSwgeyAubmFtZSA9ICJhbGxfZ2VtX3BvcnRzIiwgLmRlc2NyID0gIkFsbCB1bmljYXN0IEdFTSBwb3J0cyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWxsX2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IH0sIHsgLm5hbWUgPSAiYWxsX2FsbG9jcyIsIC5kZXNjciA9ICJBbGwgYWxsb2MgSURzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhbGxfYWxsb2NzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB9LCB7IC5uYW1lID0gIm9udV9wc190eXBlX2MiLCAuZGVzY3IgPSAib251IHByb3RlY3Rpb24gc3dpdGNoaW5nIHR5cGUgYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9wc190eXBlX2MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGZvciB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBleHRlbmRlZF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfZmVjX2NvZGV3b3JkcyA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJUb3RhbCByZWNlaXZlZCBGRUMgY29kZXdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfYnl0ZXNfY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfYnl0ZXNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBjb2Rld29yZHMgY29ycmVjdGVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0JZVEVTX0NPUlJFQ1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19ieXRlc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfY29kZXdvcmRzX2NvcnJlY3RlZCA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IgIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQgPSB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIG5vdCBjb3JyZWN0ZWQgY29kZXdvcmRzIGVycm9yIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9iaXA4X2J5dGVzID0geyAubmFtZSA9ICJiaXA4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIGZvciBCSVA4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGJpcDhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9iaXA4X2Vycm9ycyA9IHsgLm5hbWUgPSAiYmlwOF9lcnJvcnMiLCAuZGVzY3IgPSAiQml0IGVycm9yIGFjY29yZGluZyB0byBCSVA4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBiaXA4X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19jcmNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgUExPQU1zIHdpdGggQ1JDIGVycm9yIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9wbG9hbXNfbm9uX2lkbGUgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC5kZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQTE9BTXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wbG9hbXNfbm9uX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9wb3NpdGl2ZV9kcmlmdCA9IHsgLm5hbWUgPSAicG9zaXRpdmVfZHJpZnQiLCAuZGVzY3IgPSAiUG9zaXRpdmUgZHJpZnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHBvc2l0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfbmVnYXRpdmVfZHJpZnQgPSB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIk5lZ2F0aXZlIGRyaWZ0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBuZWdhdGl2ZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X29tY2kgPSB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yID0geyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2Jlcl9yZXBvcnRlZCA9IHsgLm5hbWUgPSAiYmVyX3JlcG9ydGVkIiwgLmRlc2NyID0gIkJFUiByZXBvcnRlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGJlcl9yZXBvcnRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3VucmVjZWl2ZWRfYnVyc3QgPSB7IC5uYW1lID0gInVucmVjZWl2ZWRfYnVyc3QiLCAuZGVzY3IgPSAiVW5yZWNlaXZlZCBidXJzdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCB1bnJlY2VpdmVkX2J1cnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfbGNkZ19lcnJvcnMgPSB7IC5uYW1lID0gImxjZGdfZXJyb3JzIiwgLmRlc2NyID0gIkxDREcgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBsY2RnX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3JkaV9lcnJvcnMgPSB7IC5uYW1lID0gInJkaV9lcnJvcnMiLCAuZGVzY3IgPSAiUkRJIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByZGlfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gInJ4IGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X3BhY2tldHMgPSB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAicnggcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfdHhfYnl0ZXMgPSB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gInR4IGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3R4X3BhY2tldHMgPSB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAidHggcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHMsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfZmVjX2J5dGVzX2NvcnJlY3RlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfY29kZXdvcmRzX2NvcnJlY3RlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2JpcDhfYnl0ZXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYmlwOF9lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfcGxvYW1zX2NyY19lcnJvciwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9wbG9hbXNfbm9uX2lkbGUsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcG9zaXRpdmVfZHJpZnQsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfbmVnYXRpdmVfZHJpZnQsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfb21jaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2Jlcl9yZXBvcnRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF91bnJlY2VpdmVkX2J1cnN0LCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2xjZGdfZXJyb3JzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3JkaV9lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfYnl0ZXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfcGFja2V0cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF90eF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF90eF9wYWNrZXRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJUb3RhbCByZWNlaXZlZCBGRUMgY29kZXdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2J5dGVzX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgY29kZXdvcmRzIGNvcnJlY3RlZCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfYnl0ZXNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBjb3JyZWN0ZWQgY29kZXdvcmRzIGVycm9yICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBub3QgY29ycmVjdGVkIGNvZGV3b3JkcyBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJpcDhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgZm9yIEJJUDgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgYmlwOF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJCaXQgZXJyb3IgYWNjb3JkaW5nIHRvIEJJUDgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBQTE9BTXMgd2l0aCBDUkMgZXJyb3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUExPQU1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJwb3NpdGl2ZV9kcmlmdCIsIC5kZXNjciA9ICJQb3NpdGl2ZSBkcmlmdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBwb3NpdGl2ZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJuZWdhdGl2ZV9kcmlmdCIsIC5kZXNjciA9ICJOZWdhdGl2ZSBkcmlmdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBuZWdhdGl2ZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJlcl9yZXBvcnRlZCIsIC5kZXNjciA9ICJCRVIgcmVwb3J0ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgYmVyX3JlcG9ydGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInVucmVjZWl2ZWRfYnVyc3QiLCAuZGVzY3IgPSAiVW5yZWNlaXZlZCBidXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCB1bnJlY2VpdmVkX2J1cnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImxjZGdfZXJyb3JzIiwgLmRlc2NyID0gIkxDREcgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGxjZGdfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJkaV9lcnJvcnMiLCAuZGVzY3IgPSAiUkRJIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByZGlfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gInJ4IGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAicnggcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gInR4IGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAidHggcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gc2V0X29udV9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3NldF9vbnVfc3RhdGVfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiT05VIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJPTlUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgT05VIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gcnNzaV9tZWFzdXJlbWVudCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBjaGFuZ2VfcG93ZXJfbGV2ZWwgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfcG93ZXJfbGV2ZWxfYWN0aW9uID0geyAubmFtZSA9ICJwb3dlcl9sZXZlbF9hY3Rpb24iLCAuZGVzY3IgPSAicG93ZXIgbGV2ZWwgYWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEsIHBvd2VyX2xldmVsX2FjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9sZXZlbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9wb3dlcl9sZXZlbF9hY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvd2VyX2xldmVsX2FjdGlvbiIsIC5kZXNjciA9ICJwb3dlciBsZXZlbCBhY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhLCBwb3dlcl9sZXZlbF9hY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhIiwgLmRlc2NyID0gIkNoYW5nZSBQb3dlciBMZXZlbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9udV9hbGFybSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9hbGFybV9vbnVfYWxhcm0gPSB7IC5uYW1lID0gIm9udV9hbGFybSIsIC5kZXNjciA9ICJvbnUgYWxhcm0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2FsYXJtX29udV9hbGFybSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIm9udSBhbGFybSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtcyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEiLCAuZGVzY3IgPSAiT05VIEFsYXJtIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gZG93aSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2Rvd2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfZG93aV9kcmlmdF92YWx1ZSA9IHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSwgZHJpZnRfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX25ld19lcWQgPSB7IC5uYW1lID0gIm5ld19lcWQiLCAuZGVzY3IgPSAiTmV3IEVRRCBhZnRlciBkcmlmdCBpcyBjb3JyZWN0ZWQgKG9ubHkgdmFsaWQgaWYgc3RhdHVzIGlzICdvbicpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX05FV19FUUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhLCBuZXdfZXFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2Rvd2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfZG93aV9kcmlmdF92YWx1ZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfZG93aV9uZXdfZXFkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH0sIHsgLm5hbWUgPSAibmV3X2VxZCIsIC5kZXNjciA9ICJOZXcgRVFEIGFmdGVyIGRyaWZ0IGlzIGNvcnJlY3RlZCAob25seSB2YWxpZCBpZiBzdGF0dXMgaXMgJ29uJykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEsIG5ld19lcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIiwgLmRlc2NyID0gIkRyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gc2ZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc2ZpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zZmlfYmVyID0geyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9zZmlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9zZmlfYWxhcm1fc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zZmlfYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiYmVyIiwgLmRlc2NyID0gIkludmVyc2UgYml0IGVycm9yIHJhdGUgKGUuZy4gaWYgdGhpcyBudW1iZXIgaXMgMTAwMCwgdGhlIEJFUiBpcyAxLzEwMDApLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3NmaV9kYXRhIiwgLmRlc2NyID0gIlNpZ25hbCBGYWlsIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzZGkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zZGlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3NkaV9iZXIgPSB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0JFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3NkaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3NkaV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3NkaV9iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NkaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEiLCAuZGVzY3IgPSAiU2lnbmFsIERlZ3JhZGVkIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBkZmkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9kZmlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2RmaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2RmaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kZmlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2RmaV9kYXRhIiwgLmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2RmaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gc3VmaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N1ZmlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc3VmaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3N1ZmlfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEiLCAuZGVzY3IgPSAiU1VGaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGxvYWkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9sb2FpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2xvYWlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9sb2FpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIiwgLmRlc2NyID0gIkxPQWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBkZ2kgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9kZ2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2RnaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2RnaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RnaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2RnaV9kYXRhIiwgLmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2RnaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gcGVlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcGVlX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QRUVfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BlZV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wZWVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9wZWVfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSIsIC5kZXNjciA9ICJQRUUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwc3QgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfbGlua19udW1iZXIgPSB7IC5uYW1lID0gImxpbmtfbnVtYmVyIiwgLmRlc2NyID0gImxpbmsgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9MSU5LX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSwgbGlua19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcHN0X2sxID0geyAubmFtZSA9ICJrMSIsIC5kZXNjciA9ICJLMSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEsIGsxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcHN0X2syID0geyAubmFtZSA9ICJrMiIsIC5kZXNjciA9ICJLMiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEsIGsyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcHN0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcHN0X2xpbmtfbnVtYmVyLCAmcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfazEsICZwcm9wX2Rlc2NyX2dwb25fb251X3BzdF9rMiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlua19udW1iZXIiLCAuZGVzY3IgPSAibGluayBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhLCBsaW5rX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJrMSIsIC5kZXNjciA9ICJLMSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEsIGsxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiazIiLCAuZGVzY3IgPSAiSzIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhLCBrMiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3BzdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEiLCAuZGVzY3IgPSAiUFNUIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gdGl3aSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Rpd2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfdGl3aV9kcmlmdF92YWx1ZSA9IHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0RSSUZUX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSwgZHJpZnRfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV90aXdpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfdGl3aV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3Rpd2lfZHJpZnRfdmFsdWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLmRlc2NyID0gIkNhbGN1bGF0ZWQgYW1vdW50IG9mIGRyaWZ0IChwb3NpdGl2ZSArIG5lZ2F0aXZlIGFzIGEgc2lnbmVkIHZhbHVlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSwgZHJpZnRfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEiLCAuZGVzY3IgPSAiVHJhbnNtaXNzaW9uIEludGVyZmVyZW5jZSBXYXJuaW5nIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gbG9raSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2xva2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0xPS0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfbG9raV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2xva2lfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEiLCAuZGVzY3IgPSAiTE9raSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xva2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG1lbWkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9tZW1pX3Bsb2FtX2J1ZmZlciA9IHsgLm5hbWUgPSAicGxvYW1fYnVmZmVyIiwgLmRlc2NyID0gIlBMT0FNIGJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEsIHBsb2FtX2J1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X21lbWlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9tZW1pX3Bsb2FtX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsb2FtX2J1ZmZlciIsIC5kZXNjciA9ICJQTE9BTSBidWZmZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSwgcGxvYW1fYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIiwgLmRlc2NyID0gIk1FTWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZ2VtX3BvcnQgPSB7IC5uYW1lID0gImdlbV9wb3J0IiwgLmRlc2NyID0gIkdFTSBQb3J0IElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZ2VtX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfb3BlcmF0aW9uID0geyAubmFtZSA9ICJvcGVyYXRpb24iLCAuZGVzY3IgPSAiT3BlcmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9PUEVSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG9wZXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZ2VtX3BvcnQsICZwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImdlbV9wb3J0IiwgLmRlc2NyID0gIkdFTSBQb3J0IElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZ2VtX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gIm9wZXJhdGlvbiIsIC5kZXNjciA9ICJPcGVyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBvcGVyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTUNJIFBPUlQgSUQgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfYmVyX2ludGVydmFsID0geyAubmFtZSA9ICJiZXJfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiQkVSIGludGVydmFsIGluIG1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIGJlcl9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9iZXJfaW50ZXJ2YWwsICZwcm9wX2Rlc2NyX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJlcl9pbnRlcnZhbCIsIC5kZXNjciA9ICJCRVIgaW50ZXJ2YWwgaW4gbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBiZXJfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQkVSIEludGVydmFsIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gZXJyICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfZXJyX2JpcDhfZXJyb3JzID0geyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJCSVA4IGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9FUlJfSURfQklQOF9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfZXJyX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfZXJyX2JpcDhfZXJyb3JzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJCSVA4IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSIsIC5kZXNjciA9ICJFUlIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSByZWkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yZWlfYmlwOF9lcnJvcnMgPSB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJJUDggZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JFSV9JRF9CSVA4X0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcmVpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcmVpX2JpcDhfZXJyb3JzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJCSVA4IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JlaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEiLCAuZGVzY3IgPSAiUkVJIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3JlaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gcmFuZ2luZ19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9udW1iZXJfb2ZfcGxvYW1zID0geyAubmFtZSA9ICJudW1iZXJfb2ZfcGxvYW1zIiwgLmRlc2NyID0gIm51bWJlciBvZiBQTE9BTXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBudW1iZXJfb2ZfcGxvYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZXFkID0geyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBlcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcG93ZXJfbGV2ZWwgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLmRlc2NyID0gIlBvd2VyIExldmVsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIHBvd2VyX2xldmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2ZhaWxfcmVhc29uLCAmcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9udW1iZXJfb2ZfcGxvYW1zLCAmcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9lcWQsICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Bvd2VyX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfcGxvYW1zIiwgLmRlc2NyID0gIm51bWJlciBvZiBQTE9BTXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBlcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAuZGVzY3IgPSAiUG93ZXIgTGV2ZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIHBvd2VyX2xldmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiUmFuZ2luZyBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX3Bhc3N3b3JkID0geyAubmFtZSA9ICJwYXNzd29yZCIsIC5kZXNjciA9ICJwYXNzd29yZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfUEFTU1dPUkQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIHBhc3N3b3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2ZhaWxfcmVhc29uLCAmcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcGFzc3dvcmQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gfSwgeyAubmFtZSA9ICJwYXNzd29yZCIsIC5kZXNjciA9ICJwYXNzd29yZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIHBhc3N3b3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJQYXNzd29yZCBBdXRoZW50aWNhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIEFjdGl2YXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBEZWFjdGl2YXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gb251X2VuYWJsZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIEVuYWJsZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfZGlzYWJsZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIERpc2FibGUgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gaW52YWxpZF9kYnJ1X3JlcG9ydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9hbGxvY19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSIsIC5kZXNjciA9ICJJbnZhbGlkIERCUnUgUmVwb3J0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0ga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfbmV3X2tleSA9IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEsIG5ld19rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfbmV3X2tleSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm5ld19rZXkiLCAuZGVzY3IgPSAibmV3IGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0ga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9leHBlY3RlZF9rZXkgPSB7IC5uYW1lID0gImV4cGVjdGVkX2tleSIsIC5kZXNjciA9ICJleHBlY3RlZCBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCBleHBlY3RlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9yZWNlaXZlZF9rZXkgPSB7IC5uYW1lID0gInJlY2VpdmVkX2tleSIsIC5kZXNjciA9ICJyZWNlaXZlZCBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCByZWNlaXZlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZXhwZWN0ZWRfa2V5LCAmcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3JlY2VpdmVkX2tleSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImV4cGVjdGVkX2tleSIsIC5kZXNjciA9ICJleHBlY3RlZCBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSwgZXhwZWN0ZWRfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9LCB7IC5uYW1lID0gInJlY2VpdmVkX2tleSIsIC5kZXNjciA9ICJyZWNlaXZlZCBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSwgcmVjZWl2ZWRfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IE1pc21hdGNoIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0ga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9leHBlY3RlZF9pbmRleCA9IHsgLm5hbWUgPSAiZXhwZWN0ZWRfaW5kZXgiLCAuZGVzY3IgPSAiZXhwZWN0ZWQgaW5kZXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSwgZXhwZWN0ZWRfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfYWN0dWFsX2luZGV4ID0geyAubmFtZSA9ICJhY3R1YWxfaW5kZXgiLCAuZGVzY3IgPSAiYWN0dWFsIGluZGV4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0FDVFVBTF9JTkRFWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhLCBhY3R1YWxfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9leHBlY3RlZF9pbmRleCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfYWN0dWFsX2luZGV4IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImV4cGVjdGVkX2luZGV4IiwgLmRlc2NyID0gImV4cGVjdGVkIGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhLCBleHBlY3RlZF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhY3R1YWxfaW5kZXgiLCAuZGVzY3IgPSAiYWN0dWFsIGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhLCBhY3R1YWxfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIFVuY29uc2VjdXRpdmUgSW5kZXgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX25ld19rZXkgPSB7IC5uYW1lID0gIm5ld19rZXkiLCAuZGVzY3IgPSAibmV3IGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEsIG5ld19rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9uZXdfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm5ld19rZXkiLCAuZGVzY3IgPSAibmV3IGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSwgbmV3X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgRGVjcnlwdCBSZXF1aXJlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9wdGljYWxfcmVmbGVjdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGNwdV9wYWNrZXRzICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3R5cGUgPSB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19jYWxjX2NyYyA9IHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgY2FsY19jcmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19udW1iZXJfb2ZfcGFja2V0cyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX3BhY2tldHMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgbnVtYmVyX29mX3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfc2l6ZSA9IHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAiU2luZ2xlIHBhY2tldCBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9jcHVfcGFja2V0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX3BhY2tldF90eXBlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19jYWxjX2NyYywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfbnVtYmVyX29mX3BhY2tldHMsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX3BhY2tldF9zaXplLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X3R5cGUgfSwgeyAubmFtZSA9ICJjYWxjX2NyYyIsIC5kZXNjciA9ICJjYWxjIGNyYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgY2FsY19jcmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfcGFja2V0cyIsIC5kZXNjciA9ICJudW1iZXIgb2YgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgbnVtYmVyX29mX3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJTaW5nbGUgcGFja2V0IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEiLCAuZGVzY3IgPSAiR1BPTiBDUFUgUGFja2V0cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHBsb2FtX3BhY2tldCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bsb2FtX3BhY2tldF9wbG9hbSA9IHsgLm5hbWUgPSAicGxvYW0iLCAuZGVzY3IgPSAicGxvYW0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBwbG9hbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3Bsb2FtX3BhY2tldF9wbG9hbSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGxvYW0iLCAuZGVzY3IgPSAicGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBwbG9hbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEiLCAuZGVzY3IgPSAiUExPQU0gUGFja2V0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gY3B1X3BhY2tldCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfcG9ydF9pZCA9IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0X2lkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldF9jcmNfb2sgPSB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmNfb2siLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBjcmNfb2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X3BhY2tldF9zaXplID0geyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJwYWNrZXRfc2l6ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldF9idWZmZXIgPSB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X3BvcnRfaWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfY3JjX29rLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X3BhY2tldF9zaXplLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvcnRfaWQiLCAuZGVzY3IgPSAicG9ydF9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmNfb2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgY3JjX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0X3NpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgQ1BVIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbWNpX3BhY2tldCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcGFja2V0X3BvcnRfaWQgPSB7IC5uYW1lID0gInBvcnRfaWQiLCAuZGVzY3IgPSAicG9ydF9pZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfY3JjX29rID0geyAubmFtZSA9ICJjcmNfb2siLCAuZGVzY3IgPSAiY3JjX29rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBjcmNfb2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9wYWNrZXRfc2l6ZSA9IHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0X3NpemUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfcG9ydF9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfY3JjX29rLCAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9wYWNrZXRfc2l6ZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvcnRfaWQiLCAuZGVzY3IgPSAicG9ydF9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJjcmNfb2siLCAuZGVzY3IgPSAiY3JjX29rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBjcmNfb2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJwYWNrZXRfc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgT01DSSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIm9udSBhY3RpdmF0aW9uIHN0YW5kYnkgY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9vbGRfc3RhdGUgPSB7IC5uYW1lID0gIm9sZF9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgdGhlIE9OVSB3YXMgcHJldmlvdXNseSBpbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG9sZF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3JlYXNvbiA9IHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIlRoZSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9vbGRfc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX25ld19zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9sZF9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgdGhlIE9OVSB3YXMgcHJldmlvdXNseSBpbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG9sZF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgdGhlIE9OVSBpcyBjdXJyZW50bHkgaW4uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSwgeyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiVGhlIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIHJlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSIsIC5kZXNjciA9ICJOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gcG9zc2libGVfZHJpZnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2VzdGltYXRlZF9kcmlmdCA9IHsgLm5hbWUgPSAiZXN0aW1hdGVkX2RyaWZ0IiwgLmRlc2NyID0gIklmIHN0YXR1cyBpcyBvbiwgdGhlIGVzdGltYXRlZCBkcmlmdCB2YWx1ZSwgb3RoZXJ3aXNlIHplcm8gKDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSwgZXN0aW1hdGVkX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2VzdGltYXRlZF9kcmlmdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfZHJpZnQiLCAuZGVzY3IgPSAiSWYgc3RhdHVzIGlzIG9uLCB0aGUgZXN0aW1hdGVkIGRyaWZ0IHZhbHVlLCBvdGhlcndpc2UgemVybyAoMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBlc3RpbWF0ZWRfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSIsIC5kZXNjciA9ICJBbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUgbWF5IGJlIGV4cGVyaWVuY2luZyBkcmlmdCBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiBUaGUgZXN0aW1hdGUgbWF5IGJlIGluYWNjdXJhdGUgZGVwZW5kaW5nIG9uIE9OVSBiZWhhdmlvci4gQWN0dWFsIGRyaWZ0IG1heSBiZSBsZXNzIHRoYW4gZXN0aW1hdGVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfZGZpID0geyAubmFtZSA9ICJkZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ERkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfZGdpID0geyAubmFtZSA9ICJkZ2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRnaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfZG93aSA9IHsgLm5hbWUgPSAiZG93aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZG93aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRvd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19lcnIgPSB7IC5uYW1lID0gImVyciIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZXJyXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBlcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19pbnZhbGlkX2RicnVfcmVwb3J0ID0geyAubmFtZSA9ICJpbnZhbGlkX2RicnVfcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJpbnZhbGlkX2RicnVfcmVwb3J0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0lOVkFMSURfREJSVV9SRVBPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgaW52YWxpZF9kYnJ1X3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfbG9haSA9IHsgLm5hbWUgPSAibG9haSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9haVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0FJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGxvYWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19sb2tpID0geyAubmFtZSA9ICJsb2tpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb2tpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPS0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9raSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX21lbWkgPSB7IC5uYW1lID0gIm1lbWkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1lbWlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBtZW1pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9hbGFybSA9IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWxhcm1cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfZGlzYWJsZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2FibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfZW5hYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9lbmFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9lbmFibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb3B0aWNhbF9yZWZsZWN0aW9uID0geyAubmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9wdGljYWxfcmVmbGVjdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb3B0aWNhbF9yZWZsZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcGVlID0geyAubmFtZSA9ICJwZWUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBlZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QRUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcGVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcG9zc2libGVfZHJpZnQgPSB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3NzaWJsZV9kcmlmdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3NzaWJsZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlID0geyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wc3QgPSB7IC5uYW1lID0gInBzdCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHN0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yYW5naW5nX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdpbmdfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJhbmdpbmdfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcmVpID0geyAubmFtZSA9ICJyZWkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJlaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmVpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3NkaSA9IHsgLm5hbWUgPSAic2RpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZGlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHNkaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3NmaSA9IHsgLm5hbWUgPSAic2ZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHNmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19zdWZpID0geyAubmFtZSA9ICJzdWZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdWZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3VmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Rpd2kgPSB7IC5uYW1lID0gInRpd2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInRpd2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCB0aXdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2RmaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfZGdpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kb3dpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19lcnIsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2ludmFsaWRfZGJydV9yZXBvcnQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4LCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19sb2FpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19sb2tpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19tZW1pLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9hbGFybSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9kaXNhYmxlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2VuYWJsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29wdGljYWxfcmVmbGVjdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wZWUsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Bvc3NpYmxlX2RyaWZ0LCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcHN0LCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yYW5naW5nX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcmVpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc2RpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19zZmksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3N1ZmksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Rpd2kgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZ2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRnaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZG93aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZG93aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZG93aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVyciIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZXJyXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBlcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJpbnZhbGlkX2RicnVfcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJpbnZhbGlkX2RicnVfcmVwb3J0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBpbnZhbGlkX2RicnVfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibG9haSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9haVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9haSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxva2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxva2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGxva2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtZW1pIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtZW1pXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBtZW1pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2FjdGl2YXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWxhcm1cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9kaXNhYmxlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2Rpc2FibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9lbmFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZW5hYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9wdGljYWxfcmVmbGVjdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib3B0aWNhbF9yZWZsZWN0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvcHRpY2FsX3JlZmxlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicGVlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwZWVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBlZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3NzaWJsZV9kcmlmdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG9zc2libGVfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHN0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwc3RcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJhbmdpbmdfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyYW5naW5nX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmFuZ2luZ19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyZWkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJlaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmVpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNkaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2RpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZGkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdWZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdWZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdWZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGl3aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncG9uX3RyeCA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX3RyeCAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fdHJ4X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fdHJ4X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fdHJ4X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fdHJ4X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl90cnhfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fdHJ4X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl90cnggLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfdHJhbnNjZWl2ZXJfdHlwZSA9IHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC5kZXNjciA9ICJ0cmFuc2NlaXZlciB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCB0cmFuc2NlaXZlcl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAibGFfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJMQSBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyID0geyAubmFtZSA9ICJiY2RyIiwgLmRlc2NyID0gIkJDRFIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMgPSB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIiwgLmRlc2NyID0gIkxBIHJhbmdpbmcgYWZ0ZXIgbm8gZWQgcmVzeW5jICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyA9IHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJ1c2VkIGluIHJhbmdpbmcgbW9kZSBhZnRlciBubyBlZCBmb3VuZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2xhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jID0geyAubmFtZSA9ICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJMQSByYW5naW5nIGFmdGVyIGVkIHJlc3luYyAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMgPSB7IC5uYW1lID0gImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMiLCAuZGVzY3IgPSAiQkNEUiByYW5naW5nIGFmdGVyIGVkIHJlc3luYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2xhX3Jlc3luY19wb2xhcml0eSA9IHsgLm5hbWUgPSAibGFfcmVzeW5jX3BvbGFyaXR5IiwgLmRlc2NyID0gImxhIHJlc3luYyBwb2xhcml0eSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkVTWU5DX1BPTEFSSVRZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yZXN5bmNfcG9sYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb2xhcml0eSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3Jlc3luY19wb2xhcml0eSA9IHsgLm5hbWUgPSAiYmNkcl9yZXN5bmNfcG9sYXJpdHkiLCAuZGVzY3IgPSAiQkNEUiByZXN5bmMgcG9sYXJpdHkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3Jlc3luY19wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyA9IHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIiwgLmRlc2NyID0gImJjZHIgcmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2xhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgPSB7IC5uYW1lID0gImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAibGEgcmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcnhfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAicnhfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJSWCBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCByeF9jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAicmFuZ2luZyBjb250cm9sIHN0YWdlcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX0NPTlRST0xfU1RBR0VTX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2VuZXJneV9kZXRlY3QgPSB7IC5uYW1lID0gImVuZXJneV9kZXRlY3QiLCAuZGVzY3IgPSAiRW5lcmd5IERldGVjdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZW5lcmd5X2RldGVjdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2VuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4gPSB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4iLCAuZGVzY3IgPSAiZW5kIG9mIGJ1cnN0IGRhdGEgcGF0dGVybiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuID0geyAubmFtZSA9ICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuIiwgLmRlc2NyID0gImVuZCBvZiBidXJzdCByYW5naW5nIHBhdHRlcm4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SQU5HSU5HX1BBVFRFUk4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19wcmVhbWJsZSA9IHsgLm5hbWUgPSAicHJlYW1ibGUiLCAuZGVzY3IgPSAiUHJlYW1ibGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BSRUFNQkxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBwcmVhbWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9wcmVhbWJsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19kZWxpbWl0ZXIgPSB7IC5uYW1lID0gImRlbGltaXRlciIsIC5kZXNjciA9ICJEZWxpbWl0ZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZGVsaW1pdGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2RlbGltaXRlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19ndWFyZF9iaXRzID0geyAubmFtZSA9ICJndWFyZF9iaXRzIiwgLmRlc2NyID0gIkd1YXJkIGJpdHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0dVQVJEX0JJVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGd1YXJkX2JpdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3NlcmRlc19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJzZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHNlcmRlc19jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcGxvX3JhbmdpbmcgPSB7IC5uYW1lID0gInBsb19yYW5naW5nIiwgLmRlc2NyID0gIlBMTyBmb3IgcmFuZ2luZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcGxvX3JhbmdpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3Bsb19kYXRhID0geyAubmFtZSA9ICJwbG9fZGF0YSIsIC5kZXNjciA9ICJQTE8gZm9yIGRhdGEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHBsb19kYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yc3NpX25vcm1hbF9jb25maWcgPSB7IC5uYW1lID0gInJzc2lfbm9ybWFsX2NvbmZpZyIsIC5kZXNjciA9ICJyc3NpIG5vcm1hbCBjb25maWciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9ub3JtYWxfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wgPSB7IC5uYW1lID0gInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCIsIC5kZXNjciA9ICJyYW5naW5nIHJzc2kgcmVzeW5jIGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfUlNTSV9SRVNZTkNfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX3RyeF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfdHJhbnNjZWl2ZXJfdHlwZSwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2xhX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmVzeW5jX3BvbGFyaXR5LCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfYmNkcl9yZXN5bmNfcG9sYXJpdHksICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcnhfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3JhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2VuZXJneV9kZXRlY3QsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3ByZWFtYmxlLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZGVsaW1pdGVyLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZ3VhcmRfYml0cywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3NlcmRlc19jb25maWd1cmF0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcGxvX3JhbmdpbmcsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19wbG9fZGF0YSwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3Jzc2lfbm9ybWFsX2NvbmZpZywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3JhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC5kZXNjciA9ICJ0cmFuc2NlaXZlciB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgdHJhbnNjZWl2ZXJfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF90eXBlIH0sIHsgLm5hbWUgPSAibGFfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJMQSBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgbGFfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJiY2RyIiwgLmRlc2NyID0gIkJDRFIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiLCAuZGVzY3IgPSAiTEEgcmFuZ2luZyBhZnRlciBubyBlZCByZXN5bmMgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9LCB7IC5uYW1lID0gImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiLCAuZGVzY3IgPSAidXNlZCBpbiByYW5naW5nIG1vZGUgYWZ0ZXIgbm8gZWQgZm91bmQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJMQSByYW5naW5nIGFmdGVyIGVkIHJlc3luYyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0sIHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJCQ0RSIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0sIHsgLm5hbWUgPSAibGFfcmVzeW5jX3BvbGFyaXR5IiwgLmRlc2NyID0gImxhIHJlc3luYyBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3Jlc3luY19wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXN5bmNfcG9sYXJpdHkiLCAuZGVzY3IgPSAiQkNEUiByZXN5bmMgcG9sYXJpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3Jlc3luY19wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5IH0sIHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIiwgLmRlc2NyID0gImJjZHIgcmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIiwgLmRlc2NyID0gImxhIHJhbmdpbmcgcmVzeW5jIGNvbmRpdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB9LCB7IC5uYW1lID0gInJ4X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiUlggY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJ4X2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJyYW5naW5nIGNvbnRyb2wgc3RhZ2VzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gImVuZXJneV9kZXRlY3QiLCAuZGVzY3IgPSAiRW5lcmd5IERldGVjdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGVuZXJneV9kZXRlY3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZW5lcmd5X2RldGVjdCB9LCB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4iLCAuZGVzY3IgPSAiZW5kIG9mIGJ1cnN0IGRhdGEgcGF0dGVybiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuIiwgLmRlc2NyID0gImVuZCBvZiBidXJzdCByYW5naW5nIHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJwcmVhbWJsZSIsIC5kZXNjciA9ICJQcmVhbWJsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHByZWFtYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlIH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyIiwgLmRlc2NyID0gIkRlbGltaXRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGRlbGltaXRlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9kZWxpbWl0ZXIgfSwgeyAubmFtZSA9ICJndWFyZF9iaXRzIiwgLmRlc2NyID0gIkd1YXJkIGJpdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBndWFyZF9iaXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInNlcmRlc19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gInNlcmRlcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gInBsb19yYW5naW5nIiwgLmRlc2NyID0gIlBMTyBmb3IgcmFuZ2luZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHBsb19yYW5naW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBsb19kYXRhIiwgLmRlc2NyID0gIlBMTyBmb3IgZGF0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHBsb19kYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJzc2lfbm9ybWFsX2NvbmZpZyIsIC5kZXNjciA9ICJyc3NpIG5vcm1hbCBjb25maWciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCByc3NpX25vcm1hbF9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gInJhbmdpbmcgcnNzaSByZXN5bmMgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogbG9nX2VudHJ5ID09PT0gKi8KKworLyogR3JvdXA6IGxvZ19lbnRyeSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9rZXlfbG9nX2lkID0geyAubmFtZSA9ICJsb2dfaWQiLCAuZGVzY3IgPSAibG9nIGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTE9HX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9rZXksIGxvZ19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJyZXNlcnZlZCIsIC5hY2Nlc3MgPSAwLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9rZXlfbmFtZSA9IHsgLm5hbWUgPSAibmFtZSIsIC5kZXNjciA9ICJuYW1lIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfa2V5LCBuYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dfZW50cnlfa2V5X2xvZ19pZCwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2tleV9yZXNlcnZlZCwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2tleV9uYW1lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvZ19pZCIsIC5kZXNjciA9ICJsb2cgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9rZXksIGxvZ19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJyZXNlcnZlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJuYW1lIiwgLmRlc2NyID0gIm5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9rZXksIG5hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ19lbnRyeSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfZGVmYXVsdF9sb2dfbGV2ZWwgPSB7IC5uYW1lID0gImRlZmF1bHRfbG9nX2xldmVsIiwgLmRlc2NyID0gImRlZmF1bHQgbG9nIGxldmVsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGRlZmF1bHRfbG9nX2xldmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19kZWZhdWx0X2xvZ190eXBlID0geyAubmFtZSA9ICJkZWZhdWx0X2xvZ190eXBlIiwgLmRlc2NyID0gImRlZmF1bHQgbG9nIHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBkZWZhdWx0X2xvZ190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19sZXZlbF9wcmludCA9IHsgLm5hbWUgPSAibG9nX2xldmVsX3ByaW50IiwgLmRlc2NyID0gImxvZyBsZXZlbCBwcmludCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19sZXZlbF9wcmludCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19sZXZlbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX2xldmVsX3NhdmUgPSB7IC5uYW1lID0gImxvZ19sZXZlbF9zYXZlIiwgLmRlc2NyID0gImxvZyBsZXZlbCBzYXZlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1NBVkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfbGV2ZWxfc2F2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19sZXZlbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX3R5cGUgPSB7IC5uYW1lID0gImxvZ190eXBlIiwgLmRlc2NyID0gImxvZyB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ190eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfc3R5bGUgPSB7IC5uYW1lID0gImxvZ19zdHlsZSIsIC5kZXNjciA9ICJsb2dfc3R5bGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfc3R5bGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfc3R5bGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19uYW1lID0geyAubmFtZSA9ICJsb2dfbmFtZSIsIC5kZXNjciA9ICJsb2cgbmFtZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dfZW50cnlfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19kZWZhdWx0X2xvZ19sZXZlbCwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19kZWZhdWx0X2xvZ190eXBlLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19sZXZlbF9wcmludCwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfbGV2ZWxfc2F2ZSwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfdHlwZSwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfc3R5bGUsICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX25hbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkZWZhdWx0X2xvZ19sZXZlbCIsIC5kZXNjciA9ICJkZWZhdWx0IGxvZyBsZXZlbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBkZWZhdWx0X2xvZ19sZXZlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19sZXZlbCB9LCB7IC5uYW1lID0gImRlZmF1bHRfbG9nX3R5cGUiLCAuZGVzY3IgPSAiZGVmYXVsdCBsb2cgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBkZWZhdWx0X2xvZ190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX3R5cGUgfSwgeyAubmFtZSA9ICJsb2dfbGV2ZWxfcHJpbnQiLCAuZGVzY3IgPSAibG9nIGxldmVsIHByaW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19sZXZlbF9wcmludCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19sZXZlbCB9LCB7IC5uYW1lID0gImxvZ19sZXZlbF9zYXZlIiwgLmRlc2NyID0gImxvZyBsZXZlbCBzYXZlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19sZXZlbF9zYXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH0sIHsgLm5hbWUgPSAibG9nX3R5cGUiLCAuZGVzY3IgPSAibG9nIHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfdHlwZSB9LCB7IC5uYW1lID0gImxvZ19zdHlsZSIsIC5kZXNjciA9ICJsb2dfc3R5bGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX3N0eWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX3N0eWxlIH0sIHsgLm5hbWUgPSAibG9nX25hbWUiLCAuZGVzY3IgPSAibG9nIG5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX25hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dfZW50cnkgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfbXNnX2NvdW50ID0geyAubmFtZSA9ICJtc2dfY291bnQiLCAuZGVzY3IgPSAibXNnIGNvdW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhLCBtc2dfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTMyXzYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9sb3N0X21zZ19jb3VudCA9IHsgLm5hbWUgPSAibG9zdF9tc2dfY291bnQiLCAuZGVzY3IgPSAibG9zdCBtc2cgY291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSwgbG9zdF9tc2dfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nX2VudHJ5X3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9tc2dfY291bnQsICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X2xvc3RfbXNnX2NvdW50IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1zZ19jb3VudCIsIC5kZXNjciA9ICJtc2cgY291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEsIG1zZ19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MzJfNiB9LCB7IC5uYW1lID0gImxvc3RfbXNnX2NvdW50IiwgLmRlc2NyID0gImxvc3QgbXNnIGNvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhLCBsb3N0X21zZ19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ19lbnRyeSAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nX2VudHJ5IC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nX2VudHJ5IC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dfZW50cnkgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dfZW50cnlfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dfZW50cnlfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBsb2dnZXIgPT09PSAqLworCisvKiBHcm91cDogbG9nZ2VyIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX2tleV9yZXNlcnZlZCA9IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAicmVzZXJ2ZWQiLCAuYWNjZXNzID0gMCwgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9LRVlfSURfUkVTRVJWRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX2tleV9maWxlX2lkID0geyAubmFtZSA9ICJmaWxlX2lkIiwgLmRlc2NyID0gInNob3VsZCBiZSAwIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfa2V5LCBmaWxlX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2ZpbGVfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nZ2VyX2tleV9yZXNlcnZlZCwgJnByb3BfZGVzY3JfbG9nZ2VyX2tleV9maWxlX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gInJlc2VydmVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJmaWxlX2lkIiwgLmRlc2NyID0gInNob3VsZCBiZSAwIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfa2V5LCBmaWxlX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2ZpbGVfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nZ2VyIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX2NmZ19idWZmZXIgPSB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJDb250YWlucyBcIm5leHRcIiBsb2cgcmVjb3JkcyByZWFkIGJ5IFwiYmNtb2x0X2NmZ19nZXQoKSBBUEkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX3dyYXBfYXJvdW5kID0geyAubmFtZSA9ICJ3cmFwX2Fyb3VuZCIsIC5kZXNjciA9ICJMb2cgZmlsZSB3cmFwLWFyb3VuZCBvcHRpb24uIFRSVUU9d3JhcCBhcm91bmQgd2hlbiBmdWxsLiBGQUxTRT1zdG9wIHdoZW4gZnVsbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5ELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgd3JhcF9hcm91bmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2NsZWFyX2FmdGVyX3JlYWQgPSB7IC5uYW1lID0gImNsZWFyX2FmdGVyX3JlYWQiLCAuZGVzY3IgPSAiQ2xlYXIgbG9nIGFmdGVyIGxhc3QgcmVjb3JkIGhhcyBiZWVuIHJlYWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgY2xlYXJfYWZ0ZXJfcmVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfZW5hYmxlX2xvZyA9IHsgLm5hbWUgPSAiZW5hYmxlX2xvZyIsIC5kZXNjciA9ICJFbmFibGUgbG9nZ2VyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEsIGVuYWJsZV9sb2cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2xvZ19uYW1lcyA9IHsgLm5hbWUgPSAibG9nX25hbWVzIiwgLmRlc2NyID0gImxvZ19uYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgbG9nX25hbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMDAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nZ2VyX2NmZ19idWZmZXIsICZwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfd3JhcF9hcm91bmQsICZwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfY2xlYXJfYWZ0ZXJfcmVhZCwgJnByb3BfZGVzY3JfbG9nZ2VyX2NmZ19lbmFibGVfbG9nLCAmcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2xvZ19uYW1lcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJDb250YWlucyBcIm5leHRcIiBsb2cgcmVjb3JkcyByZWFkIGJ5IFwiYmNtb2x0X2NmZ19nZXQoKSBBUEkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2J1ZmZlciB9LCB7IC5uYW1lID0gIndyYXBfYXJvdW5kIiwgLmRlc2NyID0gIkxvZyBmaWxlIHdyYXAtYXJvdW5kIG9wdGlvbi4gVFJVRT13cmFwIGFyb3VuZCB3aGVuIGZ1bGwuIEZBTFNFPXN0b3Agd2hlbiBmdWxsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEsIHdyYXBfYXJvdW5kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiY2xlYXJfYWZ0ZXJfcmVhZCIsIC5kZXNjciA9ICJDbGVhciBsb2cgYWZ0ZXIgbGFzdCByZWNvcmQgaGFzIGJlZW4gcmVhZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCBjbGVhcl9hZnRlcl9yZWFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZW5hYmxlX2xvZyIsIC5kZXNjciA9ICJFbmFibGUgbG9nZ2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEsIGVuYWJsZV9sb2cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb2dfbmFtZXMiLCAuZGVzY3IgPSAibG9nX25hbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEsIGxvZ19uYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfbGluZXNfaW5fbG9nID0geyAubmFtZSA9ICJsaW5lc19pbl9sb2ciLCAuZGVzY3IgPSAibGluZXMgaW4gbG9nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9TVEFUX0lEX0xJTkVTX0lOX0xPRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhLCBsaW5lc19pbl9sb2cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nZ2VyX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfc3RhdF9saW5lc19pbl9sb2cgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGluZXNfaW5fbG9nIiwgLmRlc2NyID0gImxpbmVzIGluIGxvZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSwgbGluZXNfaW5fbG9nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nZ2VyIC0gY2xlYXJfbG9nICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nZ2VyX2NsZWFyX2xvZ19wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ2dlciAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ2dlciAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nZ2VyIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nZ2VyX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nZ2VyX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfbG9nZ2VyX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogbm5pID09PT0gKi8KKworLyogR3JvdXA6IG5uaSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIE5JIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIE5JIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfbm5pX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbm5pIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19yZW1vdGVfbG9vcGJhY2sgPSB7IC5uYW1lID0gInJlbW90ZV9sb29wYmFjayIsIC5kZXNjciA9ICJJbmNvbWluZyBwYWNrZXRzIGNvbWluZyBmcm9tIHRoZSBQT04gKHVwc3RyZWFtKSBhbmQgZ29pbmcgYmFjayB0byB0aGUgUE9OIChEb3duc3RyZWFtKSAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCByZW1vdGVfbG9vcGJhY2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19saW5lX2xvb3BiYWNrID0geyAubmFtZSA9ICJsaW5lX2xvb3BiYWNrIiwgLmRlc2NyID0gIkluY29taW5nIHBhY2tldHMgY29taW5nIGZyb20gdGhlIE5OSSBpbnRlcmZhY2UgdG8gdGhlIFBNIGFuZCBnb2luZyBiYWNrIHRvd2FyZHMgdGhlIE5OSSBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbGluZV9sb29wYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJNYWMgYWRkcmVzcyB0byBiZSB1c2VkIGZvciB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfbm5pX3N0YXR1cyA9IHsgLm5hbWUgPSAibm5pX3N0YXR1cyIsIC5kZXNjciA9ICJOTkkgc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfbm5pX2JhY2t1cF9zdGF0dXMgPSB7IC5uYW1lID0gIm5uaV9iYWNrdXBfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgYmFja3VwIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX2JhY2t1cF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX2FjdGl2ZV9ubmkgPSB7IC5uYW1lID0gImFjdGl2ZV9ubmkiLCAuZGVzY3IgPSAiV2hpY2ggTk5JIGlzIGN1cnJlbnRseSBhY3RpdmUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIGFjdGl2ZV9ubmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY29ubmVjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zID0geyAubmFtZSA9ICJubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMiLCAuZGVzY3IgPSAiSG93IG9mdGVuIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHByaW1hcnkgYW5kIGJhY2t1cCBOTklzICh1bml0czogbXMpLiBaZXJvICgwKSBkaXNhYmxlcyBzdGF0dXMgcG9sbGluZy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19hdXRvc3dpdGNoID0geyAubmFtZSA9ICJhdXRvc3dpdGNoIiwgLmRlc2NyID0gIlNob3VsZCBmaXJtd2FyZSBhdXRvbWF0aWNhbGx5IHN3aXRjaCBiZXR3ZWVuIHByaW1hcnkvYmFja3VwIE5OSXMgd2hlbiBMb3NzIG9mIExpbmsgaXMgZGV0ZWN0ZWQ/IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIGF1dG9zd2l0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX2Zsb3dfY29udHJvbCA9IHsgLm5hbWUgPSAiZmxvd19jb250cm9sIiwgLmRlc2NyID0gIk5OSSBGbG93IGNvbnRyb2wuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgZmxvd19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfY2ZnX3JlbW90ZV9sb29wYmFjaywgJnByb3BfZGVzY3Jfbm5pX2NmZ19saW5lX2xvb3BiYWNrLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX21hY19hZGRyZXNzLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX25uaV9zdGF0dXMsICZwcm9wX2Rlc2NyX25uaV9jZmdfbm5pX2JhY2t1cF9zdGF0dXMsICZwcm9wX2Rlc2NyX25uaV9jZmdfYWN0aXZlX25uaSwgJnByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMsICZwcm9wX2Rlc2NyX25uaV9jZmdfYXV0b3N3aXRjaCwgJnByb3BfZGVzY3Jfbm5pX2NmZ19mbG93X2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZW1vdGVfbG9vcGJhY2siLCAuZGVzY3IgPSAiSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgUE9OICh1cHN0cmVhbSkgYW5kIGdvaW5nIGJhY2sgdG8gdGhlIFBPTiAoRG93bnN0cmVhbSkgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIHJlbW90ZV9sb29wYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJsaW5lX2xvb3BiYWNrIiwgLmRlc2NyID0gIkluY29taW5nIHBhY2tldHMgY29taW5nIGZyb20gdGhlIE5OSSBpbnRlcmZhY2UgdG8gdGhlIFBNIGFuZCBnb2luZyBiYWNrIHRvd2FyZHMgdGhlIE5OSSBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbGluZV9sb29wYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJNYWMgYWRkcmVzcyB0byBiZSB1c2VkIGZvciB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAibm5pX3N0YXR1cyIsIC5kZXNjciA9ICJOTkkgc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIG5uaV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXMgfSwgeyAubmFtZSA9ICJubmlfYmFja3VwX3N0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMgb2YgdGhlIGJhY2t1cCBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIG5uaV9iYWNrdXBfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2xpbmtfc3RhdHVzIH0sIHsgLm5hbWUgPSAiYWN0aXZlX25uaSIsIC5kZXNjciA9ICJXaGljaCBOTkkgaXMgY3VycmVudGx5IGFjdGl2ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgYWN0aXZlX25uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH0sIHsgLm5hbWUgPSAibm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zIiwgLmRlc2NyID0gIkhvdyBvZnRlbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBwcmltYXJ5IGFuZCBiYWNrdXAgTk5JcyAodW5pdHM6IG1zKS4gWmVybyAoMCkgZGlzYWJsZXMgc3RhdHVzIHBvbGxpbmcuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhdXRvc3dpdGNoIiwgLmRlc2NyID0gIlNob3VsZCBmaXJtd2FyZSBhdXRvbWF0aWNhbGx5IHN3aXRjaCBiZXR3ZWVuIHByaW1hcnkvYmFja3VwIE5OSXMgd2hlbiBMb3NzIG9mIExpbmsgaXMgZGV0ZWN0ZWQ/IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIGF1dG9zd2l0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJmbG93X2NvbnRyb2wiLCAuZGVzY3IgPSAiTk5JIEZsb3cgY29udHJvbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgZmxvd19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbm5pIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzID0geyAubmFtZSA9ICJyeF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2dvb2RfZnJhbWVzID0geyAubmFtZSA9ICJyeF9nb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGdvb2QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9nb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bmljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9icm9hZGNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJyeF9icm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnJvYWRjYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9icm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2Zjc19lcnJvcnMgPSB7IC5uYW1lID0gInJ4X2Zjc19lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2Zjc19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfY29udHJvbF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2NvbnRyb2xfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgY29udHJvbCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2NvbnRyb2xfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3BhdXNlX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfcGF1c2VfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcGF1c2VfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3BmY19mcmFtZXMgPSB7IC5uYW1lID0gInJ4X3BmY19mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBQRkMgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3BmY19mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlID0geyAubmFtZSA9ICJyeF91bnN1cHBvcnRlZF9vcGNvZGUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBVbnN1cHBvcnRlZCBPcGNvZGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3Vuc3VwcG9ydGVkX2RhID0geyAubmFtZSA9ICJyeF91bnN1cHBvcnRlZF9kYSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuc3VwcG9ydGVkIERBIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdW5zdXBwb3J0ZWRfZGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfYWxpZ25tZW50X2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfYWxpZ25tZW50X2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFsaWdubWVudCBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfYWxpZ25tZW50X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9sZW5ndGhfb3V0X29mX3JhbmdlID0geyAubmFtZSA9ICJyeF9sZW5ndGhfb3V0X29mX3JhbmdlIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbGVuZ3RoIG91dCBvZiByYW5nZSBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9jb2RlX2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfY29kZV9lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb2RlIGVycm9ycyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfY29kZV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfb3ZlcnNpemVkX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfb3ZlcnNpemVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfb3ZlcnNpemVkX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9qYWJiZXJfZnJhbWVzID0geyAubmFtZSA9ICJyeF9qYWJiZXJfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gdGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBDUkMsIGNvZGUgZXJyb3IsIG9yIElFRUUgbGVuZ3RoIGNoZWNrIGVycm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2phYmJlcl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfbXR1X2NoZWNrX2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfbXR1X2NoZWNrX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIE1UVSBDaGVjayBFcnJvcnMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfbXR1X2NoZWNrX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9wcm9taXNjdW91c19mcmFtZXMgPSB7IC5uYW1lID0gInJ4X3Byb21pc2N1b3VzX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyBvbiB0aGlzIE5OSSB0aGF0IGFyZSBub3QgY29udHJvbCBwYWNrZXRzIGFuZCBoYXZlIGEgREEgdGhhdCBpcyBub3QgbWF0Y2hpbmcgd2l0aCB0aGUgUlggU0EuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9wcm9taXNjdW91c19mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdmxhbl9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X3ZsYW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuIFRoaXMgY291bnRzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdGFnZ2VkIGZyYW1lcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZG91YmxlX3ZsYW5fZnJhbWVzID0geyAubmFtZSA9ICJyeF9kb3VibGVfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3RydW5jYXRlZF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X3RydW5jYXRlZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB0cnVuY2F0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gUlggRklGTyBGdWxsLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF90cnVuY2F0ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3VuZGVyc2l6ZV9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X3VuZGVyc2l6ZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bmRlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bmRlcnNpemVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYWdtZW50ZWRfZnJhbWVzID0geyAubmFtZSA9ICJyeF9mcmFnbWVudGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFnbWVudGVkX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9ydW50X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfcnVudF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcnVudF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gInR4X2ZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY1IHRvIDEyNyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9ieXRlcyA9IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZ29vZF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2dvb2RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHVuaWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF91bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9tdWx0aWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9tdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgbXVsdGljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfcGF1c2VfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9wYXVzZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBwYXVzZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9wYXVzZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfcGZjX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfcGZjX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfcGZjX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9qYWJiZXJfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9qYWJiZXJfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBGQ1MuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfamFiYmVyX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mY3NfZXJyb3JzID0geyAubmFtZSA9ICJ0eF9mY3NfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgRkNTIGVycm9ycyBvbiB0aGlzIE5OSS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZmNzX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9jb250cm9sX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfY29udHJvbF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0NPTlRST0xfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2NvbnRyb2xfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X292ZXJzaXplX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfb3ZlcnNpemVfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9vdmVyc2l6ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhZ21lbnRlZF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2ZyYWdtZW50ZWRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZnJhZ21lbnRlZCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFnbWVudGVkX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9lcnJvcl9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2Vycm9yX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGVycm9yZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRVJST1JfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2Vycm9yX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF92bGFuX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9WTEFOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF92bGFuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9kb3VibGVfdmxhbl9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2RvdWJsZV92bGFuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGRvdWJsZSBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfcnVudF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X3J1bnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcnVudCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9ydW50X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF91bmRlcnJ1bl9mcmFtZXMgPSB7IC5uYW1lID0gInR4X3VuZGVycnVuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHVuZGVycnVuIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGh1cyBoYXBwZW5zIHdoZW4gYSBmcmFtZSBlbmNvdW50ZXJzIGEgTUFDIHVuZGVycnVuIChUeCBTeW5jIEZJRk8gcnVucyBvdXQgb2YgZGF0YSBiZWZvcmUgdGhlIGVuZCBvZiBwYWNrZXQpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfdW5kZXJydW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfYnl0ZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2dvb2RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bmljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZmNzX2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfY29udHJvbF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3BhdXNlX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcGZjX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bnN1cHBvcnRlZF9kYSwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfYWxpZ25tZW50X2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfbGVuZ3RoX291dF9vZl9yYW5nZSwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfY29kZV9lcnJvcnMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X292ZXJzaXplZF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2phYmJlcl9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X210dV9jaGVja19lcnJvcnMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3Byb21pc2N1b3VzX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdmxhbl9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2RvdWJsZV92bGFuX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdHJ1bmNhdGVkX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdW5kZXJzaXplX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhZ21lbnRlZF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3J1bnRfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9ieXRlcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9wYXVzZV9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3BmY19mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2phYmJlcl9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Zjc19lcnJvcnMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2NvbnRyb2xfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9vdmVyc2l6ZV9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYWdtZW50ZWRfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9lcnJvcl9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3ZsYW5fZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9kb3VibGVfdmxhbl9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3J1bnRfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF91bmRlcnJ1bl9mcmFtZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2RhdGFfZmllbGRzW10gPQoreworICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY1IHRvIDEyNyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2dvb2RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9nb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3VuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2Zjc19lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZmNzX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2NvbnRyb2xfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgY29udHJvbCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9jb250cm9sX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3BhdXNlX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhdXNlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3BhdXNlX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3BmY19mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBQRkMgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcGZjX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX29wY29kZSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFVuc3VwcG9ydGVkIE9wY29kZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bnN1cHBvcnRlZF9vcGNvZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF91bnN1cHBvcnRlZF9kYSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuc3VwcG9ydGVkIERBIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3Vuc3VwcG9ydGVkX2RhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfYWxpZ25tZW50X2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFsaWdubWVudCBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9hbGlnbm1lbnRfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfbGVuZ3RoX291dF9vZl9yYW5nZSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGxlbmd0aCBvdXQgb2YgcmFuZ2UgZXJyb3JzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2NvZGVfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgY29kZSBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9jb2RlX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X292ZXJzaXplZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBvdmVyc2l6ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfb3ZlcnNpemVkX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2phYmJlcl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiB0aGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIENSQywgY29kZSBlcnJvciwgb3IgSUVFRSBsZW5ndGggY2hlY2sgZXJyb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9qYWJiZXJfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfbXR1X2NoZWNrX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIE1UVSBDaGVjayBFcnJvcnMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9tdHVfY2hlY2tfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfcHJvbWlzY3VvdXNfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JIHRoYXQgYXJlIG5vdCBjb250cm9sIHBhY2tldHMgYW5kIGhhdmUgYSBEQSB0aGF0IGlzIG5vdCBtYXRjaGluZyB3aXRoIHRoZSBSWCBTQS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3ZsYW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuIFRoaXMgY291bnRzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdGFnZ2VkIGZyYW1lcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZG91YmxlX3ZsYW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZG91YmxlIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3RydW5jYXRlZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB0cnVuY2F0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gUlggRklGTyBGdWxsLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3RydW5jYXRlZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF91bmRlcnNpemVfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5kZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bmRlcnNpemVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhZ21lbnRlZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfcnVudF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3J1bnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY1IHRvIDEyNyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgYnl0ZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2dvb2RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9nb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X3VuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF91bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X3BhdXNlX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBhdXNlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3BhdXNlX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X3BmY19mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBQRkMgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfcGZjX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2phYmJlcl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIEZDUy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2phYmJlcl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mY3NfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgRkNTIGVycm9ycyBvbiB0aGlzIE5OSS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mY3NfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfY29udHJvbF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9jb250cm9sX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X292ZXJzaXplX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfb3ZlcnNpemVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhZ21lbnRlZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFnbWVudGVkX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2Vycm9yX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGVycm9yZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2Vycm9yX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X3ZsYW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuIFRoaXMgY291bnRzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdGFnZ2VkIGZyYW1lcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZG91YmxlX3ZsYW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZG91YmxlIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2RvdWJsZV92bGFuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X3J1bnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcnVudCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfcnVudF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF91bmRlcnJ1bl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmRlcnJ1biBmcmFtZXMgb24gdGhpcyBOTkkuIFRodXMgaGFwcGVucyB3aGVuIGEgZnJhbWUgZW5jb3VudGVycyBhIE1BQyB1bmRlcnJ1biAoVHggU3luYyBGSUZPIHJ1bnMgb3V0IG9mIGRhdGEgYmVmb3JlIHRoZSBlbmQgb2YgcGFja2V0KS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3VuZGVycnVuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfQorfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBzdGF0dXNfY2hhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9uZXdfc3RhdHVzID0geyAubmFtZSA9ICJuZXdfc3RhdHVzIiwgLmRlc2NyID0gIk5ldyBOTkkgTGluayBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEsIG5ld19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfbGluayA9IHsgLm5hbWUgPSAibGluayIsIC5kZXNjciA9ICJXaGljaCBOTkkgdGhpcyBpbmRpY2F0aW9uIHBlcnRhaW5zIHRvLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTElOSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgbGluayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXR1c19jaGFuZ2VkX3ByZXZpb3VzX2FjdGl2ZSA9IHsgLm5hbWUgPSAicHJldmlvdXNfYWN0aXZlIiwgLmRlc2NyID0gIldoaWNoIE5OSSB3YXMgYWN0aXZlIGJlZm9yZSB0aGlzIHN0YXR1cyBjaGFuZ2UuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9QUkVWSU9VU19BQ1RJVkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEsIHByZXZpb3VzX2FjdGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXR1c19jaGFuZ2VkX25ld19hY3RpdmUgPSB7IC5uYW1lID0gIm5ld19hY3RpdmUiLCAuZGVzY3IgPSAiV2hpY2ggTk5JIGlzIG5vdyBhY3RpdmUgYWZ0ZXIgdGhpcyBzdGF0dXMgY2hhbmdlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgbmV3X2FjdGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3N0YXR1c19jaGFuZ2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfbm5pX3N0YXR1c19jaGFuZ2VkX25ld19zdGF0dXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9saW5rLCAmcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfcHJldmlvdXNfYWN0aXZlLCAmcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfbmV3X2FjdGl2ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXR1cyIsIC5kZXNjciA9ICJOZXcgTk5JIExpbmsgU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgbmV3X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImxpbmsiLCAuZGVzY3IgPSAiV2hpY2ggTk5JIHRoaXMgaW5kaWNhdGlvbiBwZXJ0YWlucyB0by4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBsaW5rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfSwgeyAubmFtZSA9ICJwcmV2aW91c19hY3RpdmUiLCAuZGVzY3IgPSAiV2hpY2ggTk5JIHdhcyBhY3RpdmUgYmVmb3JlIHRoaXMgc3RhdHVzIGNoYW5nZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBwcmV2aW91c19hY3RpdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY29ubmVjdGlvbiB9LCB7IC5uYW1lID0gIm5ld19hY3RpdmUiLCAuZGVzY3IgPSAiV2hpY2ggTk5JIGlzIG5vdyBhY3RpdmUgYWZ0ZXIgdGhpcyBzdGF0dXMgY2hhbmdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEsIG5ld19hY3RpdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY29ubmVjdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEiLCAuZGVzY3IgPSAiTk5JIExpbmsgc3RhdHVzIGNoYW5nZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbm5pIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfbm5pX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9hdXRvX2NmZ19zdGF0dXNfY2hhbmdlZCA9IHsgLm5hbWUgPSAic3RhdHVzX2NoYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXR1c19jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSwgc3RhdHVzX2NoYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ubmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQsICZwcm9wX2Rlc2NyX25uaV9hdXRvX2NmZ19zdGF0dXNfY2hhbmdlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXR1c19jaGFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0dXNfY2hhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEsIHN0YXR1c19jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogbm5pX3NlcmRlcyA9PT09ICovCisKKy8qIEdyb3VwOiBubmlfc2VyZGVzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIE5JIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19rZXlfaW5zdGFuY2UgPSB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIlNlckRlcyBpbnN0YW5jZS46IDAgPSBQcmltYXJ5LCAxID0gU2Vjb25kYXJ5LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleSwgaW5zdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfaW5zdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc2VyZGVzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19rZXlfaW5zdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJpbnN0YW5jZSIsIC5kZXNjciA9ICJTZXJEZXMgaW5zdGFuY2UuOiAwID0gUHJpbWFyeSwgMSA9IFNlY29uZGFyeS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5LCBpbnN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19pbnN0YW5jZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3NlcmRlc19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaV9zZXJkZXMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF92Z2EgPSB7IC5uYW1lID0gInJ4X3ZnYSIsIC5kZXNjciA9ICJSeCBWZ2EiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3ZnYSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X3BmID0geyAubmFtZSA9ICJyeF9wZiIsIC5kZXNjciA9ICJQZWFraW5nIEZpbHRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9QRiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9wZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2xmcGYgPSB7IC5uYW1lID0gInJ4X2xmcGYiLCAuZGVzY3IgPSAiTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2xmcGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUxID0geyAubmFtZSA9ICJyeF9kZmUxIiwgLmRlc2NyID0gIlJ4IERGRTEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfZGZlMiA9IHsgLm5hbWUgPSAicnhfZGZlMiIsIC5kZXNjciA9ICJSeCBERkUyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfZGZlMyA9IHsgLm5hbWUgPSAicnhfZGZlMyIsIC5kZXNjciA9ICJSeCBERkUzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfZGZlNCA9IHsgLm5hbWUgPSAicnhfZGZlNCIsIC5kZXNjciA9ICJSeCBERkU0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNCksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfZGZlNSA9IHsgLm5hbWUgPSAicnhfZGZlNSIsIC5kZXNjciA9ICJSeCBERkU1IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfcHJlID0geyAubmFtZSA9ICJ0eF9wcmUiLCAuZGVzY3IgPSAiVHggUHJlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9wcmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9tYWluID0geyAubmFtZSA9ICJ0eF9tYWluIiwgLmRlc2NyID0gIlR4IE1haW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9tYWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfcG9zdDEgPSB7IC5uYW1lID0gInR4X3Bvc3QxIiwgLmRlc2NyID0gIlR4IFBvc3QxIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfcG9zdDIgPSB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLmRlc2NyID0gIlR4IFBvc3QyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MyA9IHsgLm5hbWUgPSAidHhfcG9zdDMiLCAuZGVzY3IgPSAiVHggUG9zdDMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X2FtcCA9IHsgLm5hbWUgPSAidHhfYW1wIiwgLmRlc2NyID0gIlR4IEFtcCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9BTVAsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfYW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3NlcmRlc19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF92Z2EsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X3BmLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9sZnBmLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUxLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUyLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUzLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmU0LCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmU1LCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wcmUsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X21haW4sICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X3Bvc3QxLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MiwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfcG9zdDMsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X2FtcCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF92Z2EiLCAuZGVzY3IgPSAiUnggVmdhIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF92Z2EpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9wZiIsIC5kZXNjciA9ICJQZWFraW5nIEZpbHRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfcGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9sZnBmIiwgLmRlc2NyID0gIkxvdyBGcmVxdWVuY3kgUGVha2luZyBGaWx0ZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2xmcGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9kZmUxIiwgLmRlc2NyID0gIlJ4IERGRTEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9kZmUyIiwgLmRlc2NyID0gIlJ4IERGRTIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTMiLCAuZGVzY3IgPSAiUnggREZFMyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlNCIsIC5kZXNjciA9ICJSeCBERkU0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9kZmU1IiwgLmRlc2NyID0gIlJ4IERGRTUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInR4X3ByZSIsIC5kZXNjciA9ICJUeCBQcmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3ByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR4X21haW4iLCAuZGVzY3IgPSAiVHggTWFpbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfbWFpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR4X3Bvc3QxIiwgLmRlc2NyID0gIlR4IFBvc3QxIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLmRlc2NyID0gIlR4IFBvc3QyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDMiLCAuZGVzY3IgPSAiVHggUG9zdDMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9hbXAiLCAuZGVzY3IgPSAiVHggQW1wIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9hbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogc29mdHdhcmVfZXJyb3IgPT09PSAqLworCisvKiBHcm91cDogc29mdHdhcmVfZXJyb3IgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zb2Z0d2FyZV9lcnJvcl9rZXlfcmVzZXJ2ZWQgPSB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfUkVTRVJWRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zb2Z0d2FyZV9lcnJvcl9rZXlfaWR4ID0geyAubmFtZSA9ICJpZHgiLCAuZGVzY3IgPSAiSW5kZXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXksIGlkeCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBzb2Z0d2FyZV9lcnJvcl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9zb2Z0d2FyZV9lcnJvcl9rZXlfcmVzZXJ2ZWQsICZwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2tleV9pZHggfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpZHgiLCAuZGVzY3IgPSAiSW5kZXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSwgaWR4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogc29mdHdhcmVfZXJyb3IgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zb2Z0d2FyZV9lcnJvcl9jZmdfZW50cnkgPSB7IC5uYW1lID0gImVudHJ5IiwgLmRlc2NyID0gIkVudHJ5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX0VOVFJZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhLCBlbnRyeSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N3X2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igc29mdHdhcmVfZXJyb3JfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfc29mdHdhcmVfZXJyb3JfY2ZnX2VudHJ5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlbnRyeSIsIC5kZXNjciA9ICJFbnRyeSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEsIGVudHJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3dfZXJyb3IgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB0cnhfY2FsaWJyYXRpb24gPT09PSAqLworCisvKiBHcm91cDogdHJ4X2NhbGlicmF0aW9uIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2tleV9yZXNlcnZlZCA9IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKSIsIC5hY2Nlc3MgPSAwLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0cnhfY2FsaWJyYXRpb25fa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2tleV9yZXNlcnZlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogdHJ4X2NhbGlicmF0aW9uIC0gc3RhcnRfY2FwdHVyZV93aW5kb3cgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd190cmlnZ2VyID0geyAubmFtZSA9ICJ0cmlnZ2VyIiwgLmRlc2NyID0gInRyaWdnZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHRyaWdnZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdHJvYmUgPSB7IC5uYW1lID0gInN0cm9iZSIsIC5kZXNjciA9ICJzdHJvYmUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUUk9CRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgc3Ryb2JlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3dpbmRvd19tb2RlID0geyAubmFtZSA9ICJ3aW5kb3dfbW9kZSIsIC5kZXNjciA9ICJ3aW5kb3cgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHdpbmRvd19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udSBpZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3RyaWdnZXJfcG9zaXRpb24gPSB7IC5uYW1lID0gInRyaWdnZXJfcG9zaXRpb24iLCAuZGVzY3IgPSAidHJpZ2dlciBwb3NpdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUl9QT1NJVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgdHJpZ2dlcl9wb3NpdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlID0geyAubmFtZSA9ICJzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSIsIC5kZXNjciA9ICJlbmFibGUvZGlzYWJsZSBjb3JydXB0IHN0cm9iZSBmcm9tIE1BQyB0byB0ZXJtaW5hdGUgc3RhdCB3aW5kb3ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdGFydF9vZmZzZXQgPSB7IC5uYW1lID0gInN0YXJ0X29mZnNldCIsIC5kZXNjciA9ICJzdGFydCBvZmZzZXQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgc3RhcnRfb2Zmc2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19lbmRfb2Zmc2V0ID0geyAubmFtZSA9ICJlbmRfb2Zmc2V0IiwgLmRlc2NyID0gImVuZCBvZmZzZXQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX0VORF9PRkZTRVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIGVuZF9vZmZzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X251bWJlcl9vZl9jeWNsZXMgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGN5Y2xlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfTlVNQkVSX09GX0NZQ0xFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgbnVtYmVyX29mX2N5Y2xlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19wb25fbmksICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd190cmlnZ2VyLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfc3Ryb2JlLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfd2luZG93X21vZGUsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19vbnVfaWQsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd190cmlnZ2VyX3Bvc2l0aW9uLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdGFydF9vZmZzZXQsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19lbmRfb2Zmc2V0LCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfbnVtYmVyX29mX2N5Y2xlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gInBvbl9uaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInRyaWdnZXIiLCAuZGVzY3IgPSAidHJpZ2dlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHRyaWdnZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlciB9LCB7IC5uYW1lID0gInN0cm9iZSIsIC5kZXNjciA9ICJzdHJvYmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdHJvYmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgfSwgeyAubmFtZSA9ICJ3aW5kb3dfbW9kZSIsIC5kZXNjciA9ICJ3aW5kb3cgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHdpbmRvd19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udSBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0cmlnZ2VyX3Bvc2l0aW9uIiwgLmRlc2NyID0gInRyaWdnZXIgcG9zaXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCB0cmlnZ2VyX3Bvc2l0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gfSwgeyAubmFtZSA9ICJzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSIsIC5kZXNjciA9ICJlbmFibGUvZGlzYWJsZSBjb3JydXB0IHN0cm9iZSBmcm9tIE1BQyB0byB0ZXJtaW5hdGUgc3RhdCB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXJ0X29mZnNldCIsIC5kZXNjciA9ICJzdGFydCBvZmZzZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdGFydF9vZmZzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZW5kX29mZnNldCIsIC5kZXNjciA9ICJlbmQgb2Zmc2V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgZW5kX29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfY3ljbGVzIiwgLmRlc2NyID0gIm51bWJlciBvZiBjeWNsZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBudW1iZXJfb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSIsIC5kZXNjciA9ICJzdGFydCBjYXB0dXJlIHdpbmRvdyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3dpbmRvdyA9IHsgLm5hbWUgPSAiZGF0YV93aW5kb3ciLCAuZGVzY3IgPSAiZGF0YSB3aW5kb3ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBkYXRhX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9zdHJvYmVfd2luZG93ID0geyAubmFtZSA9ICJzdHJvYmVfd2luZG93IiwgLmRlc2NyID0gInN0cm9iZSB3aW5kb3ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1NUUk9CRV9XSU5ET1csIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIHN0cm9iZV93aW5kb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9yaXNlX21pbl9taW4gPSB7IC5uYW1lID0gImVkZ2VfcmlzZV9taW5fbWluIiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtaW4gbWluIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUlOX01JTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21pbl9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9taW5fbWF4ID0geyAubmFtZSA9ICJlZGdlX3Jpc2VfbWluX21heCIsIC5kZXNjciA9ICJlZGdlIHJpc2UgbWluIG1heCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NQVgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfcmlzZV9taW5fbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWF4X21pbiA9IHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9taW4iLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1heCBtaW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWF4X21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9yaXNlX21heF9tYXggPSB7IC5uYW1lID0gImVkZ2VfcmlzZV9tYXhfbWF4IiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtYXggbWF4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01BWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21heF9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9taW5fbWluID0geyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21pbiIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWluIG1pbiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWluX21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21pbl9tYXggPSB7IC5uYW1lID0gImVkZ2VfZmFsbF9taW5fbWF4IiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtaW4gbWF4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUlOX01BWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9mYWxsX21pbl9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9tYXhfbWluID0geyAubmFtZSA9ICJlZGdlX2ZhbGxfbWF4X21pbiIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWF4IG1pbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9tYXhfbWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX2ZhbGxfbWF4X21heCA9IHsgLm5hbWUgPSAiZWRnZV9mYWxsX21heF9tYXgiLCAuZGVzY3IgPSAiZWRnZSBmYWxsIG1heCBtYXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWF4X21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3dpbmRvdywgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX3N0cm9iZV93aW5kb3csICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWluX21pbiwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9taW5fbWF4LCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9yaXNlX21heF9taW4sICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWF4X21heCwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9taW5fbWluLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21pbl9tYXgsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX2ZhbGxfbWF4X21pbiwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9tYXhfbWF4LCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkYXRhX3dpbmRvdyIsIC5kZXNjciA9ICJkYXRhIHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGRhdGFfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IH0sIHsgLm5hbWUgPSAic3Ryb2JlX3dpbmRvdyIsIC5kZXNjciA9ICJzdHJvYmUgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgc3Ryb2JlX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9taW5fbWluIiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtaW4gbWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21pbl9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21pbl9tYXgiLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1pbiBtYXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWluX21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX3Jpc2VfbWF4X21pbiIsIC5kZXNjciA9ICJlZGdlIHJpc2UgbWF4IG1pbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfcmlzZV9tYXhfbWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9tYXhfbWF4IiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtYXggbWF4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21heF9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZWRnZV9mYWxsX21pbl9taW4iLCAuZGVzY3IgPSAiZWRnZSBmYWxsIG1pbiBtaW4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9mYWxsX21pbl9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZWRnZV9mYWxsX21pbl9tYXgiLCAuZGVzY3IgPSAiZWRnZSBmYWxsIG1pbiBtYXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWluX21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWF4X21pbiIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWF4IG1pbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9tYXhfbWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWF4IiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtYXggbWF4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9mYWxsX21heF9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQ2FwdHVyZSB3aW5kb3cgYW5kIHN0YXRpc3RpYyBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogdHJ4X2NhbGlicmF0aW9uIC0gc3RvcF9jYXB0dXJlX3dpbmRvdyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gInBvbl9uaSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gInBvbl9uaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEiLCAuZGVzY3IgPSAic3RvcCBjYXB0dXJlIHdpbmRvdyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEsIGNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25fYWxsb2MgPT09PSAqLworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19rZXlfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXksIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2tleV9wb25fbmksICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2tleV9hbGxvY19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBBbGxvYyBJRCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19zbGEgPSB7IC5uYW1lID0gInNsYSIsIC5kZXNjciA9ICJBbGxvYyBJRCBTTEEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgc2xhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FsbG9jX3NsYSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhlIGFsbG9jIElEIGlzIGFzc2lnbmVkIHRvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jZmdfY29sbGVjdF9zdGF0cyA9IHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciB0aGlzIGFsbG9jIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBjb2xsZWN0X3N0YXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfY2ZnX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jZmdfc2xhLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jZmdfb251X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jZmdfY29sbGVjdF9zdGF0cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBBbGxvYyBJRCBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfSwgeyAubmFtZSA9ICJzbGEiLCAuZGVzY3IgPSAiQWxsb2MgSUQgU0xBIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgc2xhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FsbG9jX3NsYSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhlIGFsbG9jIElEIGlzIGFzc2lnbmVkIHRvIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImNvbGxlY3Rfc3RhdHMiLCAuZGVzY3IgPSAiRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgdGhpcyBhbGxvYyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEsIGNvbGxlY3Rfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJuZXcgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAibmV3IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gZ2V0X3N0YXRzICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX251bV9vZl9jeWNsZXMgPSB7IC5uYW1lID0gIm51bV9vZl9jeWNsZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSwgbnVtX29mX2N5Y2xlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19nZXRfc3RhdHNfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfbnVtX29mX2N5Y2xlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibnVtX29mX2N5Y2xlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGN5Y2xlcyB0byBydW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSwgbnVtX29mX2N5Y2xlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhIiwgLmRlc2NyID0gIlJ1biBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIGEgZ2l2ZW4gcGVyaW9kIG9mIHRpbWUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2VfbnNyX3VzZWQgPSB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX3VzZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgdXNlZCB3b3JkcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl91c2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfYWxsb2NhdGVkID0geyAubmFtZSA9ICJhdmVyYWdlX25zcl9hbGxvY2F0ZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgYWxsb2NhdGVkIHdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfYWxsb2NhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9zcl9yZXBvcnQgPSB7IC5uYW1lID0gImF2ZXJhZ2Vfc3JfcmVwb3J0IiwgLmRlc2NyID0gIkF2ZXJhZ2UgU1IgcmVwb3J0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX3NyX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfdXNlZCwgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9zcl9yZXBvcnQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX3VzZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgdXNlZCB3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl91c2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgd29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfYWxsb2NhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImF2ZXJhZ2Vfc3JfcmVwb3J0IiwgLmRlc2NyID0gIkF2ZXJhZ2UgU1IgcmVwb3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2Vfc3JfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJDb2xsZWN0ZWQgYWxsb2MgSUQgc3RhdGlzdGljcyBmcm9tIGdldF9zdGF0cyBvcGVyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBzZXRfc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfc3RhdGUgPSB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldHMgdGhlIGFsbG9jJ3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2Nfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFsbG9jIElEIHJlY2VpdmVkIGJ5dGVzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfcnhfYnl0ZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYWxsb2MgSUQgcmVjZWl2ZWQgYnl0ZXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2Nfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfYXV0b19jZmdfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2NfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfYXV0b19jZmdfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IHhncG9uX2dlbV9wb3J0ID09PT0gKi8KKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfa2V5X2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJHRU0gUE9SVCBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5LCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9nZW1fcG9ydF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9rZXlfZ2VtX3BvcnRfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIkdFTSBQT1JUIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJHRU0gcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGlzIEdFTSBwb3J0IGlzIGFzc2lnbmVkIHRvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfZ2VtX3BvcnRfc3RhdGUgPSB7IC5uYW1lID0gImdlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgR0VNIHBvcnQgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGdlbV9wb3J0X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfZW5jcnlwdGlvbl9tb2RlID0geyAubmFtZSA9ICJlbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfRU5DUllQVElPTl9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBlbmNyeXB0aW9uX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX3Vwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlID0geyAubmFtZSA9ICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIsIC5kZXNjciA9ICJUaGUgZGVzdGluYXRpb24gcXVldWUgb2YgdGhlIHBhY2tldHMgYXJyaXZpbmcgb24gdGhpcyBHRU0gUG9ydCBvbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBHRU0gUG9ydCBJRCBpbiB0aGUgT0xUIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2dlbV9wb3J0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19jb25maWd1cmF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfb251X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfZ2VtX3BvcnRfc3RhdGUsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19lbmNyeXB0aW9uX21vZGUsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ191cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRoaXMgR0VNIHBvcnQgaXMgYXNzaWduZWQgdG8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBHRU0gcG9ydCBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGdlbV9wb3J0X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgfSwgeyAubmFtZSA9ICJlbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGVuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIsIC5kZXNjciA9ICJUaGUgZGVzdGluYXRpb24gcXVldWUgb2YgdGhlIHBhY2tldHMgYXJyaXZpbmcgb24gdGhpcyBHRU0gUG9ydCBvbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIEdFTSBQb3J0IElEIGluIHRoZSBPTFQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfdHhfYnl0ZXMgPSB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRYIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X3R4X3BhY2tldHMgPSB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVFggcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfcnhfcGFja2V0cyA9IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJSWCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUlggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2dlbV9wb3J0X3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X3R4X2J5dGVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X3R4X3BhY2tldHMsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfcnhfcGFja2V0cywgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9yeF9ieXRlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRYIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVFggcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAiUlggcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCByeF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlJYIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9nZW1fcG9ydCAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9nZW1fcG9ydCAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IHhncG9uX2l3ZiA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl9pd2YgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9pd2Zfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9pd2Zfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25faXdmX2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2l3Zl9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2l3Zl9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2Zfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2l3ZiAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2l3Zl9jZmdfdXNfb3RhZ19kaXJlY3RfdHBpZCA9IHsgLm5hbWUgPSAidXNfb3RhZ19kaXJlY3RfdHBpZCIsIC5kZXNjciA9ICJUUElEIHZhbHVlIG9mIHRoZSBWTEFOIHRhZyBhZGRlZCB0byB1cHN0cmVhbSBwYWNrZXQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSwgdXNfb3RhZ19kaXJlY3RfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25faXdmX2NmZ19kc190cGlkID0geyAubmFtZSA9ICJkc190cGlkIiwgLmRlc2NyID0gIlBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfRFNfVFBJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEsIGRzX3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25faXdmX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2l3Zl9jZmdfdXNfb3RhZ19kaXJlY3RfdHBpZCwgJnByb3BfZGVzY3JfeGdwb25faXdmX2NmZ19kc190cGlkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidXNfb3RhZ19kaXJlY3RfdHBpZCIsIC5kZXNjciA9ICJUUElEIHZhbHVlIG9mIHRoZSBWTEFOIHRhZyBhZGRlZCB0byB1cHN0cmVhbSBwYWNrZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSwgdXNfb3RhZ19kaXJlY3RfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH0sIHsgLm5hbWUgPSAiZHNfdHBpZCIsIC5kZXNjciA9ICJQYWNrZXRzIG1hcmtlZCB3aXRoIG9uZSBvZiB0aGUgZml2ZSBjb25maWd1cmVkIERTIFRQSUQgb3B0aW9ucyB3aWxsIGJlIGZvcndhcmRlZCwgYWxsIHRoZSByZXN0IHdpbGwgYmUgZHJvcHBlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhLCBkc190cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl81X2hleCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25fbmkgPT09PSAqLworCisvKiBHcm91cDogeGdwb25fbmkgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9rZXlfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2h3X3Bvbl9pZCA9IHsgLm5hbWUgPSAiaHdfcG9uX2lkIiwgLmRlc2NyID0gIjUxIGJpdCBQT04gaWRlbnRpZmllci4gVGhpcyBhdHRyaWJ1dGUgaXMgcGFydCBvZiB0aGUgZG93bnN0cmVhbSBwaHlzaWNhbCBzeW5jaHJvbml6YXRpb24gYmxvY2sgKFBTQmQpIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9IV19QT05fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGh3X3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2h3X3Bvbl9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hdmFpbGFibGVfYmFuZHdpZHRoID0geyAubmFtZSA9ICJhdmFpbGFibGVfYmFuZHdpZHRoIiwgLmRlc2NyID0gIlBPTiBhdmFpbGFibGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYXZhaWxhYmxlX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX251bWJlcl9vZl9hY3RpdmVfb251cyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhY3RpdmUgT05VcyBvbiB0aGUgUE9OIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wb25fc3RhdHVzID0geyAubmFtZSA9ICJwb25fc3RhdHVzIiwgLmRlc2NyID0gIlBPTiBzdGF0dXMgcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wb25fZGlzdGFuY2UgPSB7IC5uYW1lID0gInBvbl9kaXN0YW5jZSIsIC5kZXNjciA9ICJQT04gZGlzdGFuY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcG9uX2Rpc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Jhbmdpbmdfd2luZG93X3NpemUgPSB7IC5uYW1lID0gInJhbmdpbmdfd2luZG93X3NpemUiLCAuZGVzY3IgPSAiUmFuZ2luZyB3aW5kb3cgc2l6ZSBpbiBCVyB1bml0cyAoNC1ieXRlIHdvcmRzIGZvciAyLjVHIHVwc3RyZWFtLCAxNi1ieXRlIGJsb2NrcyBmb3IgMTBHIHVwc3RyZWFtKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCByYW5naW5nX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19lcWRfY3ljbGVzX251bWJlciA9IHsgLm5hbWUgPSAiZXFkX2N5Y2xlc19udW1iZXIiLCAuZGVzY3IgPSAiSG93IG1hbnkgcmFuZ2luZyB3aW5kb3dzIGFyZSBvcGVuZWQgZHVyaW5nIGEgc2luZ2xlIE9OVSBhY3RpdmF0aW9uIHByb2Nlc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBlcWRfY3ljbGVzX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZHJpZnRfY29udHJvbCA9IHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC5kZXNjciA9ICJEcmlmdCBjb250cm9sIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZHJpZnRfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2xvc19hbGFybV90aHJlc2hvbGQgPSB7IC5uYW1lID0gImxvc19hbGFybV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiTE9TIGFsYXJtIHRocmVzaG9sZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbG9zX2FsYXJtX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19sb3NfaW5pdGlhbF92YWx1ZSA9IHsgLm5hbWUgPSAibG9zX2luaXRpYWxfdmFsdWUiLCAuZGVzY3IgPSAiTE9TIGluaXRpYWwgdmFsdWUgZm9sbG93aW5nIFBPTiBhY3RpdmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbG9zX2luaXRpYWxfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfb251X2FsYXJtc190aHJlc2hvbGRzID0geyAubmFtZSA9ICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAuZGVzY3IgPSAiT05VIGFsYXJtcyB0aHJlc2hvbGRzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgb251X2FsYXJtc190aHJlc2hvbGRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Jlcl9tb25pdG9yID0geyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC5kZXNjciA9ICJCRVIgbW9uaXRvciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBiZXJfbW9uaXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfYWN0aXZhdGlvbiA9IHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAuZGVzY3IgPSAiT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgb251X2FjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19zbl9hY3F1aXNpdGlvbiA9IHsgLm5hbWUgPSAic25fYWNxdWlzaXRpb24iLCAuZGVzY3IgPSAiU2VyaWFsIE51bWJlciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBzbl9hY3F1aXNpdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2tleV9leGNoYW5nZSA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwga2V5X2V4Y2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWciLCAuZGVzY3IgPSAicHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGVidWcgIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19ERUJVRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlID0geyAubmFtZSA9ICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSA9IHsgLm5hbWUgPSAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIG5vbiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcG93ZXJfbWFuYWdlbWVudCA9IHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgPSB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC5kZXNjciA9ICJUQkQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgPSB7IC5uYW1lID0gInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciLCAuZGVzY3IgPSAiUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZGJhX21vZGUgPSB7IC5uYW1lID0gImRiYV9tb2RlIiwgLmRlc2NyID0gIkRCQSBtb2RlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZGJhX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfbW9kZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wbG9hbV9oYW5kbGluZyA9IHsgLm5hbWUgPSAicGxvYW1faGFuZGxpbmciLCAuZGVzY3IgPSAiUGxvYW0gaGFuZGxpbmcgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHBsb2FtX2hhbmRsaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbWluX2RhdGFfYWxsb2NfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX2FsbG9jX2lkIiwgLmRlc2NyID0gIk1pbiBkYXRhIEFsbG9jIElEIHZhbHVlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbWluX2RhdGFfYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX21pbl9kYXRhX2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJNaW4gZGF0YSBYR0VNIHBvcnQgSUQgdmFsdWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbXVsdGljYXN0X2tleSA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2tleSIsIC5kZXNjciA9ICJNdWx0aWNhc3QgWEdFTSBwb3J0cyBlbmNyeXB0aW9uIGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG11bHRpY2FzdF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3ByYnNfY2hlY2tlciA9IHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJic19nZW5lcmF0b3IgPSB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiA9IHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAuZGVzY3IgPSAiT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ191c19iYW5kd2lkdGhfbGltaXQgPSB7IC5uYW1lID0gInVzX2JhbmR3aWR0aF9saW1pdCIsIC5kZXNjciA9ICJUb3RhbCBQT04gdXBzdHJlYW0gYmFuZHdpZHRoIGxpbWl0IGluIGJ5dGVzIHBlciBzZWNvbmQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHVzX2JhbmR3aWR0aF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYWxsX29udXMgPSB7IC5uYW1lID0gImFsbF9vbnVzIiwgLmRlc2NyID0gIkFsbCBPTlVzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGFsbF9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hbGxfbWNhc3RfZ2VtX3BvcnRzID0geyAubmFtZSA9ICJhbGxfbWNhc3RfZ2VtX3BvcnRzIiwgLmRlc2NyID0gIkFsbCBtdWx0aWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYWxsX21jYXN0X2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kZWJ1ZyA9IHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiUE9OIE5JIGRlYnVnIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2RlYnVnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcyA9IHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIk9OVSB1cGdyYWRlIHBhcmFtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9wYXJhbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kc19mZWNfbW9kZSA9IHsgLm5hbWUgPSAiZHNfZmVjX21vZGUiLCAuZGVzY3IgPSAiRFMgRkVDIG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkc19mZWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZGJhX3R5cGUgPSB7IC5uYW1lID0gImRiYV90eXBlIiwgLmRlc2NyID0gIkRCQSBpbXBsZW1lbnRhdGlvbiB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZGJhX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfdHVuaW5nID0geyAubmFtZSA9ICJvbnVfdHVuaW5nIiwgLmRlc2NyID0gIm9udSB0dW5pbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV90dW5pbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfaHdfcG9uX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYXZhaWxhYmxlX2JhbmR3aWR0aCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX251bWJlcl9vZl9hY3RpdmVfb251cywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvbl9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wb25fZGlzdGFuY2UsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19yYW5naW5nX3dpbmRvd19zaXplLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZXFkX2N5Y2xlc19udW1iZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kcmlmdF9jb250cm9sLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbG9zX2FsYXJtX3RocmVzaG9sZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2xvc19pbml0aWFsX3ZhbHVlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfb251X2FsYXJtc190aHJlc2hvbGRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYmVyX21vbml0b3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfYWN0aXZhdGlvbiwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3NuX2FjcXVpc2l0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfa2V5X2V4Y2hhbmdlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmcsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvd2VyX21hbmFnZW1lbnQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZGJhX21vZGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wbG9hbV9oYW5kbGluZywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX21pbl9kYXRhX2FsbG9jX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbWluX2RhdGFfZ2VtX3BvcnRfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19tdWx0aWNhc3Rfa2V5LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJic19jaGVja2VyLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJic19nZW5lcmF0b3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfdXNfYmFuZHdpZHRoX2xpbWl0LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYWxsX29udXMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hbGxfbWNhc3RfZ2VtX3BvcnRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZGVidWcsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfdXBncmFkZV9wYXJhbXMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kc19mZWNfbW9kZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RiYV90eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfb251X3R1bmluZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaHdfcG9uX2lkIiwgLmRlc2NyID0gIjUxIGJpdCBQT04gaWRlbnRpZmllci4gVGhpcyBhdHRyaWJ1dGUgaXMgcGFydCBvZiB0aGUgZG93bnN0cmVhbSBwaHlzaWNhbCBzeW5jaHJvbml6YXRpb24gYmxvY2sgKFBTQmQpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgaHdfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaHdfcG9uX2lkIH0sIHsgLm5hbWUgPSAiYXZhaWxhYmxlX2JhbmR3aWR0aCIsIC5kZXNjciA9ICJQT04gYXZhaWxhYmxlIGJhbmR3aWR0aCBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYXZhaWxhYmxlX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhY3RpdmUgT05VcyBvbiB0aGUgUE9OIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAuZGVzY3IgPSAiUE9OIHN0YXR1cyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcG9uX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0dXMgfSwgeyAubmFtZSA9ICJwb25fZGlzdGFuY2UiLCAuZGVzY3IgPSAiUE9OIGRpc3RhbmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcG9uX2Rpc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlIH0sIHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIHdpbmRvdyBzaXplIGluIEJXIHVuaXRzICg0LWJ5dGUgd29yZHMgZm9yIDIuNUcgdXBzdHJlYW0sIDE2LWJ5dGUgYmxvY2tzIGZvciAxMEcgdXBzdHJlYW0pIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcmFuZ2luZ193aW5kb3dfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC5kZXNjciA9ICJIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGVxZF9jeWNsZXNfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImRyaWZ0X2NvbnRyb2wiLCAuZGVzY3IgPSAiRHJpZnQgY29udHJvbCBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkcmlmdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgfSwgeyAubmFtZSA9ICJsb3NfYWxhcm1fdGhyZXNob2xkIiwgLmRlc2NyID0gIkxPUyBhbGFybSB0aHJlc2hvbGQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBsb3NfYWxhcm1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9zX2luaXRpYWxfdmFsdWUiLCAuZGVzY3IgPSAiTE9TIGluaXRpYWwgdmFsdWUgZm9sbG93aW5nIFBPTiBhY3RpdmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbG9zX2luaXRpYWxfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAuZGVzY3IgPSAiT05VIGFsYXJtcyB0aHJlc2hvbGRzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgfSwgeyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC5kZXNjciA9ICJCRVIgbW9uaXRvciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBiZXJfbW9uaXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uIiwgLmRlc2NyID0gIk9OVSBhY3RpdmF0aW9uIGNvbnRyb2wgcGFyYW1ldGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gfSwgeyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHNuX2FjcXVpc2l0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGtleV9leGNoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWciLCAuZGVzY3IgPSAicHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGVidWcgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyB9LCB7IC5uYW1lID0gImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB9LCB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBub24gUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcG93ZXJfbWFuYWdlbWVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MiLCAuZGVzY3IgPSAiVEJEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIH0sIHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC5kZXNjciA9ICJQZXJpb2RpYyBTdGFuZGJ5IFBPTiBtb25pdG9yaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgfSwgeyAubmFtZSA9ICJkYmFfbW9kZSIsIC5kZXNjciA9ICJEQkEgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRiYV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGJhX21vZGUgfSwgeyAubmFtZSA9ICJwbG9hbV9oYW5kbGluZyIsIC5kZXNjciA9ICJQbG9hbSBoYW5kbGluZyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcGxvYW1faGFuZGxpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX2FsbG9jX2lkIiwgLmRlc2NyID0gIk1pbiBkYXRhIEFsbG9jIElEIHZhbHVlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbWluX2RhdGFfYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWluX2RhdGFfZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiTWluIGRhdGEgWEdFTSBwb3J0IElEIHZhbHVlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2tleSIsIC5kZXNjciA9ICJNdWx0aWNhc3QgWEdFTSBwb3J0cyBlbmNyeXB0aW9uIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtdWx0aWNhc3Rfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9LCB7IC5uYW1lID0gImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIiwgLmRlc2NyID0gIk9wdGlvbiB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgZGVhY3RpdmF0aW9uIG9mIE9OVXMgZHVlIHRvIGFsYXJtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gfSwgeyAubmFtZSA9ICJ1c19iYW5kd2lkdGhfbGltaXQiLCAuZGVzY3IgPSAiVG90YWwgUE9OIHVwc3RyZWFtIGJhbmR3aWR0aCBsaW1pdCBpbiBieXRlcyBwZXIgc2Vjb25kLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHVzX2JhbmR3aWR0aF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGxfb251cyIsIC5kZXNjciA9ICJBbGwgT05VcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBQT04uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYWxsX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIH0sIHsgLm5hbWUgPSAiYWxsX21jYXN0X2dlbV9wb3J0cyIsIC5kZXNjciA9ICJBbGwgbXVsdGljYXN0IEdFTSBwb3J0cyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBQT04uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYWxsX21jYXN0X2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB9LCB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gIlBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZGVidWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJPTlUgdXBncmFkZSBwYXJhbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9wYXJhbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB9LCB7IC5uYW1lID0gImRzX2ZlY19tb2RlIiwgLmRlc2NyID0gIkRTIEZFQyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZHNfZmVjX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZGJhX3R5cGUiLCAuZGVzY3IgPSAiREJBIGltcGxlbWVudGF0aW9uIHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkYmFfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RiYV90eXBlIH0sIHsgLm5hbWUgPSAib251X3R1bmluZyIsIC5kZXNjciA9ICJvbnUgdHVuaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgb251X3R1bmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfZmVjX2NvZGV3b3JkcyA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJSZWNlaXZlIEZFQyBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2JpcDMyX2J5dGVzID0geyAubmFtZSA9ICJiaXAzMl9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyBwcm90ZWN0ZWQgYnkgYmlwMzIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDMyX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYmlwMzJfZXJyb3JzID0geyAubmFtZSA9ICJiaXAzMl9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYmlwMzIgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgYmlwMzJfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGd0Y19oZWFkZXJzID0geyAubmFtZSA9ICJyeF94Z3RjX2hlYWRlcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgWEdUQyBoZWFkZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19IRUFERVJTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y19oZWFkZXJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGd0Y19jb3JyZWN0ZWQgPSB7IC5uYW1lID0gInJ4X3hndGNfY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hndGNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGd0Y191bmNvcnJlY3RlZCA9IHsgLm5hbWUgPSAicnhfeGd0Y191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y191bmNvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW0gPSB7IC5uYW1lID0gInJ4X3hnZW0iLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgWEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGdlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW1fZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfeGdlbV9kcm9wcGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z2VtX2lkbGUgPSB7IC5uYW1lID0gInJ4X3hnZW1faWRsZSIsIC5kZXNjciA9ICJSZWNlaXZlZCBpZGxlIFhHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGdlbV9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbV9jb3JyZWN0ZWQgPSB7IC5uYW1lID0gInJ4X3hnZW1fY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGNvcnJlY3RlZCBYR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGdlbV9jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9jcmNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIHdpdGggQ1JDIGVycm9yIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfZnJhZ21lbnRfZXJyb3IgPSB7IC5uYW1lID0gInJ4X2ZyYWdtZW50X2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGZyYWdtZW50IGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfZnJhZ21lbnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wYWNrZXRzX2Ryb3BwZWQgPSB7IC5uYW1lID0gInJ4X3BhY2tldHNfZHJvcHBlZCIsIC5kZXNjciA9ICJHbG9iYWwgZHJvcHBlZCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fc2hvcnQgPSB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX3Nob3J0IiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBzaG9ydCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fc2hvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9kcm9wcGVkX3Rvb19sb25nID0geyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19sb25nIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIGxvbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fbG9uZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2tleV9lcnJvciA9IHsgLm5hbWUgPSAicnhfa2V5X2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGtleSBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9rZXlfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9wbG9hbXMgPSB7IC5uYW1lID0gInR4X3Bsb2FtcyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wbG9hbXNfZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfdmFsaWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX3ZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc192YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2ludmFsaWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2FtcyA9IHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19lcnJvciA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGVycm9yIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2NwdSA9IHsgLm5hbWUgPSAicnhfY3B1IiwgLmRlc2NyID0gIlJlY2VpdmVkIENQVSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfb21jaSA9IHsgLm5hbWUgPSAicnhfb21jaSIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfcGFja2V0cyA9IHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF94Z2VtID0geyAubmFtZSA9ICJ0eF94Z2VtIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIFhHRU0gZnJhZ21lbnRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3hnZW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9jcHUgPSB7IC5uYW1lID0gInR4X2NwdSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2NwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X29tY2kgPSB7IC5uYW1lID0gInR4X29tY2kiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgT01DSSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQgPSB7IC5uYW1lID0gInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoID0geyAubmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfdHBpZF9taXNzID0geyAubmFtZSA9ICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIFRQSUQgbWlzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF90cGlkX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9kcm9wcGVkX3ZpZF9taXNzID0geyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcGVkIGR1ZSB0byBWSUQgbWlzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3ZpZF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2ZlY19jb2Rld29yZHMsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYmlwMzJfYnl0ZXMsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYmlwMzJfZXJyb3JzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hndGNfaGVhZGVycywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX2NvcnJlY3RlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX3VuY29ycmVjdGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW0sICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbV9kcm9wcGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW1faWRsZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z2VtX2NvcnJlY3RlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9jcmNfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfZnJhZ21lbnRfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGFja2V0c19kcm9wcGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX3Nob3J0LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX2xvbmcsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfa2V5X2Vycm9yLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X3Bsb2FtcywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wbG9hbXNfZHJvcHBlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc192YWxpZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc19pbnZhbGlkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2FtcywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wbG9hbXNfbm9uX2lkbGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zX2Vycm9yLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2NwdSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9vbWNpLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfcGFja2V0cywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF94Z2VtLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2NwdSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9vbWNpLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfdHBpZF9taXNzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfdmlkX21pc3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlJlY2VpdmUgRkVDIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJpcDMyX2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXAzMiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCBiaXAzMl9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJiaXAzMl9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYmlwMzIgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDMyX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF94Z3RjX2hlYWRlcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgWEdUQyBoZWFkZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hndGNfaGVhZGVycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF94Z3RjX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgWEdUQyBoZWFkZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hndGNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hndGNfdW5jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdW5jb3JyZWN0ZWQgWEdUQyBoZWFkZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hndGNfdW5jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfeGdlbSIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hnZW1fZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFhHRU0gSUQgZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW1fZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF94Z2VtX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBYR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfeGdlbV9jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW1fY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIHdpdGggQ1JDIGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFnbWVudF9lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBmcmFnbWVudCBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfZnJhZ21lbnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX3Nob3J0IiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBzaG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19zaG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19sb25nIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIGxvbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fbG9uZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9rZXlfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQga2V5IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9rZXlfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGxvYW1zIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBQbG9hbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfbm9uX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGVycm9yIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfY3B1IiwgLmRlc2NyID0gIlJlY2VpdmVkIENQVSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2NwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3hnZW0iLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfeGdlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9jcHUiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgQ1BVIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X29tY2kiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgT01DSSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAuZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBUUElEIG1pc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF90cGlkX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF92aWRfbWlzcyIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BlZCBkdWUgdG8gVklEIG1pc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF92aWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHNldF9wb25fc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Bvbl9zdGF0ZSA9IHsgLm5hbWUgPSAicG9uX3N0YXRlIiwgLmRlc2NyID0gIlBPTiBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEsIHBvbl9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9wb25fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdGUiLCAuZGVzY3IgPSAiUE9OIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEsIHBvbl9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0IFBPTiBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHJlc2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcmVzZXRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBkaXNhYmxlX3NlcmlhbF9udW1iZXIgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCA9IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIiwgLmRlc2NyID0gIkRpc2FibGUgU2VyaWFsIE51bWJlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc2V0X29udV9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3NldF9vbnVfc3RhdGVfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4gIFRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtYXkgYmUgY29uZmlndXJlZCBieSB0aGUgWEdQT04gTkkgY29uZmlndXJhdGlvbiBvYmplY3QgOiB4Z3Bvbl9uaS5jZmcuc25fYWNxdWlzaXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBYR1BPTiBOSSBjb25maWd1cmF0aW9uIG9iamVjdCA6IHhncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgdGhlIG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBydW5fc3BlY2lhbF9id19tYXAgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfbnVtYmVyX29mX2N5Y2xlID0geyAubmFtZSA9ICJudW1iZXJfb2ZfY3ljbGUiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGN5Y2xlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9OVU1CRVJfT0ZfQ1lDTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEsIG51bWJlcl9vZl9jeWNsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9hbGxvY2F0aW9uX251bWJlciA9IHsgLm5hbWUgPSAiYWxsb2NhdGlvbl9udW1iZXIiLCAuZGVzY3IgPSAiYWxsb2NhdGlvbiBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0FMTE9DQVRJT05fTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhLCBhbGxvY2F0aW9uX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9id19tYXBfYXJyYXkgPSB7IC5uYW1lID0gImJ3X21hcF9hcnJheSIsIC5kZXNjciA9ICJidyBtYXAgYXJyYXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0JXX01BUF9BUlJBWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSwgYndfbWFwX2FycmF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX251bWJlcl9vZl9jeWNsZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2FsbG9jYXRpb25fbnVtYmVyLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfYndfbWFwX2FycmF5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJudW1iZXJfb2ZfY3ljbGUiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGN5Y2xlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSwgbnVtYmVyX29mX2N5Y2xlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYWxsb2NhdGlvbl9udW1iZXIiLCAuZGVzY3IgPSAiYWxsb2NhdGlvbiBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhLCBhbGxvY2F0aW9uX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImJ3X21hcF9hcnJheSIsIC5kZXNjciA9ICJidyBtYXAgYXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhLCBid19tYXBfYXJyYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhIiwgLmRlc2NyID0gIlJ1biBTcGVjaWFsIEJXIE1hcCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHJvZ3VlX2RldGVjdGlvbl93aW5kb3cgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3dpbmRvd190eXBlID0geyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHNpbGVudCBtZWFzdXJlbWVudCB0byBleGVjdXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2FsbG9jX2lkID0geyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBTExPQyBJRCB0byBzY2FuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0byBzY2FuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0geyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAuZGVzY3IgPSAiTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9TRUNPTkRfUkFOR0lOR19XSU5ET1csIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBzZWNvbmRfcmFuZ2luZ193aW5kb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd193aW5kb3dfdHlwZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19hbGxvY19pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfc2Vjb25kX3Jhbmdpbmdfd2luZG93IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiVHlwZSBvZiBzaWxlbnQgbWVhc3VyZW1lbnQgdG8gZXhlY3V0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBTExPQyBJRCB0byBzY2FuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdG8gc2NhbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic2Vjb25kX3Jhbmdpbmdfd2luZG93IiwgLmRlc2NyID0gIk5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHNlY29uZF9yYW5naW5nX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSIsIC5kZXNjciA9ICJSb2d1ZSBEZXRlY3Rpb24gV2luZG93IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcmV2aW91c19zdGF0ZSA9IHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAuZGVzY3IgPSAiUHJldmlvdXMgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHByZXZpb3VzX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJuZXcgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9yZXN1bHQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJldmlvdXNfc3RhdGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJwcmV2aW91c19zdGF0ZSIsIC5kZXNjciA9ICJQcmV2aW91cyBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBwcmV2aW91c19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJuZXcgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlN0YXRlIENoYW5nZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBsb3MgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9sb3Nfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2xvc19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2xvc19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2xvc19kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2xvc19kYXRhIiwgLmRlc2NyID0gIkxPUyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9vbnVzID0geyAubmFtZSA9ICJvbnVzIiwgLmRlc2NyID0gIk9OVXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhLCBvbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfb251cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVzIiwgLmRlc2NyID0gIk9OVXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEsIG9udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEiLCAuZGVzY3IgPSAiQWZ0ZXIgYSBzd2l0Y2hvdmVyIGlzIGNvbXBsZXRlIGFuZCBhbGwgT05VIHJhbmdpbmcgdGltZXMgaGF2ZSBzdGFiaWxpemVkLCB0aGlzIGluZGljYXRpb24gaXMgc2VudCB0byBpbmZvcm0gdGhlIGhvc3Qgb2YgYWxsIG5ldyBPTlUgRVFEcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgU3dpdGNob3ZlciBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX251bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZW5lcmd5X2RldGVjdF9zaWduYWwgPSB7IC5uYW1lID0gImVuZXJneV9kZXRlY3Rfc2lnbmFsIiwgLmRlc2NyID0gImVuZXJneSBkZXRlY3Qgc2lnbmFsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIGVuZXJneV9kZXRlY3Rfc2lnbmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9udW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyIiwgLmRlc2NyID0gIm51bWJlciBvZiBkZXRlY3RlZCBkZWxpbWl0ZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAuZGVzY3IgPSAiZW5lcmd5IGRldGVjdCBzaWduYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIGVuZXJneV9kZXRlY3Rfc2lnbmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiU3RhbmRieSBQT04gTW9uaXRvcmluZyBDeWNsZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBvbnVfZGlzY292ZXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfcmFuZ2luZ190aW1lID0geyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAicmFuZ2luZyB0aW1lIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251X2lkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyA9IHsgLm5hbWUgPSAidXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyIsIC5kZXNjciA9ICJVcHN0cmVhbSBsaW5lIHJhdGUgY2FwYWJpbGl0aWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkID0geyAubmFtZSA9ICJjdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkIiwgLmRlc2NyID0gIlRoZSBQT04tSUQgcmVjZWl2ZWQgYnkgdGhlIE9OVSBpbiBpdHMgY3VycmVudCBkb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX0RPV05TVFJFQU1fUE9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGN1cnJlbnRfZG93bnN0cmVhbV9wb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9jdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCA9IHsgLm5hbWUgPSAiY3VycmVudF91cHN0cmVhbV9wb25faWQiLCAuZGVzY3IgPSAiVGhlIFBPTi1JRCBvZiB0aGUgQ2hhbm5lbCBQcm9maWxlIGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHVwc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBpbiB3aGljaCB0aGUgT05VIGlzIHRyYW5zbWl0dGluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX1VQU1RSRUFNX1BPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBjdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2NhbGlicmF0aW9uX3JlY29yZCA9IHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIHJlY29yZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DQUxJQlJBVElPTl9SRUNPUkQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgY2FsaWJyYXRpb25fcmVjb3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfdHVuaW5nX2dyYW51bGFyaXR5ID0geyAubmFtZSA9ICJ0dW5pbmdfZ3JhbnVsYXJpdHkiLCAuZGVzY3IgPSAiVGhlIHR1bmluZyBncmFudWxhcml0eSBvZiB0aGUgT05VIHRyYW5zbWl0dGVkIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAxR2h6LiBWYWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZyAvIGRpdGhlcmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9UVU5JTkdfR1JBTlVMQVJJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgdHVuaW5nX2dyYW51bGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfc3RlcF90dW5pbmdfdGltZSA9IHsgLm5hbWUgPSAic3RlcF90dW5pbmdfdGltZSIsIC5kZXNjciA9ICJUaGUgdmFsdWUgb2YgdGhlIHR1bmluZyB0aW1lIGZvciBhIHNpbmdsZSBncmFudWxhcml0eSBzdGVwLCBleHByZXNzZWQgaW4gdW5pdCBvZiBQSFkgZnJhbWVzLiBUaGUgdmFsdWUgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcgLyBkaXRoZXJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBzdGVwX3R1bmluZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfYXR0ZW51YXRpb24gPSB7IC5uYW1lID0gImF0dGVudWF0aW9uIiwgLmRlc2NyID0gIlRoZSBPTlUgYXR0ZW51YXRpb24gaW4gc3RlcHMgb2YgM2RCIGF0IHRoZSB0aW1lIG9mIHRoZSBtZXNzYWdlIHRyYW5zbWlzc2lvbiBhcyBwYXJ0IG9mIHRoZSBwb3dlciBsZXZlbGxpbmcgcmVwb3J0LiBWYWx1ZSBvZiAwIHJlcHJlc2VudHMgdW4tYXR0ZW51YXRlZCB0cmFuc21pc3Npb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQVRURU5VQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzID0geyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlRoZSBPTlUgc3VwcG9ydHMgYXR0ZW51YXRpb24gbGV2ZWwgaW4gc3RlcCBvZiAzZEIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9zZXJpYWxfbnVtYmVyLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9yYW5naW5nX3RpbWUsICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX29udV9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcywgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfY3VycmVudF91cHN0cmVhbV9wb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2NhbGlicmF0aW9uX3JlY29yZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfdHVuaW5nX2dyYW51bGFyaXR5LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9zdGVwX3R1bmluZ190aW1lLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9hdHRlbnVhdGlvbiwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLmRlc2NyID0gInJhbmdpbmcgdGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJvbnVfaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlVwc3RyZWFtIGxpbmUgcmF0ZSBjYXBhYmlsaXRpZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHVwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIH0sIHsgLm5hbWUgPSAiY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCIsIC5kZXNjciA9ICJUaGUgUE9OLUlEIHJlY2VpdmVkIGJ5IHRoZSBPTlUgaW4gaXRzIGN1cnJlbnQgZG93bnN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGN1cnJlbnRfZG93bnN0cmVhbV9wb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJjdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCIsIC5kZXNjciA9ICJUaGUgUE9OLUlEIG9mIHRoZSBDaGFubmVsIFByb2ZpbGUgY29udGFpbmluZyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgdXBzdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIGluIHdoaWNoIHRoZSBPTlUgaXMgdHJhbnNtaXR0aW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBjdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImNhbGlicmF0aW9uX3JlY29yZCIsIC5kZXNjciA9ICJDYWxpYnJhdGlvbiByZWNvcmQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGNhbGlicmF0aW9uX3JlY29yZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB9LCB7IC5uYW1lID0gInR1bmluZ19ncmFudWxhcml0eSIsIC5kZXNjciA9ICJUaGUgdHVuaW5nIGdyYW51bGFyaXR5IG9mIHRoZSBPTlUgdHJhbnNtaXR0ZWQgZXhwcmVzc2VkIGluIHVuaXRzIG9mIDFHaHouIFZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE9OVSBkb2VzIG5vdCBzdXBwb3J0IGZpbmUgdHVuaW5nIC8gZGl0aGVyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCB0dW5pbmdfZ3JhbnVsYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLmRlc2NyID0gIlRoZSB2YWx1ZSBvZiB0aGUgdHVuaW5nIHRpbWUgZm9yIGEgc2luZ2xlIGdyYW51bGFyaXR5IHN0ZXAsIGV4cHJlc3NlZCBpbiB1bml0IG9mIFBIWSBmcmFtZXMuIFRoZSB2YWx1ZSAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZyAvIGRpdGhlcmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgc3RlcF90dW5pbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImF0dGVudWF0aW9uIiwgLmRlc2NyID0gIlRoZSBPTlUgYXR0ZW51YXRpb24gaW4gc3RlcHMgb2YgM2RCIGF0IHRoZSB0aW1lIG9mIHRoZSBtZXNzYWdlIHRyYW5zbWlzc2lvbiBhcyBwYXJ0IG9mIHRoZSBwb3dlciBsZXZlbGxpbmcgcmVwb3J0LiBWYWx1ZSBvZiAwIHJlcHJlc2VudHMgdW4tYXR0ZW51YXRlZCB0cmFuc21pc3Npb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGF0dGVudWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIsIC5kZXNjciA9ICJUaGUgT05VIHN1cHBvcnRzIGF0dGVudWF0aW9uIGxldmVsIGluIHN0ZXAgb2YgM2RCIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIERpc2NvdmVyZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBjcHVfcGFja2V0c19mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9lcnJvciA9IHsgLm5hbWUgPSAiZXJyb3IiLCAuZGVzY3IgPSAiVGhlIGVycm9yIHRoYXQgd2FzIGVuY291bnRlcmVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9nZW1fcG9ydF9pZCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIEdFTSBwb3J0IHRoYXQgY2F1c2VkIHRoZSBlcnJvci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2Vycm9yLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2dlbV9wb3J0X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXJyb3IiLCAuZGVzY3IgPSAiVGhlIGVycm9yIHRoYXQgd2FzIGVuY291bnRlcmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhLCBlcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhLCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEiLCAuZGVzY3IgPSAiQSBmYWlsdXJlIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIFwiY3B1X3BhY2tldHNcIiBwcm94eSBvcGVyYXRpb24uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gY3B1X3BhY2tldHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSA9IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2NhbGNfY3JjID0geyAubmFtZSA9ICJjYWxjX2NyYyIsIC5kZXNjciA9ICJjYWxjIGNyYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2dlbV9wb3J0X2xpc3QgPSB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAuZGVzY3IgPSAiZ2VtIHBvcnQgbGlzdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGdlbV9wb3J0X2xpc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19idWZmZXIgPSB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfY3B1X3BhY2tldHNfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfY2FsY19jcmMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2dlbV9wb3J0X2xpc3QsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAuZGVzY3IgPSAiZ2VtIHBvcnQgbGlzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgZ2VtX3BvcnRfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEiLCAuZGVzY3IgPSAiWEdQT04gQ1BVIHBhY2tldHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBicm9hZGNhc3RfcGxvYW1fcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9wbG9hbSA9IHsgLm5hbWUgPSAicGxvYW0iLCAuZGVzY3IgPSAicGxvYW0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcGxvYW0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhLCBwbG9hbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJCcm9hZGNhc3QgUExPQU0gUGFja2V0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfd2luZG93X3R5cGUgPSB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlNpbGVudCBXaW5kb3cgb3IgQ3V0IG9mZiBXaW5kb3ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfbWVhc3VyZW1lbnRfc3RhdHVzID0geyAubmFtZSA9ICJtZWFzdXJlbWVudF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBtZWFzdXJlbWVudF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2FsbG9jX2lkID0geyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYy1JRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUtSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pc19kZWxpbmVhdGlvbiA9IHsgLm5hbWUgPSAiaXNfZGVsaW5lYXRpb24iLCAuZGVzY3IgPSAiQnVyc3QgRGVsaW5lYXRpb24gZGV0ZWN0ZWQgZHVyaW5nIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgaXNfZGVsaW5lYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lzX2VkID0geyAubmFtZSA9ICJpc19lZCIsIC5kZXNjciA9ICJJcyBFRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgaXNfZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3J4X2RhdGEgPSB7IC5uYW1lID0gInJ4X2RhdGEiLCAuZGVzY3IgPSAiQ2FwdHVyZWQgUExPQU11IG1lc3NhZ2UgaWYgdGhlIGJ1cnN0IGRlbGluaWVhdGlvbiB3YXMgZGV0ZWN0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHJ4X2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfb251X2lkID0geyAubmFtZSA9ICJwbG9hbV9yZWNlaXZlZF9vbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHJlY2VpdmVkIGluIHRoZSBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX29udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Bsb2FtX3JlY2VpdmVkX21pY19lcnJvciA9IHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yIiwgLmRlc2NyID0gIk1pYyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgcGxvYW0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9NSUNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBwbG9hbV9yZWNlaXZlZF9taWNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF93aW5kb3dfdHlwZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9tZWFzdXJlbWVudF9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfYWxsb2NfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfb251X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lzX2RlbGluZWF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lzX2VkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3J4X2RhdGEsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfb251X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Bsb2FtX3JlY2VpdmVkX21pY19lcnJvciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlNpbGVudCBXaW5kb3cgb3IgQ3V0IG9mZiBXaW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgd2luZG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IH0sIHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG1lYXN1cmVtZW50X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImlzX2RlbGluZWF0aW9uIiwgLmRlc2NyID0gIkJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgaXNfZGVsaW5lYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJpc19lZCIsIC5kZXNjciA9ICJJcyBFRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJ4X2RhdGEiLCAuZGVzY3IgPSAiQ2FwdHVyZWQgUExPQU11IG1lc3NhZ2UgaWYgdGhlIGJ1cnN0IGRlbGluaWVhdGlvbiB3YXMgZGV0ZWN0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHJ4X2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX29udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX29udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJwbG9hbV9yZWNlaXZlZF9taWNfZXJyb3IiLCAuZGVzY3IgPSAiTWljIGVycm9yIGluIHRoZSByZWNlaXZlZCBwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBwbG9hbV9yZWNlaXZlZF9taWNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiUm9ndWUgZGV0ZWN0aW9uIGNvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSB0b2RfcmVxdWVzdF9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfdG9kX3N0cmluZyA9IHsgLm5hbWUgPSAidG9kX3N0cmluZyIsIC5kZXNjciA9ICJ0b2Rfc3RyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCB0b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3NmYyA9IHsgLm5hbWUgPSAic2ZjIiwgLmRlc2NyID0gInNmYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzZmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfc2VjID0geyAubmFtZSA9ICJydGNfb2Zmc2V0X3NlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X3NlYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9ydGNfb2Zmc2V0X25zZWMgPSB7IC5uYW1lID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X25zZWMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgcnRjX29mZnNldF9uc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3RvZF9zdHJpbmcsICZwcm9wX2Rlc2NyX3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9zZmMsICZwcm9wX2Rlc2NyX3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9ydGNfb2Zmc2V0X3NlYywgJnByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfbnNlYywgJnByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidG9kX3N0cmluZyIsIC5kZXNjciA9ICJ0b2Rfc3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgdG9kX3N0cmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NCB9LCB7IC5uYW1lID0gInNmYyIsIC5kZXNjciA9ICJzZmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzZmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnRjX29mZnNldF9zZWMiLCAuZGVzY3IgPSAicnRjX29mZnNldF9zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X3NlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X25zZWMiLCAuZGVzY3IgPSAicnRjX29mZnNldF9uc2VjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgcnRjX29mZnNldF9uc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlRPRCByZXF1ZXN0IGNvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHRvZF9yZXF1ZXN0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfdG9kX3JlcXVlc3RfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGFydF9vbnVfdXBncmFkZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEsIGxpc3Rfb2Zfb251X2lkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaXN0X29mX29udV9pZHMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUgSURzIHRvIHVwZ3JhZGUgdGhlIGZpcm13YXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIiwgLmRlc2NyID0gIk9MVCB0byBPTlUgZmlybXdhcmUgdHJhbnNmZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBvbnVfdXBncmFkZV9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4gIFRoaXMgaXMgYWRkZWQgcGVyIEFuYXQncyByZXF1ZXN0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgPSB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdWNjZXNzIG9yIGZhaWx1cmUuICBBZ2FpbnN0IGVudGlyZSB1cGdyYWRlIHByb2Nlc3MuICBUaGlzIGlzIGFkZGVkIHBlciBBbmF0J3MgcmVxdWVzdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIk9OVSBVcGdyYWRlIENvbXBsZXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gYWRqdXN0X3R4X3dhdmVsZW5ndGggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIlNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uID0geyAubmFtZSA9ICJmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC5kZXNjciA9ICJGcmVxdWVuY3kgYWRqdXN0bWVudCBkaXJlY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSwgZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplID0geyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIiwgLmRlc2NyID0gIlRoZSBzaXplIG9mIHRoZSBmcmVxdW5jeSBhZGp1c3RtZW50IGluIHVuaXRzIG9mIDAuMSBHaHoiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9zZXJpYWxfbnVtYmVyLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9mcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgJnByb3BfZGVzY3JfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIlNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAiZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24iLCAuZGVzY3IgPSAiRnJlcXVlbmN5IGFkanVzdG1lbnQgZGlyZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB9LCB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAuZGVzY3IgPSAiVGhlIHNpemUgb2YgdGhlIGZyZXF1bmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xIEdoeiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSwgZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIiwgLmRlc2NyID0gIkluc3RydWN0IGFuIHVuYXNzaWduZWQgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfY3B1X3BhY2tldHNfZmFpbHVyZSA9IHsgLm5hbWUgPSAiY3B1X3BhY2tldHNfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY3B1X3BhY2tldHNfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGNwdV9wYWNrZXRzX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBlbmFibGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfbG9zID0geyAubmFtZSA9ICJsb3MiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxvc1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgbG9zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfb251X2Rpc2NvdmVyZWQgPSB7IC5uYW1lID0gIm9udV9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzY292ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX29udV91cGdyYWRlX2NvbXBsZXRlID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X3VwZ3JhZGVfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X3VwZ3JhZGVfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCA9IHsgLm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0geyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0b2RfcmVxdWVzdF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19jcHVfcGFja2V0c19mYWlsdXJlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2xvcywgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfb251X2Rpc2NvdmVyZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX29udV91cGdyYWRlX2NvbXBsZXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ190b2RfcmVxdWVzdF9jb21wbGV0ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNwdV9wYWNrZXRzX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGNwdV9wYWNrZXRzX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb3MiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxvc1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgbG9zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2Rpc2NvdmVyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9kaXNjb3ZlcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X3VwZ3JhZGVfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0b2RfcmVxdWVzdF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB4Z3Bvbl9vbnUgPT09PSAqLworCisvKiBHcm91cDogeGdwb25fb251IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2tleV9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJvbnUgaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfeGdwb25fb251X2tleV9vbnVfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udSBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX29udV9zdGF0ZSA9IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgT05VIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19vbnVfb2xkX3N0YXRlID0geyAubmFtZSA9ICJvbnVfb2xkX3N0YXRlIiwgLmRlc2NyID0gIm9udSBvbGQgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBvbnVfb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUgb2YgYWxsIE9OVSBhbGFybXMuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleXMgbGVhcm5lZCBkdXJpbmcgT05VIHJlZ2lzdHJhdGlvbi4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19jdXJyZW50X2VuY3J5cHRpb25fa2V5ID0geyAubmFtZSA9ICJjdXJyZW50X2VuY3J5cHRpb25fa2V5IiwgLmRlc2NyID0gIkN1cnJlbnQgQUVTIGVuY3J5cHRpb24ga2V5LiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJPTlUgc2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiT05VIHJlZ2lzdHJhdGlvbiBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcgPSB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGxlYXJuaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEX0FVVE9fTEVBUk5JTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmFuZ2luZ19idXJzdF9wcm9maWxlID0geyAubmFtZSA9ICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgcmFuZ2luZyBhbGxvY2F0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfQlVSU1RfUFJPRklMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGF0YV9idXJzdF9wcm9maWxlID0geyAubmFtZSA9ICJkYXRhX2J1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgZGF0YSBhbGxvY2F0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGRhdGFfYnVyc3RfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmFuZ2luZ190aW1lID0geyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAiT05VIHJhbmdpbmcgdGltZS4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJhbmdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2Rpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSA9IHsgLm5hbWUgPSAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5IiwgLmRlc2NyID0gIlRoaXMgT05VIHdhcyBkaXNhYmxlZCBhZnRlciBTTiBkaXNjb3ZlcnkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGVhY3RpdmF0aW9uX3JlYXNvbiA9IHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC5kZXNjciA9ICJkZWFjdGl2YXRpb24gcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGVhY3RpdmF0aW9uX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsbF9nZW1fcG9ydHMgPSB7IC5uYW1lID0gImFsbF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBhbGxfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19hbGxfYWxsb2NzID0geyAubmFtZSA9ICJhbGxfYWxsb2NzIiwgLmRlc2NyID0gIkFsbCBhbGxvYyBJRHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9hbGxvY3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZXh0ZW5kZWRfZ3VhcmRfdGltZSA9IHsgLm5hbWUgPSAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgdGhpcyBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGV4dGVuZGVkX2d1YXJkX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ191c19saW5lX3JhdGUgPSB7IC5uYW1lID0gInVzX2xpbmVfcmF0ZSIsIC5kZXNjciA9ICJVUyBsaW5lIHJhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9VU19MSU5FX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCB1c19saW5lX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19jYWxpYnJhdGlvbl9yZWNvcmQgPSB7IC5uYW1lID0gImNhbGlicmF0aW9uX3JlY29yZCIsIC5kZXNjciA9ICJDYWxpYnJhdGlvbiByZWNvcmQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBjYWxpYnJhdGlvbl9yZWNvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3R1bmluZ19ncmFudWxhcml0eSA9IHsgLm5hbWUgPSAidHVuaW5nX2dyYW51bGFyaXR5IiwgLmRlc2NyID0gIlRoZSB0dW5pbmcgZ3JhbnVsYXJpdHkgb2YgdGhlIE9OVSB0cmFuc21pdHRlZCBleHByZXNzZWQgaW4gdW5pdHMgb2YgMUdIei4gVmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcvZGl0aGVyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVFVOSU5HX0dSQU5VTEFSSVRZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgdHVuaW5nX2dyYW51bGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19zdGVwX3R1bmluZ190aW1lID0geyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLmRlc2NyID0gIlRoZSB2YWx1ZSBvZiB0aGUgdHVuaW5nIHRpbWUgZm9yIGEgc2luZ2xlIGdyYW51bGFyaXR5IHN0ZXAsIGV4cHJlc3NlZCBpbiB1bml0cyBvZiBQSFkgZnJhbWVzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBzdGVwX3R1bmluZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzID0geyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXRpZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzID0geyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAuZGVzY3IgPSAiVGhpcyB2YWx1ZSBpbmRpY2F0ZSB0aGF0IHRoZSBvbnUgaXMgaW4gdGhlIG1pZGRsZSBvZiByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBwcm9jZXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19vbnVfc3RhdGUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfb251X29sZF9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19hbGFybV9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2N1cnJlbnRfZW5jcnlwdGlvbl9rZXksICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfc2VyaWFsX251bWJlciwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmFuZ2luZ19idXJzdF9wcm9maWxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2RhdGFfYnVyc3RfcHJvZmlsZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yYW5naW5nX3RpbWUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2RlYWN0aXZhdGlvbl9yZWFzb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfYWxsX2dlbV9wb3J0cywgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19hbGxfYWxsb2NzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2V4dGVuZGVkX2d1YXJkX3RpbWUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfdXNfbGluZV9yYXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2NhbGlicmF0aW9uX3JlY29yZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ190dW5pbmdfZ3JhbnVsYXJpdHksICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfc3RlcF90dW5pbmdfdGltZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IE9OVSBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSwgeyAubmFtZSA9ICJvbnVfb2xkX3N0YXRlIiwgLmRlc2NyID0gIm9udSBvbGQgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgb251X29sZF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlN0YXRlIG9mIGFsbCBPTlUgYWxhcm1zLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIsIC5kZXNjciA9ICJBRVMgZW5jcnlwdGlvbiBrZXlzIGxlYXJuZWQgZHVyaW5nIE9OVSByZWdpc3RyYXRpb24uICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB9LCB7IC5uYW1lID0gImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkiLCAuZGVzY3IgPSAiQ3VycmVudCBBRVMgZW5jcnlwdGlvbiBrZXkuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJPTlUgc2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJPTlUgcmVnaXN0cmF0aW9uIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNiB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGxlYXJuaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19idXJzdF9wcm9maWxlIiwgLmRlc2NyID0gIkJ1cnN0IHByb2ZpbGUgaW5kZXggZm9yIHJhbmdpbmcgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZGF0YV9idXJzdF9wcm9maWxlIiwgLmRlc2NyID0gIkJ1cnN0IHByb2ZpbGUgaW5kZXggZm9yIGRhdGEgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGF0YV9idXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLmRlc2NyID0gIk9OVSByYW5naW5nIHRpbWUuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC5kZXNjciA9ICJUaGlzIE9OVSB3YXMgZGlzYWJsZWQgYWZ0ZXIgU04gZGlzY292ZXJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGlvbl9yZWFzb24iLCAuZGVzY3IgPSAiZGVhY3RpdmF0aW9uIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBkZWFjdGl2YXRpb25fcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiB9LCB7IC5uYW1lID0gImFsbF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxsX2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB9LCB7IC5uYW1lID0gImFsbF9hbGxvY3MiLCAuZGVzY3IgPSAiQWxsIGFsbG9jIElEcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9hbGxvY3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB9LCB7IC5uYW1lID0gImV4dGVuZGVkX2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBleHRlbmRlZF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB9LCB7IC5uYW1lID0gInVzX2xpbmVfcmF0ZSIsIC5kZXNjciA9ICJVUyBsaW5lIHJhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgdXNfbGluZV9yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB9LCB7IC5uYW1lID0gImNhbGlicmF0aW9uX3JlY29yZCIsIC5kZXNjciA9ICJDYWxpYnJhdGlvbiByZWNvcmQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgY2FsaWJyYXRpb25fcmVjb3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IH0sIHsgLm5hbWUgPSAidHVuaW5nX2dyYW51bGFyaXR5IiwgLmRlc2NyID0gIlRoZSB0dW5pbmcgZ3JhbnVsYXJpdHkgb2YgdGhlIE9OVSB0cmFuc21pdHRlZCBleHByZXNzZWQgaW4gdW5pdHMgb2YgMUdIei4gVmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcvZGl0aGVyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHR1bmluZ19ncmFudWxhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInN0ZXBfdHVuaW5nX3RpbWUiLCAuZGVzY3IgPSAiVGhlIHZhbHVlIG9mIHRoZSB0dW5pbmcgdGltZSBmb3IgYSBzaW5nbGUgZ3JhbnVsYXJpdHkgc3RlcCwgZXhwcmVzc2VkIGluIHVuaXRzIG9mIFBIWSBmcmFtZXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHN0ZXBfdHVuaW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXRpZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJUaGlzIHZhbHVlIGluZGljYXRlIHRoYXQgdGhlIG9udSBpcyBpbiB0aGUgbWlkZGxlIG9mIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHByb2Nlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcG9zaXRpdmVfZHJpZnQgPSB7IC5uYW1lID0gInBvc2l0aXZlX2RyaWZ0IiwgLmRlc2NyID0gInBvc2l0aXZlIGRyaWZ0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHBvc2l0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X25lZ2F0aXZlX2RyaWZ0ID0geyAubmFtZSA9ICJuZWdhdGl2ZV9kcmlmdCIsIC5kZXNjciA9ICJuZWdhdGl2ZSBkcmlmdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBuZWdhdGl2ZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9kZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24gPSB7IC5uYW1lID0gImRlbGltaXRlcl9taXNzX2RldGVjdGlvbiIsIC5kZXNjciA9ICJkZWxpbWl0ZXIgbWlzcyBkZXRlY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9iaXAzMl9lcnJvcnMgPSB7IC5uYW1lID0gImJpcDMyX2Vycm9ycyIsIC5kZXNjciA9ICJiaXAzMiBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGJpcDMyX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF93b3JkcyA9IHsgLm5hbWUgPSAicnhfd29yZHMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyByZWNlaXZlZCAod29yZCBzaXplIGlzIDQgYnl0ZXMgcmVnYXJkbGVzcyBvZiB1cHN0cmVhbSBkYXRhIHJhdGUpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF93b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfY29ycmVjdGVkX3N5bWJvbHMgPSB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfc3ltYm9scyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIHN5bWJvbHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb3JyZWN0ZWRfc3ltYm9scyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfY29ycmVjdGVkX2NvZGV3b3JkcyA9IHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMiLCAuZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMiLCAuZGVzY3IgPSAiZmVjIHVuY29ycmVjdGFibGUgY29kZXdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX2NvZGV3b3JkcyA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgdG90YWwgY29kZXdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfY29ycmVjdGVkX2JpdHMgPSB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfYml0cyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIGJpdHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9CSVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb3JyZWN0ZWRfYml0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF94Z2VtX2tleV9lcnJvcnMgPSB7IC5uYW1lID0gInhnZW1fa2V5X2Vycm9ycyIsIC5kZXNjciA9ICJ4Z2VtIGtleSBlcnJvciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgeGdlbV9rZXlfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3hnZW1fbG9zcyA9IHsgLm5hbWUgPSAieGdlbV9sb3NzIiwgLmRlc2NyID0gInhnZW0gbG9zcyAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHhnZW1fbG9zcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9wbG9hbXNfbWljX2Vycm9yID0geyAubmFtZSA9ICJyeF9wbG9hbXNfbWljX2Vycm9yIiwgLmRlc2NyID0gIm1pYyBlcnJvciBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19taWNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGxvYW1zX25vbl9pZGxlID0geyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAibm9uIGlkbGUgcGxvYW0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9vbWNpID0geyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAicnggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGFja2V0cyA9IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJyeCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF90eF9ieXRlcyA9IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAidHggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfdHhfcGFja2V0cyA9IHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJ0eCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3Bvc2l0aXZlX2RyaWZ0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9uZWdhdGl2ZV9kcmlmdCwgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9iaXAzMl9lcnJvcnMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3dvcmRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfY29ycmVjdGVkX3N5bWJvbHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfY29kZXdvcmRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfYml0cywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfeGdlbV9rZXlfZXJyb3JzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF94Z2VtX2xvc3MsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19taWNfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSwgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfb21jaSwgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfYnl0ZXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3BhY2tldHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3R4X2J5dGVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF90eF9wYWNrZXRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvc2l0aXZlX2RyaWZ0IiwgLmRlc2NyID0gInBvc2l0aXZlIGRyaWZ0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBwb3NpdGl2ZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJuZWdhdGl2ZV9kcmlmdCIsIC5kZXNjciA9ICJuZWdhdGl2ZSBkcmlmdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgbmVnYXRpdmVfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uIiwgLmRlc2NyID0gImRlbGltaXRlciBtaXNzIGRldGVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJpcDMyX2Vycm9ycyIsIC5kZXNjciA9ICJiaXAzMiBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGJpcDMyX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF93b3JkcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIHJlY2VpdmVkICh3b3JkIHNpemUgaXMgNCBieXRlcyByZWdhcmRsZXNzIG9mIHVwc3RyZWFtIGRhdGEgcmF0ZSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF93b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX3N5bWJvbHMiLCAuZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBzeW1ib2xzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29ycmVjdGVkX3N5bWJvbHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMiLCAuZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBjb2Rld29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gImZlYyB0b3RhbCBjb2Rld29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9iaXRzIiwgLmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgYml0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9iaXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInhnZW1fa2V5X2Vycm9ycyIsIC5kZXNjciA9ICJ4Z2VtIGtleSBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgeGdlbV9rZXlfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInhnZW1fbG9zcyIsIC5kZXNjciA9ICJ4Z2VtIGxvc3MgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB4Z2VtX2xvc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX21pY19lcnJvciIsIC5kZXNjciA9ICJtaWMgZXJyb3IgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19taWNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIm5vbiBpZGxlIHBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wbG9hbXNfbm9uX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaSIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gInJ4IGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gInJ4IHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAidHggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAidHggcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHNldF9vbnVfc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJPTlUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiT05VIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0IE9OVSBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSByc3NpX21lYXN1cmVtZW50ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X2FsYXJtICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9hbGFybV9vbnVfYWxhcm0gPSB7IC5uYW1lID0gIm9udV9hbGFybSIsIC5kZXNjciA9ICJvbnUgYWxhcm0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhLCBvbnVfYWxhcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29udV9hbGFybV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWxhcm1fb251X2FsYXJtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIm9udSBhbGFybSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhLCBvbnVfYWxhcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhIiwgLmRlc2NyID0gIk9OVSBBbGFybSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBkb3dpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2Rvd2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZG93aV9kcmlmdF92YWx1ZSA9IHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9EUklGVF9WQUxVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX25ld19lcWQgPSB7IC5uYW1lID0gIm5ld19lcWQiLCAuZGVzY3IgPSAiTmV3IEVRRCBhZnRlciBkcmlmdCBpcyBjb3JyZWN0ZWQgKG9ubHkgdmFsaWQgaWYgc3RhdHVzIGlzICdvbicpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIG5ld19lcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2Rvd2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZG93aV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX2RyaWZ0X3ZhbHVlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZG93aV9uZXdfZXFkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLmRlc2NyID0gIkNhbGN1bGF0ZWQgYW1vdW50IG9mIGRyaWZ0IChwb3NpdGl2ZSArIG5lZ2F0aXZlIGFzIGEgc2lnbmVkIHZhbHVlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH0sIHsgLm5hbWUgPSAibmV3X2VxZCIsIC5kZXNjciA9ICJOZXcgRVFEIGFmdGVyIGRyaWZ0IGlzIGNvcnJlY3RlZCAob25seSB2YWxpZCBpZiBzdGF0dXMgaXMgJ29uJykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhLCBuZXdfZXFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIiwgLmRlc2NyID0gIkRyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHNmaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZmlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NmaV9iZXIgPSB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaV9kYXRhLCBiZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3NmaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZmlfYWxhcm1fc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2ZpX2JlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiYmVyIiwgLmRlc2NyID0gIkludmVyc2UgYml0IGVycm9yIHJhdGUgKGUuZy4gaWYgdGhpcyBudW1iZXIgaXMgMTAwMCwgdGhlIEJFUiBpcyAxLzEwMDApLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaV9kYXRhLCBiZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIiwgLmRlc2NyID0gIlNpZ25hbCBGYWlsIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NmaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2RpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NkaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NkaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2RpX2JlciA9IHsgLm5hbWUgPSAiYmVyIiwgLmRlc2NyID0gIkludmVyc2UgYml0IGVycm9yIHJhdGUgKGUuZy4gaWYgdGhpcyBudW1iZXIgaXMgMTAwMCwgdGhlIEJFUiBpcyAxLzEwMDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0JFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3NkaV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZGlfYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NkaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEiLCAuZGVzY3IgPSAiU2lnbmFsIERlZ3JhZGVkIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NkaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gZGZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2RmaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZGZpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X2RmaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSIsIC5kZXNjciA9ICJSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBwcXNpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bxc2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QUVNJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcHFzaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9wcXNpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSIsIC5kZXNjciA9ICJwbG9hbSBxdWV1ZSBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc3VmaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdWZpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3N1ZmlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3VmaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEiLCAuZGVzY3IgPSAiU1VGaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSB0aXdpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Rpd2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdGl3aV9kcmlmdF92YWx1ZSA9IHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV90aXdpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3Rpd2lfYWxhcm1fc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdGl3aV9kcmlmdF92YWx1ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhIiwgLmRlc2NyID0gIlRyYW5zbWlzc2lvbiBJbnRlcmZlcmVuY2UgV2FybmluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBsb29jaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9sb29jaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2xvb2NpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X2xvb2NpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEiLCAuZGVzY3IgPSAiTE9PQ2kiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gcmFuZ2luZ19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZXFkID0geyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGVxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfbnVtYmVyX29mX3Bsb2FtcyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX3Bsb2FtcyIsIC5kZXNjciA9ICJudW1iZXIgb2YgcGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBudW1iZXJfb2ZfcGxvYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Bvd2VyX2xldmVsID0geyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJwb3dlciBsZXZlbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIHBvd2VyX2xldmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2ZhaWxfcmVhc29uLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZXFkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfbnVtYmVyX29mX3Bsb2FtcywgJnByb3BfZGVzY3JfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Bvd2VyX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gfSwgeyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgZXFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wbG9hbXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIHBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJwb3dlciBsZXZlbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIHBvd2VyX2xldmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSYW5naW5nIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3JlZ2lzdHJhdGlvbl9pZCA9IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gInJlZ2lzdHJhdGlvbiBpZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyA9IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIsIC5kZXNjciA9ICJyZWdpc3RyYXRpb24gZW5jcnlwdGlvbiBrZXlzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcmVnaXN0cmF0aW9uX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3JlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJyZWdpc3RyYXRpb24gaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIsIC5kZXNjciA9ICJyZWdpc3RyYXRpb24gZW5jcnlwdGlvbiBrZXlzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIEFjdGl2YXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGVhY3RpdmF0aW9uIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfZW5hYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRW5hYmxlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfZGlzYWJsZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIERpc2FibGUgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlJTU0kgTWVhc3VyZW1lbnQgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGludmFsaWRfZGJydV9yZXBvcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9hbGxvY19pZCA9IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9hbGxvY19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYy1JRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEiLCAuZGVzY3IgPSAiSW52YWxpZCBEQlJ1IFJlcG9ydCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2VfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfbmV3X2tleSA9IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9uZXdfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm5ld19rZXkiLCAuZGVzY3IgPSAibmV3IGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZXhwZWN0ZWRfa2V5ID0geyAubmFtZSA9ICJleHBlY3RlZF9rZXkiLCAuZGVzY3IgPSAiZXhwZWN0ZWQga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCBleHBlY3RlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcmVjZWl2ZWRfa2V5ID0geyAubmFtZSA9ICJyZWNlaXZlZF9rZXkiLCAuZGVzY3IgPSAicmVjZWl2ZWQga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCByZWNlaXZlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9leHBlY3RlZF9rZXksICZwcm9wX2Rlc2NyX3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3JlY2VpdmVkX2tleSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJleHBlY3RlZF9rZXkiLCAuZGVzY3IgPSAiZXhwZWN0ZWQga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCBleHBlY3RlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLmRlc2NyID0gInJlY2VpdmVkIGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSwgcmVjZWl2ZWRfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2giLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb3B0aWNhbF9yZWZsZWN0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBwbG9hbV9wYWNrZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RlZmF1bHRfa2V5ID0geyAubmFtZSA9ICJkZWZhdWx0X2tleSIsIC5kZXNjciA9ICJkZWZhdWx0IGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX0RFRkFVTFRfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSwgZGVmYXVsdF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Bsb2FtID0geyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kZWZhdWx0X2tleSwgJnByb3BfZGVzY3JfeGdwb25fb251X3Bsb2FtX3BhY2tldF9wbG9hbSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRlZmF1bHRfa2V5IiwgLmRlc2NyID0gImRlZmF1bHQga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEsIGRlZmF1bHRfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicGxvYW0iLCAuZGVzY3IgPSAicGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEiLCAuZGVzY3IgPSAiUExPQU0gUGFja2V0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGNwdV9wYWNrZXRzICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX3BhY2tldF90eXBlID0geyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfY2FsY19jcmMgPSB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgY2FsY19jcmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfbnVtYmVyX29mX3BhY2tldHMgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLmRlc2NyID0gIm51bWJlciBvZiBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgbnVtYmVyX29mX3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3NpemUgPSB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gIlNpbmdsZSBwYWNrZXQgc2l6ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19idWZmZXIgPSB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3R5cGUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19jYWxjX2NyYywgJnByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX251bWJlcl9vZl9wYWNrZXRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgY2FsY19jcmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfcGFja2V0cyIsIC5kZXNjciA9ICJudW1iZXIgb2YgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIG51bWJlcl9vZl9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAiU2luZ2xlIHBhY2tldCBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSIsIC5kZXNjciA9ICJYR1BPTiBDUFUgcGFja2V0cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBjcHVfcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRfcG9ydF9pZCA9IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0IGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldF9jcmNfb2sgPSB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmMgb2siLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X3BhY2tldF9zaXplID0geyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJwYWNrZXQgc2l6ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldF9idWZmZXIgPSB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldF9wb3J0X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldF9jcmNfb2ssICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X3BhY2tldF9zaXplLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldF9idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0IGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmMgb2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldCBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRlcyBDUFUgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbWNpX3BhY2tldCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9wb3J0X2lkID0geyAubmFtZSA9ICJwb3J0X2lkIiwgLmRlc2NyID0gInBvcnQgaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X2NyY19vayA9IHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyYyBvayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBjcmNfb2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfcGFja2V0X3NpemUgPSB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldCBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbWNpX3BhY2tldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9wb3J0X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfY3JjX29rLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvcnRfaWQiLCAuZGVzY3IgPSAicG9ydCBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyYyBvayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldCBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgT01DSSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGRnaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9kZ2lfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2RnaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9kZ2lfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RnaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEiLCAuZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2RnaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2Vfb2xkX3N0YXRlID0geyAubmFtZSA9ICJvbGRfc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIHRoZSBPTlUgd2FzIHByZXZpb3VzbHkgaW4uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG9sZF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgdGhlIE9OVSBpcyBjdXJyZW50bHkgaW4uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9yZWFzb24gPSB7IC5uYW1lID0gInJlYXNvbiIsIC5kZXNjciA9ICJUaGUgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX29sZF9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX25ld19zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2xkX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIHdhcyBwcmV2aW91c2x5IGluLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG9sZF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgdGhlIE9OVSBpcyBjdXJyZW50bHkgaW4uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIlRoZSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEiLCAuZGVzY3IgPSAiTm90aWZpY2F0aW9uIHRoYXQgYW4gT05VcyBwb3dlciBtYW5hZ2VtZW50IHN0YXRlIGhhcyBjaGFuZ2VkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBwb3NzaWJsZV9kcmlmdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJPbjogZXN0aW1hdGVkIGRyaWZ0IGhhcyBleGNlZWRlZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9lc3RpbWF0ZWRfZHJpZnQgPSB7IC5uYW1lID0gImVzdGltYXRlZF9kcmlmdCIsIC5kZXNjciA9ICJJZiBzdGF0dXMgaXMgb24sIHRoZSBlc3RpbWF0ZWQgZHJpZnQgdmFsdWUsIG90aGVyd2lzZSB6ZXJvICgwKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSwgZXN0aW1hdGVkX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2VzdGltYXRlZF9kcmlmdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIk9uOiBlc3RpbWF0ZWQgZHJpZnQgaGFzIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfZHJpZnQiLCAuZGVzY3IgPSAiSWYgc3RhdHVzIGlzIG9uLCB0aGUgZXN0aW1hdGVkIGRyaWZ0IHZhbHVlLCBvdGhlcndpc2UgemVybyAoMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSwgZXN0aW1hdGVkX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSIsIC5kZXNjciA9ICJBbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUgbWF5IGJlIGV4cGVyaWVuY2luZyBkcmlmdCBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiBUaGUgZXN0aW1hdGUgbWF5IGJlIGluYWNjdXJhdGUgZGVwZW5kaW5nIG9uIE9OVSBiZWhhdmlvci4gQWN0dWFsIGRyaWZ0IG1heSBiZSBsZXNzIHRoYW4gZXN0aW1hdGVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSByZXF1ZXN0X3JlZ2lzdHJhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zbWFfZmxhZyA9IHsgLm5hbWUgPSAic21hX2ZsYWciLCAuZGVzY3IgPSAiSXMgdGhlIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHByb2Nlc3MgaXMgcGFydCBvZiB0aGUgU01BIHByb2Nlc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX1NNQV9GTEFHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhLCBzbWFfZmxhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zbWFfZmxhZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic21hX2ZsYWciLCAuZGVzY3IgPSAiSXMgdGhlIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHByb2Nlc3MgaXMgcGFydCBvZiB0aGUgU01BIHByb2Nlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhLCBzbWFfZmxhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiUmVxdWVzdCB0aGUgT05VIHRvIHNlbmQgaXRzIFJlZ2lzdHJhdGlvbiBJRCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCA9IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfYXR0ZW51YXRpb24gPSB7IC5uYW1lID0gImF0dGVudWF0aW9uIiwgLmRlc2NyID0gIlRoZSByZXF1ZXN0ZWQgYXR0ZW51YXRpb24gaW4gc3RlcHMgb2YgM2RCIGFzIHBhcnQgb2YgcG93ZXIgbGV2ZWxsaW5nIGluc3RydWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0FUVEVOVUFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEsIGF0dGVudWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19jb250cm9sLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19hdHRlbnVhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCB9LCB7IC5uYW1lID0gImF0dGVudWF0aW9uIiwgLmRlc2NyID0gIlRoZSByZXF1ZXN0ZWQgYXR0ZW51YXRpb24gaW4gc3RlcHMgb2YgM2RCIGFzIHBhcnQgb2YgcG93ZXIgbGV2ZWxsaW5nIGluc3RydWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhLCBhdHRlbnVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIiwgLmRlc2NyID0gIkNoYW5nZSBwb3dlciBsZXZlbGxpbmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gZ2V0X3Bvd2VyX2xldmVsICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBnZXRfcG93ZXJfY29uc3VtcHRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGFkanVzdF90eF93YXZlbGVuZ3RoICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiA9IHsgLm5hbWUgPSAiZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLmRlc2NyID0gIkZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSA9IHsgLm5hbWUgPSAiZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSIsIC5kZXNjciA9ICJUaGUgc2l6ZSBvZiB0aGUgZnJlcXVlbmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xR0h6IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgJnByb3BfZGVzY3JfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC5kZXNjciA9ICJGcmVxdWVuY3kgYWRqdXN0bWVudCBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gfSwgeyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIiwgLmRlc2NyID0gIlRoZSBzaXplIG9mIHRoZSBmcmVxdWVuY3kgYWRqdXN0bWVudCBpbiB1bml0cyBvZiAwLjFHSHoiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSIsIC5kZXNjciA9ICJJbnN0cnVjdCB0aGUgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSByZWdpc3RyYXRpb25faWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3JlZ2lzdHJhdGlvbl9pZCA9IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gIlJlZ2lzdHJhdGlvbiBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFR0lTVFJBVElPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzID0geyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9yZWdpc3RyYXRpb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gIlJlZ2lzdHJhdGlvbiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhLCByZWdpc3RyYXRpb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMzYgfSwgeyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gInJlcXVlc3QgcmVnaXN0cmF0aW9uIGZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEiLCAuZGVzY3IgPSAiUmVnaXN0cmF0aW9uIElEIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHBvd2VyX2xldmVsX3JlcG9ydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfYXR0ZW51YXRpb24gPSB7IC5uYW1lID0gImF0dGVudWF0aW9uIiwgLmRlc2NyID0gIkF0dGVudWF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhLCBhdHRlbnVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5IiwgLmRlc2NyID0gIlBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXR5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2F0dGVudWF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X3Bvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiQXR0ZW51YXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSwgYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSIsIC5kZXNjciA9ICJQb3dlciBsZXZlbGxpbmcgY2FwYWJpbGl0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSIsIC5kZXNjciA9ICJQb3dlciBsZXZlbCByZXBvcnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgPSB7IC5uYW1lID0gInBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCIsIC5kZXNjciA9ICJwb3dlciBjb25zdW1wdGlvbiByZXBvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVF9JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhLCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCIsIC5kZXNjciA9ICJwb3dlciBjb25zdW1wdGlvbiByZXBvcnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEiLCAuZGVzY3IgPSAiUG93ZXIgY29uc3VtcHRpb24gcmVwb3J0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9tYXN0ZXJfa2V5ID0geyAubmFtZSA9ICJtYXN0ZXJfa2V5IiwgLmRlc2NyID0gIm1hc3RlciBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhLCBtYXN0ZXJfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gIk9NQ0kgZGF0YSBidWZmZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fbWljID0geyAubmFtZSA9ICJtaWMiLCAuZGVzY3IgPSAibWljIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01JQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhLCBtaWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9tYXN0ZXJfa2V5LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9idWZmZXIsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX21pYyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYXN0ZXJfa2V5IiwgLmRlc2NyID0gIm1hc3RlciBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEsIG1hc3Rlcl9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gIk9NQ0kgZGF0YSBidWZmZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH0sIHsgLm5hbWUgPSAibWljIiwgLmRlc2NyID0gIm1pYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSwgbWljKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhIiwgLmRlc2NyID0gIk9NQ0kgYmFzZSBzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAic2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiBmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSIsIC5kZXNjciA9ICJGYWlsdXJlIG9mIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZHVlIHRvIE1JQyBlcnJvciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfdHVuaW5nX2luICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29udV90dW5pbmdfaW5fcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X3R1bmluZ19vdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfdGFyZ2V0X2RzX3Bvbl9pZCA9IHsgLm5hbWUgPSAidGFyZ2V0X2RzX3Bvbl9pZCIsIC5kZXNjciA9ICJ0YXJnZXQgZHMgcG9uIGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfRFNfUE9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCB0YXJnZXRfZHNfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3RhcmdldF91c19wb25faWQgPSB7IC5uYW1lID0gInRhcmdldF91c19wb25faWQiLCAuZGVzY3IgPSAidGFyZ2V0IHVzIHBvbiBpZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgdGFyZ2V0X3VzX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF90aW1lX3RvX3N3aXRjaCA9IHsgLm5hbWUgPSAidGltZV90b19zd2l0Y2giLCAuZGVzY3IgPSAiVGltZSB0byBzd2l0Y2ggaW4gbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCB0aW1lX3RvX3N3aXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfcm9sbGJhY2sgPSB7IC5uYW1lID0gInJvbGxiYWNrIiwgLmRlc2NyID0gInJvbGxiYWNrIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgcm9sbGJhY2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAib24tIHRvIHN0YXJ0IHR1bmluZyBvdXQgb2ZmLSB0byBzdG9wIHR1bmluZyBvdXQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29udV90dW5pbmdfb3V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3RhcmdldF9kc19wb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF90YXJnZXRfdXNfcG9uX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfdGltZV90b19zd2l0Y2gsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9yb2xsYmFjaywgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidGFyZ2V0X2RzX3Bvbl9pZCIsIC5kZXNjciA9ICJ0YXJnZXQgZHMgcG9uIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgdGFyZ2V0X2RzX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCB9LCB7IC5uYW1lID0gInRhcmdldF91c19wb25faWQiLCAuZGVzY3IgPSAidGFyZ2V0IHVzIHBvbiBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHRhcmdldF91c19wb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWQgfSwgeyAubmFtZSA9ICJ0aW1lX3RvX3N3aXRjaCIsIC5kZXNjciA9ICJUaW1lIHRvIHN3aXRjaCBpbiBtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHRpbWVfdG9fc3dpdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJvbGxiYWNrIiwgLmRlc2NyID0gInJvbGxiYWNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgcm9sbGJhY2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAib24tIHRvIHN0YXJ0IHR1bmluZyBvdXQgb2ZmLSB0byBzdG9wIHR1bmluZyBvdXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIiwgLmRlc2NyID0gIk9OVSBUdW5pbmcgb3V0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9yZXN1bHQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIFR1bmluZyBvdXQgY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV90dW5pbmdfaW5fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX3Jlc3VsdCwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBUdW5pbmcgaW4gY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHR1bmluZ19yZXNwb25zZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfYWNrID0geyAubmFtZSA9ICJhY2siLCAuZGVzY3IgPSAiaXMgdHVuaW5nIHJlc3BvbnNlIHJlY2VpdmVkIHdpdGggYWNrIG9yIG5hY2siLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9BQ0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhLCBhY2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV90dW5pbmdfcmVzcG9uc2VfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2FjaywgJnByb3BfZGVzY3JfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY2siLCAuZGVzY3IgPSAiaXMgdHVuaW5nIHJlc3BvbnNlIHJlY2VpdmVkIHdpdGggYWNrIG9yIG5hY2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSwgYWNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEiLCAuZGVzY3IgPSAiVHVuaW5nIHJlc3BvbnNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kZmkgPSB7IC5uYW1lID0gImRmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kZ2kgPSB7IC5uYW1lID0gImRnaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRnaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kb3dpID0geyAubmFtZSA9ICJkb3dpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkb3dpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2ludmFsaWRfZGJydV9yZXBvcnQgPSB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImludmFsaWRfZGJydV9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0lOVkFMSURfREJSVV9SRVBPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGludmFsaWRfZGJydV9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfbG9vY2kgPSB7IC5uYW1lID0gImxvb2NpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb29jaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfTE9PQ0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGxvb2NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9hbGFybSA9IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWxhcm1cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfZGlzYWJsZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2FibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfZW5hYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9lbmFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2VuYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X3R1bmluZ19pbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV90dW5pbmdfaW5fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19JTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV90dW5pbmdfaW5fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV90dW5pbmdfb3V0X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X3R1bmluZ19vdXRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29wdGljYWxfcmVmbGVjdGlvbiA9IHsgLm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvcHRpY2FsX3JlZmxlY3Rpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb3B0aWNhbF9yZWZsZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvc3NpYmxlX2RyaWZ0ID0geyAubmFtZSA9ICJwb3NzaWJsZV9kcmlmdCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG9zc2libGVfZHJpZnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3NzaWJsZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgPSB7IC5uYW1lID0gInBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9sZXZlbF9yZXBvcnQgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsX3JlcG9ydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfbGV2ZWxfcmVwb3J0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvd2VyX2xldmVsX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSA9IHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcHFzaSA9IHsgLm5hbWUgPSAicHFzaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHFzaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUFFTSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcHFzaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yYW5naW5nX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdpbmdfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmFuZ2luZ19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJlZ2lzdHJhdGlvbl9pZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCByZWdpc3RyYXRpb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3NkaSA9IHsgLm5hbWUgPSAic2RpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZGlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2RpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSA9IHsgLm5hbWUgPSAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3NmaSA9IHsgLm5hbWUgPSAic2ZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19zdWZpID0geyAubmFtZSA9ICJzdWZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdWZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdWZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Rpd2kgPSB7IC5uYW1lID0gInRpd2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInRpd2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHRpd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfdHVuaW5nX3Jlc3BvbnNlID0geyAubmFtZSA9ICJ0dW5pbmdfcmVzcG9uc2UiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInR1bmluZ19yZXNwb25zZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCB0dW5pbmdfcmVzcG9uc2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfZGZpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfZGdpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfZG93aSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2ludmFsaWRfZGJydV9yZXBvcnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19sb29jaSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9hbGFybSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2Rpc2FibGVfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2VuYWJsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV90dW5pbmdfb3V0X2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29wdGljYWxfcmVmbGVjdGlvbiwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvc3NpYmxlX2RyaWZ0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcG93ZXJfbGV2ZWxfcmVwb3J0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wcXNpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcmFuZ2luZ19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yZWdpc3RyYXRpb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3NkaSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3NmaSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3VmaSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Rpd2ksICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ190dW5pbmdfcmVzcG9uc2UgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGdpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZ2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkb3dpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkb3dpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZG93aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImludmFsaWRfZGJydV9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBpbnZhbGlkX2RicnVfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb29jaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9vY2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBsb29jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2FjdGl2YXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWxhcm1cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWxhcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2FibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2Rpc2FibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9lbmFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2VuYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X3R1bmluZ19pbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X3R1bmluZ19vdXRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvcHRpY2FsX3JlZmxlY3Rpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvcHRpY2FsX3JlZmxlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwb3NzaWJsZV9kcmlmdCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG9zc2libGVfZHJpZnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3NzaWJsZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxfcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9sZXZlbF9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9sZXZlbF9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBxc2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBxc2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwcXNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdpbmdfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmFuZ2luZ19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJlZ2lzdHJhdGlvbl9pZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2RpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZGlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZGkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2ZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN1ZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdWZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGl3aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHRpd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0dW5pbmdfcmVzcG9uc2UiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInR1bmluZ19yZXNwb25zZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHR1bmluZ19yZXNwb25zZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IHhncG9uX3RyeCA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl90cnggLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl90cnhfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3RyeF9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX3RyeCAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfYnVyc3RfcHJvZmlsZSA9IHsgLm5hbWUgPSAiYnVyc3RfcHJvZmlsZSIsIC5kZXNjciA9ICJidXJzdCBwcm9maWxlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGJ1cnN0X3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl9jb25maWcgPSB7IC5uYW1lID0gInRyYW5zY2VpdmVyX2NvbmZpZyIsIC5kZXNjciA9ICJ0cmFuc2NlaXZlciBjb25maWciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9DT05GSUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCB0cmFuc2NlaXZlcl9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfdHJhbnNjZWl2ZXJfdHlwZSA9IHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC5kZXNjciA9ICJ0cnggdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCB0cmFuc2NlaXZlcl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2RlYnVnID0geyAubmFtZSA9ICJkZWJ1ZyIsIC5kZXNjciA9ICJkZWJ1ZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgZGVidWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfZGVidWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jzc2lfbm9ybWFsX2NvbmZpZyA9IHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgbm9ybWFsIGNvbmZpZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJzc2lfbm9ybWFsX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcnNzaV9yYW5naW5nX2NvbmZpZyA9IHsgLm5hbWUgPSAicnNzaV9yYW5naW5nX2NvbmZpZyIsIC5kZXNjciA9ICJyc3NpIHJhbmdpbmcgY29uZmlnIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9SQU5HSU5HX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJzc2lfcmFuZ2luZ19jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19zZXJkZXNfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAic2VyZGVzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHNlcmRlc19jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2J1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMgPSB7IC5uYW1lID0gImJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMiLCAuZGVzY3IgPSAiYnVyc3QgcHJvZmlsZSBkZWxpbWl0ZXIgbWF4IGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCA9IHsgLm5hbWUgPSAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0IiwgLmRlc2NyID0gIlJlc2V0IHBhdHRlcm5zIHVzZWQgYXQgSW5pdCBvZiBSYW5naW5nLVdpbmRvdyBhbmQgYWZ0ZXIgQWNjZXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUgPSB7IC5uYW1lID0gInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSIsIC5kZXNjciA9ICJyYW5naW5nIHNtIHBhdHRlcm5zIEVEIGZhaWx1cmUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0VEX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jlc2V0X29uX2RlbF9taXNzID0geyAubmFtZSA9ICJyZXNldF9vbl9kZWxfbWlzcyIsIC5kZXNjciA9ICJyZXNldCBvbiBkZWwgbWlzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcmVzZXRfb25fZGVsX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2VkX3N0YXRlID0geyAubmFtZSA9ICJlZF9zdGF0ZSIsIC5kZXNjciA9ICJlZCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgZWRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfaW52ZXJ0X2VkID0geyAubmFtZSA9ICJpbnZlcnRfZWQiLCAuZGVzY3IgPSAiaW52ZXJ0IEVEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfSU5WRVJUX0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgaW52ZXJ0X2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19lbmRfb2ZfYnVyc3RfcmVzZXQgPSB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yZXNldCIsIC5kZXNjciA9ICJlbmQgb2YgYnVyc3QgcmVzZXQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkVTRVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBlbmRfb2ZfYnVyc3RfcmVzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3RyeF9yc3RfcG9sYXJpdHkgPSB7IC5uYW1lID0gInRyeF9yc3RfcG9sYXJpdHkiLCAuZGVzY3IgPSAiVFJYIHJlc2V0IHBvbGFyaXR5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyeF9yc3RfcG9sYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl90cnhfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19idXJzdF9wcm9maWxlLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3RyYW5zY2VpdmVyX2NvbmZpZywgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl90eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2RlYnVnLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jzc2lfbm9ybWFsX2NvbmZpZywgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19yc3NpX3JhbmdpbmdfY29uZmlnLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3NlcmRlc19jb25maWd1cmF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2J1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSwgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19yZXNldF9vbl9kZWxfbWlzcywgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19lZF9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19pbnZlcnRfZWQsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfZW5kX29mX2J1cnN0X3Jlc2V0LCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3RyeF9yc3RfcG9sYXJpdHkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJidXJzdF9wcm9maWxlIiwgLmRlc2NyID0gImJ1cnN0IHByb2ZpbGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgYnVyc3RfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgfSwgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl9jb25maWciLCAuZGVzY3IgPSAidHJhbnNjZWl2ZXIgY29uZmlnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IH0sIHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC5kZXNjciA9ICJ0cnggdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCB0cmFuc2NlaXZlcl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X3R5cGUgfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC5kZXNjciA9ICJkZWJ1ZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyB9LCB7IC5uYW1lID0gInJzc2lfbm9ybWFsX2NvbmZpZyIsIC5kZXNjciA9ICJyc3NpIG5vcm1hbCBjb25maWciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9ub3JtYWxfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIH0sIHsgLm5hbWUgPSAicnNzaV9yYW5naW5nX2NvbmZpZyIsIC5kZXNjciA9ICJyc3NpIHJhbmdpbmcgY29uZmlnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJzc2lfcmFuZ2luZ19jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnIH0sIHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAic2VyZGVzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gImJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMiLCAuZGVzY3IgPSAiYnVyc3QgcHJvZmlsZSBkZWxpbWl0ZXIgbWF4IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQgfSwgeyAubmFtZSA9ICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQiLCAuZGVzY3IgPSAiUmVzZXQgcGF0dGVybnMgdXNlZCBhdCBJbml0IG9mIFJhbmdpbmctV2luZG93IGFuZCBhZnRlciBBY2Nlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlIiwgLmRlc2NyID0gInJhbmdpbmcgc20gcGF0dGVybnMgRUQgZmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gfSwgeyAubmFtZSA9ICJyZXNldF9vbl9kZWxfbWlzcyIsIC5kZXNjciA9ICJyZXNldCBvbiBkZWwgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByZXNldF9vbl9kZWxfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVkX3N0YXRlIiwgLmRlc2NyID0gImVkIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGVkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZWRfc3RhdGUgfSwgeyAubmFtZSA9ICJpbnZlcnRfZWQiLCAuZGVzY3IgPSAiaW52ZXJ0IEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGludmVydF9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yZXNldCIsIC5kZXNjciA9ICJlbmQgb2YgYnVyc3QgcmVzZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgZW5kX29mX2J1cnN0X3Jlc2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidHJ4X3JzdF9wb2xhcml0eSIsIC5kZXNjciA9ICJUUlggcmVzZXQgcG9sYXJpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgdHJ4X3JzdF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeHBvbl9zZXJkZXMgPT09PSAqLworCisvKiBHcm91cDogeHBvbl9zZXJkZXMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIE5JIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19rZXlfaW5zdGFuY2UgPSB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIkluc3RhbmNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIGluc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2luc3RhbmNlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeHBvbl9zZXJkZXNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfa2V5X2luc3RhbmNlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBOSSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJpbnN0YW5jZSIsIC5kZXNjciA9ICJJbnN0YW5jZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5LCBpbnN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19pbnN0YW5jZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hwb25fc2VyZGVzX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeHBvbl9zZXJkZXMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfdmdhID0geyAubmFtZSA9ICJyeF92Z2EiLCAuZGVzY3IgPSAiUnggVmdhIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3ZnYSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9wZiA9IHsgLm5hbWUgPSAicnhfcGYiLCAuZGVzY3IgPSAiUGVha2luZyBGaWx0ZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9wZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9sZnBmID0geyAubmFtZSA9ICJyeF9sZnBmIiwgLmRlc2NyID0gIkxvdyBGcmVxdWVuY3kgUGVha2luZyBGaWx0ZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2xmcGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMSA9IHsgLm5hbWUgPSAicnhfZGZlMSIsIC5kZXNjciA9ICJSeCBERkUxIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTIgPSB7IC5uYW1lID0gInJ4X2RmZTIiLCAuZGVzY3IgPSAiUnggREZFMiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTMgPSB7IC5uYW1lID0gInJ4X2RmZTMiLCAuZGVzY3IgPSAiUnggREZFMyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTQgPSB7IC5uYW1lID0gInJ4X2RmZTQiLCAuZGVzY3IgPSAiUnggREZFNCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNCksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTUgPSB7IC5uYW1lID0gInJ4X2RmZTUiLCAuZGVzY3IgPSAiUnggREZFNSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X3ByZSA9IHsgLm5hbWUgPSAidHhfcHJlIiwgLmRlc2NyID0gIlR4IFByZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wcmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfbWFpbiA9IHsgLm5hbWUgPSAidHhfbWFpbiIsIC5kZXNjciA9ICJUeCBNYWluIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9tYWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X3Bvc3QxID0geyAubmFtZSA9ICJ0eF9wb3N0MSIsIC5kZXNjciA9ICJUeCBQb3N0MSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X3Bvc3QyID0geyAubmFtZSA9ICJ0eF9wb3N0MiIsIC5kZXNjciA9ICJUeCBQb3N0MiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDMgPSB7IC5uYW1lID0gInR4X3Bvc3QzIiwgLmRlc2NyID0gIlR4IFBvc3QzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9hbXAgPSB7IC5uYW1lID0gInR4X2FtcCIsIC5kZXNjciA9ICJUeCBBbXAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfYW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeHBvbl9zZXJkZXNfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X3ZnYSwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X3BmLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfbGZwZiwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTEsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9kZmUyLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMywgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTQsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9kZmU1LCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcHJlLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfbWFpbiwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X3Bvc3QxLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDIsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9wb3N0MywgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X2FtcCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicnhfdmdhIiwgLmRlc2NyID0gIlJ4IFZnYSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3ZnYSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X3BmIiwgLmRlc2NyID0gIlBlYWtpbmcgRmlsdGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfcGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9sZnBmIiwgLmRlc2NyID0gIkxvdyBGcmVxdWVuY3kgUGVha2luZyBGaWx0ZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9sZnBmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlMSIsIC5kZXNjciA9ICJSeCBERkUxIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTIiLCAuZGVzY3IgPSAiUnggREZFMiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTMiLCAuZGVzY3IgPSAiUnggREZFMyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTQiLCAuZGVzY3IgPSAiUnggREZFNCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTUiLCAuZGVzY3IgPSAiUnggREZFNSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInR4X3ByZSIsIC5kZXNjciA9ICJUeCBQcmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wcmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9tYWluIiwgLmRlc2NyID0gIlR4IE1haW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9tYWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDEiLCAuZGVzY3IgPSAiVHggUG9zdDEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLmRlc2NyID0gIlR4IFBvc3QyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInR4X3Bvc3QzIiwgLmRlc2NyID0gIlR4IFBvc3QzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInR4X2FtcCIsIC5kZXNjciA9ICJUeCBBbXAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9hbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gQVBJIEhlbHBlciBGdW5jdGlvbiBJbXBsZW1lbnRhdGlvbnMgPT09PSAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MzJfdCAqa2V5X3NpemUsIHVpbnQzMl90ICprZXlfb2Zmc2V0LCB1aW50MzJfdCAqZGF0YV9zaXplLCB1aW50MzJfdCAqZGF0YV9vZmZzZXQpCit7CisgICAgaWYgKCgoa2V5X3NpemUgPT0gTlVMTCkgfHwgKGtleV9vZmZzZXQgPT0gTlVMTCkpIHx8ICgoZGF0YV9zaXplID09IE5VTEwpIHx8IChkYXRhX29mZnNldCA9PSBOVUxMKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9iaikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX05JX09QRVJfSURfU0VUX0FFX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9DSEFOTkVMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9jaGFubmVsX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2xpX291dHB1dCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19BVVRPX0lEX0ZJTEVfQUxNT1NUX0ZVTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGwsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfQ0xJX0lOUFVUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVEFSVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RPUF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERVZJQ0U6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfUkVBRFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VYQ0VQVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19leGNlcHRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0REUl9URVNUX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9DT05ORUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcmVzZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcmVzZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSE9TVF9LRUVQX0FMSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1NXX1VQR1JBREVfQUNUSVZBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3QsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX01BWF9MSU5LX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUkFOR0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JPR1VFX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9FTkNSWVBUSU9OX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX1JFR19BQ0tfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUkFOR0VfVkFMVUVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX1NQRUVEX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2gsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RFUkVHSVNURVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19ERUxFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9GT1JDRV9SRURJU0NPVkVSWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfREVMRVRFX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmssIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX0lOSkVDVF9GUkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlg6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9GUkFNRV9DQVBUVVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9OT19SRVBPUlRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0cywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUk9HVUVfU0NBTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9TRVRfRVBPTl9OSV9FTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmssIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGluaywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmssIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1JPR1VFX0xMSURfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1JQOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3JwX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BJTzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0M6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9TRVRfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfU0NBTl9NQUNfVEFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9ORVdfTUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19BR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfTU9WRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9sb3MsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfbG9zLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfVVBHUkFERV9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yZXNldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9UT0RfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZmksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TREk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NkaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NkaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGZpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2RmaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGZpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3VmaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdWZpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9BSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9haSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2FpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZ2ksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZ2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QRUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BlZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BlZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV90aXdpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9LSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9raSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2tpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTUVNSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9tZW1pLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZXJyLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Vycl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZXJyLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkVJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yZWksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yZWksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9TU0lCTEVfRFJJRlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWwsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWwsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fVFJYOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0xPR0dFUjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9DTEVBUl9MT0c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3csIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0M6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0cywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9sb3MsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9sb3MsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9QT05fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yZXNldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9UT0RfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fT05VOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0FMQVJNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9hbGFybSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RPV0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZGksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NkaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NkaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ERkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUFFTSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wcXNpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVUZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N1ZmksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdWZpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RJV0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Rpd2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfTE9PQ0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2ksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RHSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZ2ksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2RnaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RnaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SRUdJU1RSQVRJT05fSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTEVWRUxfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RVTklOR19SRVNQT05TRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2UsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9DT05TVU1QVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19JTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX0NQVV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOyAgICAvKio8ICBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworfQorCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgY29uc3QgY2hhciAqKm5hbWUsIGNvbnN0IGNoYXIgKipkZXNjcikKK3sKKyAgICBzd2l0Y2ggKG9iaikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X2FlX25pX2VuX3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgdGhlIEFFIE5JIGVuYWJsZSBzdGF0ZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWJvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NV8xMjciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGF0YV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhYm9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYWJvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZjc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvdmVyc2l6ZV9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnVudF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0NIQU5ORUw6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfQVVUT19JRF9DTElfT1VUUFVUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjbGlfb3V0cHV0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDTEkgT3V0cHV0IFN0cmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19BVVRPX0lEX0ZJTEVfQUxNT1NUX0ZVTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZpbGVfYWxtb3N0X2Z1bGwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHdoZW4gRERSIGxvZyBmaWxlIGlzIDc1JSBmdWxsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX0NMSV9JTlBVVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2xpX2lucHV0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDTEkgSW5wdXQgU3RyaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RBUlRfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X2FwaV9jYXB0dXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGFydCBBUEkgQ2FwdHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0b3BfYXBpX2NhcHR1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0b3AgQVBJIENhcHR1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVzZXRfYXBpX2NhcHR1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlc2V0IEFQSSBDYXB0dXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERVZJQ0U6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZXZpY2VfcmVhZHkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRldmljZSByZWFkeSBpbmRpY2F0aW9uIHVzZWQgYnkgdGhlIGRldmljZSBjb250cm9sIGxpYnJhcnkgKG5vdCBzZW50IHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uKS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29ubmVjdGlvbl9lc3RhYmxpc2hlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ29ubmVjdGlvbiBlc3RhYmxpc2hlZCBpbmRpY2F0aW9uIHVzZWQgYnkgdGhlIGRldmljZSBjb250cm9sIGxpYnJhcnkgKG5vdCBzZW50IHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uKS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRldmljZV9rZWVwX2FsaXZlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBob3N0IC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNvbm5lY3Rpb25fZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGhvc3QgZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIGRldmljZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29ubmVjdGlvbl9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGhvc3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAgVGhlIGRldmljZSBoYXMgZWl0aGVyIGJlZW4gcmVwcm9ncmFtbWVkIHdpdGggbmV3IGZpcm13YXJlLCBvciBhIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIHdpdGggYW4gZXhpc3RpbmcgZGV2aWNlIChzZWUgdGhlIFwic3RhbmRhbG9uZVwiIGZpZWxkKS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfRElTQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGlzY29ubmVjdGlvbl9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGhvc3Qgc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBkZXZpY2UuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzd19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3cgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVhDRVBUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzd19leGNlcHRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN3IGV4Y2VwdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbmRpY2F0aW9uc19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gaW5kaWNhdGlvbnMgYXJlIGRyb3BwZWQgZHVlIHRvIGNvbmdlc3Rpb24gLyBzaGFwaW5nLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkltYWdlIFRyYW5zZmVyIENvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0REUl9URVNUX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZHJfdGVzdF9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIEREUiBUZXN0IGhhcyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNvbm5lY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YXJ0IGNvbm5lY3Rpb24gcHJvY2VzcyBiZXR3ZWVuIHRoZSBob3N0IHByb2Nlc3NvciBhbmQgdGhlIGRldmljZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkaXNjb25uZWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEaXNjb25uZWN0IHRoZSBob3N0IGZyb20gdGhlIGRldmljZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVzZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlc2V0cyB0aGUgaG9zdC9kZXZpY2UuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0hPU1RfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaG9zdF9rZWVwX2FsaXZlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgaG9zdCB0byB0aGUgZGV2aWNlIC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAoc2hvdWxkIG5vdCBiZSBzZW50IGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uKS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfU1dfVVBHUkFERV9BQ1RJVkFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3dfdXBncmFkZV9hY3RpdmF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU1cgaW1hZ2UgYWN0aXZhdGlvbiBmb3IgSW4tU2VydmljZSBTVyB1cGdyYWRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9zdGFydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhpcyBBUEkgbWVzc2FnZSBpbmZvcm1zIHRoZSBPTFQgb2YgdGhlIHN0YXJ0IG9mIGltYWdlIHRyYW5zZmVyLCBhbmQgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBmaWxlIGltYWdlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9kYXRhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ1c2VkIGZvciB0cmFuc2ZlcnJpbmcgdGhlIGFjdHVhbCBkYXRhIGZyb20vdG8gdGhlIE9MVC4gICBub3QgdG8gYmUgZGlyZWN0bHkgY2FsbGVkIGJ5IHRoZSB1c2VyLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ1bl9kZHJfdGVzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUnVuIGEgdGVzdCBvbiBvbmUgb3IgbW9yZSBvZiB0aGUgRERSIGNvbXBvbmVudHMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgd2hpbGUgdGhlIFBPTiB3YXMgc2V0IHRvIFwibm90aWZ5IHVua25vd25cIiByZWdpc3RyYXRpb24gYmVoYXZpb3IgYW5kIHRoaXMgbGluayB3YXMgbm90IHByZS1wcm92aXNpb25lZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhpcyBpcyB3aGVuIGxpbmsgdHJpZXMgdG8gcmVnaXN0ZXIgYW5kIHRoZXJlIGFyZSBhbHJlYWR5IHRvbyBtYW55IGV4aXN0aW5nIGxhc2VyIG9uL29mZiBjb21iaW5hdGlvbnMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGlzIGlzIHdoZW4gYSBsaW5rIHRyaWVzIHRvIHJlaWdzdGVyIHdpdGggYW4gaW1wb3NzaWJsZSBsYXNlciBvbiBvciBvZmYgdGltZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX01BWF9MSU5LX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibWF4X2xpbmtfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIGl0IHdvdWxkIGhhdmUgcHV0IHVzIG92ZXIgdGhlIHByb3Zpc2lvbmVkIG1heCBsaW5rcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgRVBPTiBOSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgdGhlcmUgYXJlIG5vIExMSURzIGF2YWlsYWJsZS4gSWYgdGhpcyBvY2N1cnMsIGl0IGlzIHBvc3NpYmxlIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggeW91ciAnbWF4IGxpbmtzJyBhbmQvb3IgJ0Jhc2UgTExJRCcgZmllbGRzIG9uIHlvdXIgUlAuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIHdlIHdlcmUgdW5hYmxlIHRvIGFsbG9jYXRlIHN5c3RlbSByZXNvdXJjZXMgZm9yIGl0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUkFOR0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyYW5nZV92aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciB3aXRoIGEgcmFuZ2UgdmFsdWUgdGhhdCB3YXMgb3V0c2lkZSBvZiB0aGUgbWluL21heCBmaWJlciBsZW5ndGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJURE0gQ2hhbm5lbHMgRXhoYXVzdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9ST0dVRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBSb2d1ZSBPTlUgd2FzIGRldGVjdGVkIG9uIHRoaXMgbGluay9MTElELiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoaXMgbGluayBmYWlsZWQgdG8gcmVnaXN0ZXIgYmVjYXVzZSB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IHVwc3RyZWFtIGJhbmR3aWR0aCBhdmFpbGFibGUgdG8gcHJvdmlkZSB0aGUgZGVmYXVsdCBVQkQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9kYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZGF0YV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29hbV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29hbV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfbXBjcF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcmVwb3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mY3NfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb3ZlcnNpemVfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3J1bnRfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfbGluZV9jb2RlX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfbGluZV9jb2RlX2Vycm9yX21heCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBsaW5lIGNvZGUgZXJyb3JzIG1heCByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2RhdGFfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X29hbV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X29hbV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfbXBjcF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZ2F0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZ2F0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBPTFQgZmFpbGVkIHRvIHJlY2VpdmUgYW4gdXBkYXRlZCBlbmNyeXB0aW9uIGtleSB3aXRoaW4gdGhlIGV4cGVjdGVkIHRpbWUgcGVyaW9kIGFmdGVyIGVuY3J5cHRpb24ga2V5IGV4Y2hhbmdlIGhhcyBiZWVuIGluaXRpYXRlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfRU5DUllQVElPTl9FTkFCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJlbmNyeXB0aW9uX2VuYWJsZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkVuY3J5cHRpb24gaGFzIGJlZW4gc3RhcnRlZCBvbiB0aGUgTWFwbGUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtcGNwX3JlZ19hY2tfdGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQW4gTVBDUCByZWdpc3RlciBhY2tub3dsZWRnZW1lbnQgd2FzIG5vdCByZWNlaXZlZCBpbiB0aGUgZXhwZWN0ZWQgdGltZSBpbnRlcnZhbCBmb3IgYSBsaW5rIHRoYXQgdHJpZWQgdG8gcmVnaXN0ZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUkFOR0VfVkFMVUVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmFuZ2VfdmFsdWVfY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBzZW50IHdoZW4gYSByYW5nZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBsaW5rIGhhcyB1bmRlcmdvbmUgYSBwcm90ZWN0aW9uIHN3aXRjaCBldmVudC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIHJlZ2lzdGVyIHJlcXVlc3RlZCB3YXMgcmVjZWl2ZWQgZm9yIGEgbGluayB3aXRoIHRoZSBzYW1lIE1BQyBhZGRyZXNzIGFzIGEgbGluayB0aGF0IGhhcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0xJTktfU1BFRURfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxpbmtfc3BlZWRfbWlzbWF0Y2giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkhvc3Qgd2lsbCByZWNlaXZlIHRoaXMgaW5kaWNhdGlvbiBpZiBhIGxpbmsgcmVnaXN0ZXJzIHRoZW4gYXR0ZW1wdHMgdG8gcmVnaXN0ZXIgbGF0ZXIgYXQgYSBkaWZmZXJlbnQgc3BlZWQsIG9yIGlmIHRoZSBsaW5rIHJlZ2lzdGVycyBhdCBhIGRpZmZlcmVudCBzcGVlZCB0aGFuIHRoZSBzcGVlZCB3aXRoIHdoaWNoIGl0IHdhcyBwcmUtcHJvdmlzaW9uZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBwcm92aXNpb25lZCBsaW1pdCBiZXR3ZWVuIHJlcG9ydHMgZm9yIHRoZSBzcGVjaWZpZWQgbGluayBoYXMgYmVlbiBleGNlZWRlZC4gIFRoaXMgbGluayB3aWxsIGJlIGRlLXJlZ2lzdGVyZWQsIGFuZCB0aGUgYWxhcm1fc3RhdHVzIHNldCB3aGVuIHRoaXMgb2NjdXJzLiAgVGhlIGFsYXJtX3N0YXR1cyB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgbGluayBhdHRlbXB0cyB0byByZWdpc3RlciBhZ2Fpbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVvdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBwcm92aXNpb25lZCB0aW1lIGxpbWl0IGJldHdlZW4gcmVjZWl2aW5nIHVwc3RyZWFtIGluZm8gZnJhbWVzIGhhcyBiZWVuIGV4Y2VlZGVkLiAgTm9ybWFsbHkgYW4gT05VIHdpbGwgcmVzZXQgaXRzIE9BTSBzdGF0ZSBtYWNoaW5lIHdoZW4gdGhpcyBvY2N1cnJzIGFuZCB0aGUgaG9zdCBtdXN0IHJlLW5lZ290aWF0ZSBPQU0gYW5kIHJlcHJvdmlzaW9uIHRoZSBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfZGlzY292ZXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBsaW5rIGhhcyBjb21wbGV0ZWQgTVBDUCBsaW5rIHJlZ2lzdHJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ERVJFR0lTVEVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfZGVyZWdpc3RlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaW5rIGhhcyBjb21wbGV0ZWQgTVBDUCBkZS1yZWdpc3RyYXRpb24uICBUaGlzIGNvdWxkIGJlIGFjY29tcGFuaWVkIGJ5IGFuIG1wY3BfcmVwb3J0X3RpbWVvdXQgYWxhcm0gaWYgdGhlIGxpbmsganVzdCBkaXNhcHBlYXJlZCwgb3Igbm90IGlmIHRoaXMgaW5kaWNhdGlvbiBpcyBhIHJlc3VsdCBvZiBhbiBPTFQgc2VuZGluZyBhIE1QQ1AgZGVyZWdpc3RlciB0byB0aGUgbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJhaXNlZCBhZnRlciBhbiAnYWRkX2xpbmsnIG9wZXJhdGlvbiBvbiBhbiBFUE9OIE5JIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9BTSBrZWVwYWxpdmUgdGltZXIgaXMgc3RhcnRlZCBmb3IgdGhpcyBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT0FNIGtlZXBhbGl2ZSB0aW1lciBpcyBzdG9wcGVkIGZvciB0aGlzIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9zdG9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXlfZXhjaGFuZ2Vfc3RvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RhdGljIHJlZ2lzdHJhdGlvbiBkb25lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZS1yYW5nZSBmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0xJTktfREVMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGlua19kZWxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMaW5rIERlbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9GT1JDRV9SRURJU0NPVkVSWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZm9yY2VfcmVkaXNjb3ZlcnkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRlcmVnaXN0ZXIgdGhlIHNwZWNpZmllZCBFUE9OIGxpbmsgYW5kIGZvcmNlIGl0IHRvIHJlLXJlZ2lzdGVyLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGVsZXRlX2xpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlbW92ZSBhIGxvZ2ljYWwgbGluayBmcm9tIHRoZSBzeXN0ZW0gZW50aXJlbHkuIElmIHRoZSBsaW5rIGlzIG5vdCByZWdpc3RlcmVkLCBpdCB3aWxsIGJlIHJlbW92ZWQuICBJZiB0aGUgbGluayBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCwgaXQgd2lsbCAgZGVyZWdpc3RlcmVkIGFuZCByZW1vdmVkLiAgSXQgbWF5IGltbWVkaWF0ZWx5IHJlLXJlZ2lzdGVyIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzIGlmIHRoZSBFUE9OX05JIGlzIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWxsIGxpbmtzIHRvIHJlZ2lzdGVyLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGFydCB0aGUgT0FNIGtlZXBhbGl2ZSB0aW1lciBhZ2FpbnN0IHRoaXMgbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0b3AgdGhlIE9BTSBrZWVwYWxpdmUgdGltZXIgZm9yIHRoaXMgbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFwcGx5IHRoZSBjb3JyZXNwb25kaW5nIHByb3Zpc2lvbmluZyBmb3IgJ2Vwb25fbGluay5rZXlfZXhjaGFuZ2VfY29uZmlnJyBhZ2FpbnN0IHRoaXMgbGluayBhbmQgdGhlbiBzdGFydCBrZXkgZXhjaGFuZ2UgdGltZXIgd2l0aCB0aGUgZ2l2ZW4gcGVyaW9kLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0b3AiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0b3BzIHRoZSBrZXkgZXhjaGFuZ2UgdGltZXIgZm9yIHRoaXMgbGluay4gVGhpcyBvcGVyYXRpb24gc2hvdWxkIGdlbmVyYWxseSBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwga2V5X2V4Y2hhbmdlX3N0YXJ0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0aWNfcmVnaXN0cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGF0aWNhbGx5IHJlZ2lzdGVycyB0aGUgbG9naWNhbCBsaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX0lOSkVDVF9GUkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaW5qZWN0X2ZyYW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW5kIGFuIGFyYml0cmFyeSBmcmFtZSBhY3Jvc3MgdGhlIHNwZWNpZmllZCBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlg6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9GUkFNRV9DQVBUVVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVfY2FwdHVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgZnJhbWUgbWF0Y2hpbmcgaG9zdC1zcGVjaWZpZWQgY3JpdGVyaWEgd2FzIHJlY2VpdmVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTk9fUkVQT1JUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibm9fcmVwb3J0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTG9zcyBvZiBhbGwgcmVwb3J0cyBvbiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0xMSURfUVVBUkFOVElORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxsaWRfcXVhcmFudGluZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxMSUQgUXVhcmFudGluZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgYWZ0ZXIgYSAnc2V0X2Vwb25fbmlfZW5fc3RhdGUnIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRlcyB0aGUgcmUtcmFuZ2luZyBwcm9jZXNzIGhhcyBmYWlsZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFVwZ3JhZGUgQ29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JPR1VFX1NDQU5fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX3NjYW5fY29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGNpYXRpb24gdGhhdCBhIHNjYW4gaXMgY29tcGxldGUsIGFueSBlcnJvciBpcyBhbHNvIHJldHVybmVkLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgY2xvY2sgdHJhbnNwb3J0IHB1bHNlIHdhcyByZWNlaXZlZCBhdCB0aGUgZ2l2ZW4gTVBDUCB0aW1lc3RhbXAuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBhdXRvIHJvZ3VlIHNjYW4gZm91bmQgcG9zc2libGUgcm9ndWUgb251cyBvbiB0aGUgMUcgc3RyZWFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBhdXRvIHJvZ3VlIHNjYW4gZm91bmQgcG9zc2libGUgcm9ndWUgb251cyBvbiB0aGUgMUcgc3RyZWFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfZXBvbl9uaV9lbl9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IHRoZSBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImlzc3VlX3Jzc2lfZ3JhbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIklzc3VlcyBhbiBSU1NJIGdyYW50IHRvIHJlYWQgUlggUG93ZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhZGRfbGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUHJlLXByb3Zpc2lvbiBhbiBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkZF9tdWx0aWNhc3RfbGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUHJlLXByb3Zpc2lvbiBhbiBFUE9OIG11bHRpY2FzdCBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBZGRzIGEgcHJvdGVjdGVkIHN0YW5kYnkgbGluay4gIE9uY2UgaXQgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIGxpbmsgaXMgY29uc2lkZXJlZCBcInN0YW5kYnlcIiBmb3IgdGhlIHB1cG9zZXMgb2YgcHJvdGVjdGlvbiBzd2l0Y2hpbmcuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBseSByZS1yYW5nZSBkZWx0YSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyb2d1ZV9sbGlkX3NjYW4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIklzc3VlIGEgcmVxdWVzdCB0byBzY2FuIGFsbCBMTElEcyBvciBhIHNwZWNpZmljIExMSUQgb24gYSBQT04iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGFydF9vbnVfdXBncmFkZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RhcnQgT05VIEZpcm13YXJlIFVwZ3JhZGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2RlX3dvcmRzX3RvdGFsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgc3RhdHMgY29kZSB3b3JkcyB0b3RhbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgZGVjb2RlIGZhaWxzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX3plcm9lc19jb3JyZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBzdGF0cyB6ZXJvcyBjb3JyZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfb25lc19jb3JyZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBzdGF0cyBvbmVzIGNvcmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ29vZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkdvb2QgRnJhbWUgQ291bnQsIGluY2x1ZGluZyBub25GRUMgYW5kIEZFQyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdvb2RfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkdvb2QgQnl0ZSBDb3VudCwgaW5jbHVkaW5nIG5vbkZFQyBhbmQgRkVDIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3ZlcnN6X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT3ZlcnNpemVkIGZyYW1lIGNvdW50IChmcmFtZXMgbGFyZ2VyIHRoYW4gMjAwMCBieXRlcykiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJub25fZmVjX2dvb2RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOb24gRkVDIEdvb2QgRnJhbWUgQ291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJub25fZmVjX2dvb2RfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk5vbiBGRUMgR29vZCBCeXRlIENvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2dvb2RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgR29vZCBGcmFtZSBDb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19nb29kX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgR29vZCBCeXRlIENvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2ZyYW1lc19leGNfZXJycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIEZyYW1lcyB3aGljaCBleGNlZWRlZCA4IHN5bWJvbCBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfYmxrc19ub19lcnJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggbm8gZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2Jsa3NfY29ycl9lcnJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggY29ycmVjdGFibGUgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19ibGtzX3VuY29ycl9lcnJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggdW5jb3JyZWN0YWJsZSBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvcnJfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBDb3JyZWN0ZWQgQnl0ZXMvU3ltYm9scyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29ycl96ZXJvZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBDb3JyZWN0ZWQgWmVyb2VzLCA4YiBkb21haW4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvcnJfb25lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBPbmVzLCA4YiBkb21haW4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5kZXJzel9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlVuZGVyc2l6ZSBmcmFtZSBjb3VudCAoZnJhbWVzIGxlc3MgdGhhbiA2NCBieXRlcykiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZXJyb3Jzel9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkVycm9yZWQgZnJhbWUgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgT0FNIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJnYXRlX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFib3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NV8xMjciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGF0YV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXBvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWJvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmY3NfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3JjXzhfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3V0X29mX3Nsb3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm92ZXJzaXplX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJydW50X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGF0YV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJnYXRlX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhYm9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NV8xMjciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlcG9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFib3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmY3NfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcmNfOF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm91dF9vZl9zbG90IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIG91dCBvZiBzbG90IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm92ZXJzaXplX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ1bnRfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1JQOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQSU86CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBCeXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNvbGxlY3RlZCBhbGxvYyBJRCBzdGF0aXN0aWNzIGZyb20gZ2V0X3N0YXRzIG9wZXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXRzIHRoZSBhbGxvYydzIGFjdGl2YXRpb24gc3RhdGUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCBuZWNlc3Nhcnkgc2luY2UgYWxsb2NzIGFyZSBhY3RpdmF0ZWQvZGVhY3RpdmF0ZWQgYXV0b21hdGljYWxseSBhbG9uZyB3aXRoIHRoZSBPTlUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9zdGF0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb25maWd1cmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXRzIHRoZSBHRU0gcG9ydCdzIGFjdGl2YXRpb24gc3RhdGUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCBuZWNlc3Nhcnkgc2luY2UgR0VNIHBvcnRzIGFyZSBhY3RpdmF0ZWQvZGVhY3RpdmF0ZWQgYXV0b21hdGljYWxseSBhbG9uZyB3aXRoIHRoZSBPTlUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRzX2hpdF9ldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRFMgaGl0IGV2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHNfbWlzc19ldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRFMgbWlzcyBldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRTIGRyb3AgZHVlIHRvIG1pc3MgZXZlbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRTIGRyb3AgZHVlIHRvIGhpdCBldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEUyBkcm9wIHRvIGRpc2FibGVkIEdFTSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5ld19tYWNfZGlzY292ZXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTmV3IE1BQyBkaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibW92ZV9ldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTW92ZSBldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOZXcgTUFDIGRyb3AgZHVlIHRvIGZpZm8gZnVsbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGbHVzaCBNQUMgVGFibGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzY2FuX21hY190YWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgTUFDIHRhYmxlIHNjYW4gaW5pdGlhdGVkIHVzaW5nIHRoZSBcInNjYW5fbWFjX3RhYmxlXCIgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmx1c2hfbWFjX3RhYmxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGbHVzaCBNQUMgVGFibGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9TQ0FOX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2Nhbl9tYWNfdGFibGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNjYW5zIE1BQyB0YWJsZSBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcyB0aGVuIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTkVXX01BQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibmV3X21hYyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgbmV3IE1BQyBhZGRyZXNzIC8gVklEIGNvbWJpbmF0aW9uIGlzIHNlZW4gaW4gdGhlIHVwc3RyZWFtIHRyYWZmaWMgc3RyZWFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfQUdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibWFjX2FnZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIE1BQyB0YWJsZSBlbnRyeSBhZ2VzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfTU9WRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibWFjX21vdmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiB0aGUgTUFDIHRhYmxlIGlzIGluIG1vdmUgbW9kZSBhbmQgYSBwYWNrZXQgaXMgc2VlbiB0aGF0IG1hdGNoZXMgb24gTUFDIGFkZHJlc3MgLyBWSUQgYnV0IGRvZXNuJ3QgbWF0Y2ggb24gZmxvdyBJRC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1hY19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYW4gZW50cnkgY2Fubm90IGJlIGxlYXJuZWQgc2luY2UgdGhlIE1BQyB0YWJsZSBpcyBmdWxsLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgRkVDIGNvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHVuY29ycmVjdGVkIEZFQyBjb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiaXA4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBieXRlcyBwcm90ZWN0ZWQgYnkgYmlwOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDhfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBiaXA4IGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2dlbV9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBHRU0gZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZ2VtX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgR0VNIElEIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nZW1faWRsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBHRU0gZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZ2VtX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nZW1faWxsZWdhbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgaWxsZWdhbCBHRU0gZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIGFsbG9jYXRpb25zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGludmFsaWQgYWxsb2NhdGlvbnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2Ftc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZXJyb3IgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2Ftc19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9jcHUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIENQVSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Ryb3BwZWRfdG9vX3Nob3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9jcmNfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gY3JjIGVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2tleV9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBrZXkgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhZ21lbnRzX2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGZyYWdtZW50YXRpb24gZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJHbG9iYWwgZHJvcHBlZCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2dlbSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9nZW1fZnJhZ21lbnRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhZ21lbnRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2NwdSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgQ1BVIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfb21jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgT01DSSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRyb3BwZWQgYmVjYXVzZSBvZiBUUElEIG1pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZHJvcHBlZF92aWRfbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFZJRCBtaXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RhdGUgQ2hhbmdlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsb3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxPUyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VyaWFsIE51bWJlciBBY3F1aXNpdGlvbiBDeWNsZSBTdGFydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBUcmFmZmljIFJlc3VtZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9kaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGlzY292ZXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3B1X3BhY2tldHNfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBmYWlsdXJlIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIFwiY3B1X3BhY2tldHNcIiBwcm94eSBvcGVyYXRpb24uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSb2d1ZSBkZXRlY3Rpb24gY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImRlYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImRpc2FibGUgYWxsIG9udXMgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJlbmFibGUgYWxsIG9udXMgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVE9EIHJlcXVlc3QgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfVVBHUkFERV9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBVcGdyYWRlIENvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUm9ndWUgT05VIHNwZWNpYWwgbWFwIGN5Y2xlIHN0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X3Bvbl9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IFBPTiBTdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlc2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZXNldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkaXNhYmxlX3NlcmlhbF9udW1iZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRpc2FibGUgU2VyaWFsIE51bWJlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2luZ2xlIHJlcXVlc3QgZm9yIFBPTiBtb25pdG9yaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfb251X3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgdGhlIG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2RldGVjdGlvbl93aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBXaW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0b2RfcmVxdWVzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVE9EIHJlcXVlc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAicHJvdGVjdGlvbiBzd2l0Y2hpbmcgdHlwZSBjIHNldCBtdWx0aXBsZSBvbnUgc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGFydF9vbnVfdXBncmFkZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT0xUIHRvIE9OVSBmaXJtd2FyZSB0cmFuc2ZlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJHUE9OIENQVSBQYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQnJvYWRjYXN0IFBMT0FNIFBhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUb3RhbCByZWNlaXZlZCBGRUMgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2J5dGVzX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIGNvZGV3b3JkcyBjb3JyZWN0ZWQgYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIG5vdCBjb3JyZWN0ZWQgY29kZXdvcmRzIGVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmlwOF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgZm9yIEJJUDgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiaXA4X2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQml0IGVycm9yIGFjY29yZGluZyB0byBCSVA4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2NyY19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgUExPQU1zIHdpdGggQ1JDIGVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQTE9BTXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwb3NpdGl2ZV9kcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUG9zaXRpdmUgZHJpZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJuZWdhdGl2ZV9kcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTmVnYXRpdmUgZHJpZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmVyX3JlcG9ydGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCRVIgcmVwb3J0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5yZWNlaXZlZF9idXJzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVW5yZWNlaXZlZCBidXJzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsY2RnX2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTENERyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmRpX2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUkRJIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAicnggYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAicnggcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAidHggYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAidHggcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9hbGFybSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIEFsYXJtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZG93aSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNmaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2lnbmFsIEZhaWwgb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2RpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaWduYWwgRGVncmFkZWQgb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGZpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN1ZmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNVRmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0FJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsb2FpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMT0FpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZ2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwZWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlBFRSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQU1QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0aXdpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0tJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsb2tpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMT2tpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTUVNSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibWVtaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTUVNaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTUNJIFBPUlQgSUQgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQkVSIEludGVydmFsIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRVJSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJlcnIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkVSUiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JFSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSRUkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJhbmdpbmcgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBEZWFjdGl2YXRpb24gQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9lbmFibGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRW5hYmxlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGlzYWJsZSBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbnZhbGlkX2RicnVfcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnZhbGlkIERCUnUgUmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEtleSBSZXF1ZXN0IFRpbWVvdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBDeWNsZSBTa2lwcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIFVuY29uc2VjdXRpdmUgSW5kZXgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJTU0kgTWVhc3VyZW1lbnQgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgRGVjcnlwdCBSZXF1aXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBbiBvcHRpY2FsIHJlZmxlY3Rpb24gY29uZGl0aW9uIHdhcyBkZXRlY3RlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIm9udSBhY3RpdmF0aW9uIHN0YW5kYnkgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9TU0lCTEVfRFJJRlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvc3NpYmxlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUgbWF5IGJlIGV4cGVyaWVuY2luZyBkcmlmdCBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiBUaGUgZXN0aW1hdGUgbWF5IGJlIGluYWNjdXJhdGUgZGVwZW5kaW5nIG9uIE9OVSBiZWhhdmlvci4gQWN0dWFsIGRyaWZ0IG1heSBiZSBsZXNzIHRoYW4gZXN0aW1hdGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNldF9vbnVfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldCBPTlUgU3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyc3NpX21lYXN1cmVtZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjaGFuZ2VfcG93ZXJfbGV2ZWwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNoYW5nZSBQb3dlciBMZXZlbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiR1BPTiBDUFUgUGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBsb2FtX3BhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUExPQU0gUGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3B1X3BhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGVzIENQVSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbWNpX3BhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGVzIE9NQ0kgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXNnX2NvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJtc2cgY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsb3N0X21zZ19jb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAibG9zdCBtc2cgY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HR0VSOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGluZXNfaW5fbG9nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJsaW5lcyBpbiBsb2ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX09QRVJfSURfQ0xFQVJfTE9HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjbGVhcl9sb2ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNsZWFyIGxvZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggNjQgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY1IHRvIDEyNyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZ29vZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3VuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuaWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9tdWx0aWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnJvYWRjYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZmNzX2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9jb250cm9sX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGF1c2VfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhdXNlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGZjX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBQRkMgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF91bnN1cHBvcnRlZF9vcGNvZGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgVW5zdXBwb3J0ZWQgT3Bjb2RlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfdW5zdXBwb3J0ZWRfZGEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5zdXBwb3J0ZWQgREEgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGlnbm1lbnRfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFsaWdubWVudCBlcnJvcnMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbGVuZ3RoIG91dCBvZiByYW5nZSBlcnJvcnMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NvZGVfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGNvZGUgZXJyb3JzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vdmVyc2l6ZWRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2phYmJlcl9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gdGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBDUkMsIGNvZGUgZXJyb3IsIG9yIElFRUUgbGVuZ3RoIGNoZWNrIGVycm9yLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9tdHVfY2hlY2tfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIE1UVSBDaGVjayBFcnJvcnMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Byb21pc2N1b3VzX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkgdGhhdCBhcmUgbm90IGNvbnRyb2wgcGFja2V0cyBhbmQgaGF2ZSBhIERBIHRoYXQgaXMgbm90IG1hdGNoaW5nIHdpdGggdGhlIFJYIFNBLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF92bGFuX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9kb3VibGVfdmxhbl9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZG91YmxlIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfdHJ1bmNhdGVkX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB0cnVuY2F0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gUlggRklGTyBGdWxsLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfdW5kZXJzaXplX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bmRlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhZ21lbnRlZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhZ21lbnRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3J1bnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHJ1bnQgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY1IHRvIDEyNyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJ5dGVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9nb29kX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgbXVsdGljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wYXVzZV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wZmNfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2phYmJlcl9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBGQ1MuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Zjc19lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgRkNTIGVycm9ycyBvbiB0aGlzIE5OSS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2NvbnRyb2xfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGNvbnRyb2wgZnJhbWVzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfb3ZlcnNpemVfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFnbWVudGVkX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Vycm9yX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBlcnJvcmVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3ZsYW5fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiBUaGlzIGNvdW50cyBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHRhZ2dlZCBmcmFtZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2RvdWJsZV92bGFuX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9ydW50X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3VuZGVycnVuX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmRlcnJ1biBmcmFtZXMgb24gdGhpcyBOTkkuIFRodXMgaGFwcGVucyB3aGVuIGEgZnJhbWUgZW5jb3VudGVycyBhIE1BQyB1bmRlcnJ1biAoVHggU3luYyBGSUZPIHJ1bnMgb3V0IG9mIGRhdGEgYmVmb3JlIHRoZSBlbmQgb2YgcGFja2V0KS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0dXNfY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTk5JIExpbmsgc3RhdHVzIGNoYW5nZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDYXB0dXJlIHdpbmRvdyBhbmQgc3RhdGlzdGljIGNvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X2NhcHR1cmVfd2luZG93IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGFydCBjYXB0dXJlIHdpbmRvdyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVE9QX0NBUFRVUkVfV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdG9wX2NhcHR1cmVfd2luZG93IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdG9wIGNhcHR1cmUgd2luZG93IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgYWxsb2MgSUQgcmVjZWl2ZWQgYnl0ZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb2xsZWN0ZWQgYWxsb2MgSUQgc3RhdGlzdGljcyBmcm9tIGdldF9zdGF0cyBvcGVyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9zdGF0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXRzIHRoZSBhbGxvYydzIGFjdGl2YXRpb24gc3RhdGUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCBuZWNlc3Nhcnkgc2luY2UgYWxsb2NzIGFyZSBhY3RpdmF0ZWQvZGVhY3RpdmF0ZWQgYXV0b21hdGljYWxseSBhbG9uZyB3aXRoIHRoZSBPTlUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUWCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRYIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSWCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJYIGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9JV0Y6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlIEZFQyBjb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiaXAzMl9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgcHJvdGVjdGVkIGJ5IGJpcDMyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmlwMzJfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBiaXAzMiBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z3RjX2hlYWRlcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIFhHVEMgaGVhZGVycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hndGNfY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgWEdUQyBoZWFkZXJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfeGd0Y191bmNvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdW5jb3JyZWN0ZWQgWEdUQyBoZWFkZXJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfeGdlbSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgWEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z2VtX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z2VtX2lkbGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGlkbGUgWEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z2VtX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NyY19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyB3aXRoIENSQyBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFnbWVudF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZnJhZ21lbnQgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3BhY2tldHNfZHJvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiR2xvYmFsIGRyb3BwZWQgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19zaG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIGxvbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfa2V5X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBrZXkgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3Bsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2Ftc19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBlcnJvciBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfY3B1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vbWNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3hnZW0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIFhHRU0gZnJhZ21lbnRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2NwdSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgQ1BVIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfb21jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgT01DSSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Ryb3BwZWRfdHBpZF9taXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIFRQSUQgbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BlZCBkdWUgdG8gVklEIG1pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RhdGUgQ2hhbmdlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0xPUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibG9zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMT1MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXJpYWwgTnVtYmVyIEFjcXVpc2l0aW9uIEN5Y2xlIFN0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBUcmFmZmljIFJlc3VtZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQWZ0ZXIgYSBzd2l0Y2hvdmVyIGlzIGNvbXBsZXRlIGFuZCBhbGwgT05VIHJhbmdpbmcgdGltZXMgaGF2ZSBzdGFiaWxpemVkLCB0aGlzIGluZGljYXRpb24gaXMgc2VudCB0byBpbmZvcm0gdGhlIGhvc3Qgb2YgYWxsIG5ldyBPTlUgRVFEcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfZGlzY292ZXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIERpc2NvdmVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgXCJjcHVfcGFja2V0c1wiIHByb3h5IG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSb2d1ZSBkZXRlY3Rpb24gY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZSB0aGUgZGVhY3RpdmF0aW9uIG9mIGFsbCBPTlVzIGFyZSBjb21wbGV0ZWQsIGluIHJlc3BvbnNlIHRvICdzZXRfb251X3N0YXRlJyBvcGVyYXRpb24uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZSB0aGUgZGlzYWJsaW5nIGFsbCBPTlVzIGFyZSBjb21wbGV0ZWQsIGluIHJlc3BvbnNlIHRvICdzZXRfb251X3N0YXRlJyBvcGVyYXRpb24uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRlIHRoZSBhY3RpdmF0aW9uIG9mIGFsbCBPTlVzIGFyZSBjb21wbGV0ZWQsIGluIHJlc3BvbnNlIHRvICdzZXRfb251X3N0YXRlJyBvcGVyYXRpb24uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGUgdGhlIGVuYWJsaW5nIGFsbCBPTlVzIGFyZSBjb21wbGV0ZWQsIGluIHJlc3BvbnNlIHRvICdzZXRfb251X3N0YXRlJyBvcGVyYXRpb24uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRPRCByZXF1ZXN0IGNvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFVwZ3JhZGUgQ29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUm9ndWUgT05VIHNwZWNpYWwgbWFwIGN5Y2xlIHN0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X3Bvbl9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IFBPTiBTdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXNldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVzZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRpc2FibGVfc2VyaWFsX251bWJlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRGlzYWJsZSBTZXJpYWwgTnVtYmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2luZ2xlIHJlcXVlc3Qgc3RhbmRieSBQT04gTW9uaXRvcmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNldF9vbnVfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldCB0aGUgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JVTl9TUEVDSUFMX0JXX01BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnVuX3NwZWNpYWxfYndfbWFwIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSdW4gU3BlY2lhbCBCVyBNYXAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fd2luZG93IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSb2d1ZSBEZXRlY3Rpb24gV2luZG93IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRvZF9yZXF1ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUT0QgcmVxdWVzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGFydF9vbnVfdXBncmFkZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT0xUIHRvIE9OVSBmaXJtd2FyZSB0cmFuc2ZlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5zdHJ1Y3QgYW4gdW5hc3NpZ25lZCBPTlUgdG8gYWRqdXN0IGl0cyB1cHN0cmVhbSB0cmFuc21pdHRlciB3YXZlbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJYR1BPTiBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJicm9hZGNhc3RfcGxvYW1fcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCcm9hZGNhc3QgUExPQU0gUGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwb3NpdGl2ZV9kcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAicG9zaXRpdmUgZHJpZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJuZWdhdGl2ZV9kcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAibmVnYXRpdmUgZHJpZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImRlbGltaXRlciBtaXNzIGRldGVjdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDMyX2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiYmlwMzIgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfd29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiA0LWJ5dGUgd29yZHMgcmVjZWl2ZWQgKHdvcmQgc2l6ZSBpcyA0IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgdXBzdHJlYW0gZGF0YSByYXRlKS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29ycmVjdGVkX3N5bWJvbHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgc3ltYm9scyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb3JyZWN0ZWRfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJmZWMgY29ycmVjdGVkIGNvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZmVjIHVuY29ycmVjdGFibGUgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZmVjIHRvdGFsIGNvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb3JyZWN0ZWRfYml0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBiaXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInhnZW1fa2V5X2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAieGdlbSBrZXkgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAieGdlbV9sb3NzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ4Z2VtIGxvc3MgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2Ftc19taWNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIm1pYyBlcnJvciBwbG9hbSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIm5vbiBpZGxlIHBsb2FtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJyeCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJyeCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ0eCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ0eCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9hbGFybSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIEFsYXJtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RPV0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRvd2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2ZpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaWduYWwgRmFpbCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2RpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaWduYWwgRGVncmFkZWQgb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ERkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRmaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUFFTSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHFzaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAicGxvYW0gcXVldWUgc3RhdHVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN1ZmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNVRmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidGl3aSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXNzaW9uIEludGVyZmVyZW5jZSBXYXJuaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0xPT0NJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsb29jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTE9PQ2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJhbmdpbmdfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSYW5naW5nIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIEFjdGl2YXRpb24gQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9lbmFibGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRW5hYmxlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIERpc2FibGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfSU5WQUxJRF9EQlJVX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaW52YWxpZF9kYnJ1X3JlcG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW52YWxpZCBEQlJ1IFJlcG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEtleSBSZXF1ZXN0IFRpbWVvdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgQ3ljbGUgU2tpcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IE1pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBbiBvcHRpY2FsIHJlZmxlY3Rpb24gY29uZGl0aW9uIHdhcyBkZXRlY3RlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZ2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTm90aWZpY2F0aW9uIHRoYXQgYW4gT05VcyBwb3dlciBtYW5hZ2VtZW50IHN0YXRlIGhhcyBjaGFuZ2VkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicG9zc2libGVfZHJpZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFuIE9OVSBpbiBhIGxvdyBwb3dlciBzdGF0ZSBtYXkgYmUgZXhwZXJpZW5jaW5nIGRyaWZ0IGJleW9uZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgZHJpZnQgbWF5IGJlIGxlc3MgdGhhbiBlc3RpbWF0ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JFR0lTVFJBVElPTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWdpc3RyYXRpb24gSUQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTEVWRUxfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwb3dlcl9sZXZlbF9yZXBvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlBvd2VyIGxldmVsIHJlcG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUG93ZXIgY29uc3VtcHRpb24gcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGYWlsdXJlIG9mIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZHVlIHRvIE1JQyBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFR1bmluZyBvdXQgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFR1bmluZyBpbiBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0dW5pbmdfcmVzcG9uc2UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlR1bmluZyByZXNwb25zZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNldF9vbnVfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldCBPTlUgU3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlcXVlc3QgdGhlIE9OVSB0byBzZW5kIGl0cyBSZWdpc3RyYXRpb24gSUQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2hhbmdlX3Bvd2VyX2xldmVsbGluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ2hhbmdlIHBvd2VyIGxldmVsbGluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9wb3dlcl9sZXZlbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIHNob3VsZCByZXBvcnQgaXRzIGxhdW5jaCBvcHRpY2FsIHBvd2VyIGxldmVsIGFzIHBhcnQgb2YgdGhlIEFja25vd2xlZGdtZW50IFBsb2FtIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0NPTlNVTVBUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJnZXRfcG93ZXJfY29uc3VtcHRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBzaG91bGQgcmVwb3J0IGl0cyBwb3dlciBjb25zdW1wdGlvbiBpbmZvcm1hdGlvbiB2aWEgdGhlIFBvd2VyIENvbnN1bXB0aW9uIFJlcG9ydCBQbG9hbSBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5zdHJ1Y3QgdGhlIE9OVSB0byBhZGp1c3QgaXRzIHVwc3RyZWFtIHRyYW5zbWl0dGVyIHdhdmVsZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT01DSSBiYXNlIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19JTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X3R1bmluZ19pbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFR1bmluZyBpbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X3R1bmluZ19vdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBUdW5pbmcgb3V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicGxvYW1fcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQTE9BTSBQYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiWEdQT04gQ1BVIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3B1X3BhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGVzIENQVSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9PTUNJX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib21jaV9wYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRlcyBPTUNJIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsgICAgLyoqPCAgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KK30KKworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICoqb2JqX2dldF9wcm9wX2FycmF5KGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgdWludDMyX3QgKnNpemUpCit7CisgICAgc3dpdGNoIChvYmopCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX25pX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX25pX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfbmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfT1BFUl9JRF9TRVRfQUVfTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF9kc19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfZHNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfZHNfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF9kc19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF9kc19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF9kc19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF9kc19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF9kc19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX3VzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF91c19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF91c19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX3VzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQ0hBTk5FTDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGNoYW5uZWxfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGNoYW5uZWxfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFQlVHOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGVidWdfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfQ0xJX09VVFBVVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19jbGlfb3V0cHV0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19jbGlfb3V0cHV0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19BVVRPX0lEX0ZJTEVfQUxNT1NUX0ZVTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGVidWdfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9DTElfSU5QVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGVidWdfY2xpX2lucHV0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19jbGlfaW5wdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RBUlRfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERVZJQ0U6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2Vfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2Vfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9SRUFEWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfZGV2aWNlX3JlYWR5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfZGV2aWNlX3JlYWR5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfRElTQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9zd19lcnJvcl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX3N3X2Vycm9yX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9TV19FWENFUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX3N3X2V4Y2VwdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX3N3X2V4Y2VwdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU5ESUNBVElPTlNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERFJfVEVTVF9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9DT05ORUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9jb25uZWN0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfY29ubmVjdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfZGlzY29ubmVjdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2Rpc2Nvbm5lY3RfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9yZXNldF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX3Jlc2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfU1dfVVBHUkFERV9BQ1RJVkFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9ydW5fZGRyX3Rlc3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9ydW5fZGRyX3Rlc3RfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VOS05PV05fTElOS19WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX01BWF9MSU5LX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JBTkdFX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUk9HVUVfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0VOQ1JZUFRJT05fRU5BQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX1JFR19BQ0tfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUkFOR0VfVkFMVUVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19TUEVFRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfREVSRUdJU1RFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19ERUxFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19saW5rX2RlbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19saW5rX2RlbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9GT1JDRV9SRURJU0NPVkVSWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfREVMRVRFX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2RlbGV0ZV9saW5rX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfZGVsZXRlX2xpbmtfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19pbmplY3RfZnJhbWVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19pbmplY3RfZnJhbWVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19mcmFtZV9jYXB0dXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9OT19SRVBPUlRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfbm9fcmVwb3J0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9ub19yZXBvcnRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2xsaWRfcXVhcmFudGluZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfcmVyYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9SU1NJX0dSQU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9hZGRfbGlua19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9hZGRfbGlua19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1JPR1VFX0xMSURfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzEwZ191c19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzEwZ191c19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzEwZ191c19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xMGdfdXNfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzFnX3VzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMWdfdXNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMWdfdXNfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMWdfdXNfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMWdfdXNfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzFnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfZHNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfZHNfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfZHNfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfdXNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfdXNfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfdXNfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ191c19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ19kc19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfZHNfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfZHNfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ19kc19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX3VzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX3VzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX3VzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ191c19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1JQOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9ycF9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcnBfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9ycF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcnBfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BJTzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwaW9fa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncGlvX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwaW9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncGlvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0M6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2Nfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc2V0X3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2NfZ2V0X3N0YXRzX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2dldF9zdGF0c19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9nZW1fcG9ydF9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2Zfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2Zfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2ZsdXNoX21hY190YWJsZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX1NDQU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX3NjYW5fbWFjX3RhYmxlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9zY2FuX21hY190YWJsZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX21hY190YWJsZV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9ORVdfTUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX0FHRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19NT1ZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3VzX2Zsb3dfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3VzX2Zsb3dfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfbG9zX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2xvc19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfVVBHUkFERV9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9QT05fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3Jlc2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3Jlc2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfdG9kX3JlcXVlc3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfdG9kX3JlcXVlc3RfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfY3B1X3BhY2tldHNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfY3B1X3BhY2tldHNfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fT05VOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfYWxhcm1fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9kb3dpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9kb3dpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zZmlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3NmaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TREk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9zZGlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2RmaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfZGZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfc3VmaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfc3VmaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0FJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2xvYWlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2xvYWlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2RnaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BFRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wZWVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3BlZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcHN0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9wc3RfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV90aXdpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV90aXdpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPS0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfbG9raV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfbG9raV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9NRU1JOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X21lbWlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X21lbWlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9FUlI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfZXJyX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9lcnJfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkVJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3JlaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfcmVpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JBTkdJTkdfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9TU0lCTEVfRFJJRlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2NwdV9wYWNrZXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9jcHVfcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9jcHVfcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9PTUNJX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9vbWNpX3BhY2tldF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfb21jaV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fdHJ4X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl90cnhfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl90cnhfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX3RyeF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nX2VudHJ5X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nX2VudHJ5X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nX2VudHJ5X3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nX2VudHJ5X3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19lbnRyeV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0xPR0dFUjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dnZXJfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXJfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXJfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXJfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX09QRVJfSURfQ0xFQVJfTE9HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9jbGVhcl9sb2dfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9jbGVhcl9sb2dfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yobm5pX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yobm5pX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUVVNfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc3RhdHVzX2NoYW5nZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9zdGF0dXNfY2hhbmdlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yobm5pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc2VyZGVzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX3NlcmRlc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc2VyZGVzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX3NlcmRlc19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHNvZnR3YXJlX2Vycm9yX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29mdHdhcmVfZXJyb3Jfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yoc29mdHdhcmVfZXJyb3JfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2Z0d2FyZV9lcnJvcl9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT046CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0cnhfY2FsaWJyYXRpb25fa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnhfY2FsaWJyYXRpb25fa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YodHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHRyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YodHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUT1BfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YodHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0M6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2NfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19nZXRfc3RhdHNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX2dldF9zdGF0c19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2Nfc2V0X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2dlbV9wb3J0X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fZ2VtX3BvcnRfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fZ2VtX3BvcnRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fZ2VtX3BvcnRfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fZ2VtX3BvcnRfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9JV0Y6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9pd2Zfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9pd2Zfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25faXdmX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25faXdmX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2xvc19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfbG9zX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX29udV9kaXNjb3ZlcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfVVBHUkFERV9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3Jlc2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9yZXNldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3RvZF9yZXF1ZXN0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2NwdV9wYWNrZXRzX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fT05VOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV9hbGFybV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9hbGFybV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfZG93aV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2Rvd2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc2ZpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc2ZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TREk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3NkaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3NkaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9kZmlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9kZmlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BRU0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Bxc2lfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9wcXNpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVUZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9zdWZpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc3VmaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfdGl3aV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Rpd2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0xPT0NJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9sb29jaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2xvb2NpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2RnaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2RnaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9wb3NzaWJsZV9kcmlmdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SRUdJU1RSQVRJT05fSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTEVWRUxfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9UVU5JTkdfUkVTUE9OU0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3R1bmluZ19yZXNwb25zZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUkVRVUVTVF9SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTExJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0NPTlNVTVBUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19JTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV90dW5pbmdfaW5fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfdHVuaW5nX291dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV90dW5pbmdfb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9jcHVfcGFja2V0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2NwdV9wYWNrZXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlg6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9jcHVfcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfY3B1X3BhY2tldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbWNpX3BhY2tldF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fVFJYOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fdHJ4X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fdHJ4X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX3RyeF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX3RyeF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhwb25fc2VyZGVzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geHBvbl9zZXJkZXNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeHBvbl9zZXJkZXNfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4cG9uX3NlcmRlc19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3RfbmFtZShiY21vbHRfb2JqX2lkIG9iaiwgY29uc3QgY2hhciAqKm5hbWUsIGNvbnN0IGNoYXIgKipkZXNjcikKK3sKKyAgICBpZiAob2JqID49IEJDTU9MVF9PQkpfSURfX05VTV9PRikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGlmIChvYmplY3RfbmFtZVtvYmpdID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICB9CisKKyAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKm5hbWUgPSBvYmplY3RfbmFtZVtvYmpdOworICAgIH0KKworICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKmRlc2NyID0gb2JqZWN0X2Rlc2NyW29ial07CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgdWludDE2X3QgcHJvcCwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKipkZXNjcikKK3sKKyAgICBiY21jbGlfcHJvcF9kZXNjciAqKnByb3BfYXJyYXkgPSBOVUxMOworICAgIHVpbnQzMl90IHByb3BfYXJyYXlfc2l6ZSA9IDA7CisgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHByb3BfYXJyYXkgPSBvYmpfZ2V0X3Byb3BfYXJyYXkob2JqLCBncm91cCwgc3ViZ3JvdXAsICZwcm9wX2FycmF5X3NpemUpOworICAgIGlmICgocHJvcF9hcnJheSA9PSBOVUxMKSB8fCAocHJvcCA+PSBwcm9wX2FycmF5X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgaWYgKHByb3BfYXJyYXlbcHJvcF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgICpkZXNjciA9IHByb3BfYXJyYXlbcHJvcF07CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oZWxwZXJzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlNzIzNwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuaApAQCAtMCwwICsxLDc2OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKyNpZm5kZWYgTUFQTEVfQ0xJX0hFTFBFUlNfSF8KKyNkZWZpbmUgTUFQTEVfQ0xJX0hFTFBFUlNfSF8KKworI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpX3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKy8qIE1hYyBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEggQkNNQ0xJX01BWF9TRUFSQ0hfU1VCU1RSX0xFTkdUSAorCisvKiBNYXggaGVscCBzdHJpbmcgbGVuZ3RoICovCisjZGVmaW5lIEFQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSCAxMjgKKwordHlwZWRlZiBlbnVtIGJjbWNsaV9maWVsZF9kZXNjcl9mbGFncworeworICAgIEJDTUNMSV9GSUVMRF9ERVNDUl9GTEFHU19OT05FICAgICAgICAgICA9IDAsCisgICAgQkNNQ0xJX0ZJRUxEX0RFU0NSX0ZMQUdTX1BSRVNFTkNFX01BU0sgID0gKDEgPDwgMCkgIC8qIGZpZWxkIGlzIGEgJ3ByZXNlbmNlIG1hc2snIGZvciBhIHN0cnVjdHVyZSAqLworfSBiY21jbGlfZmllbGRfZGVzY3JfZmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IGJjbWNsaV90eXBlX2Rlc2NyIGJjbWNsaV90eXBlX2Rlc2NyOworCisvKiBTdHJ1Y3R1cmUgZmllbGQgZGVzY3JpcHRvciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX2ZpZWxkX2Rlc2NyCit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgIC8qIEZpZWxkIG5hbWUgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcjsgICAgICAgICAgLyogRmllbGQgZGVzY3JpcHRpb24gKi8KKyAgICBjb25zdCBjaGFyICpjbGlfbmFtZTsgICAgICAgLyogU2hvcnQgQ0xJIG5hbWUuIGNhbiBiZSBtaXNzaW5nICovCisgICAgYmNtY2xpX3R5cGVfZGVzY3IgKnR5cGU7ICAgIC8qIEZpZWxkIHR5cGUgKi8KKyAgICB1aW50MTZfdCBvZmZzZXQ7ICAgICAgICAgICAgLyogT2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHlwZSBzdHJ1Y3R1cmUgKi8KKyAgICBiY21jbGlfZmllbGRfZGVzY3JfZmxhZ3MgZmxhZ3M7Cit9IGJjbWNsaV9maWVsZF9kZXNjcjsKKworLyogRGF0YSB0eXBlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBiY21jbGlfdHlwZV9kZXNjcgoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBuYW1lICovCisgICAgY29uc3QgY2hhciAqZGVzY3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlc2NyaXB0aW9uLiBjYW4gYmUgbWlzc2luZyAqLworICAgIGNvbnN0IGNoYXIgKmNsaV9uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQ0xJIG5hbWUuIGNhbiBiZSBtaXNzaW5nICovCisgICAgYmNtb2x0X2Jhc2VfdHlwZV9pZCBiYXNlX3R5cGU7ICAgICAgICAgICAgICAvKiBCYXNlIHR5cGU6IHNudW0sIHVudW0sIHN0cmluZywgaXAsIGVudW0sIGV0Yy4gKi8KKyAgICB1aW50MzJfdCBtaW5fdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1pbiB2YWx1ZSBmb3IgcmFuZ2UgY2hlY2sgKi8KKyAgICB1aW50MzJfdCBtYXhfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heCB2YWx1ZSBmb3IgcmFuZ2UgY2hlY2sgKi8KKyAgICB1aW50MTZfdCBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgdW5pb24gaXMgcXVhbGlmaWVkIGJ5IHRoZSBiYXNlX3R5cGUgYW5kIGNvbnRhaW5zIGFkZGl0aW9uYWwKKyAgICAgKiBpbmZvIGZvciBhcnJheSwgZW51bSwgc3RydWN0LCB1bmlvbiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBiY21jbGlfZW51bV92YWwgKmU7ICAgICAgICAgICAgICAgICAgICAgLyogZW51bSB2YWx1ZSBhcnJheSBDb250YWlucyBudW1fZWxlbWVudHMrMSB2YWx1ZXMuIFRoZSBsYXN0IHZhbHVlIGhhcyBuYW1lPU5VTEwgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bV9maWVsZHM7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmaWVsZHM7ICAgICAgICAgLyogU3RydWN0dXJlIGZpZWxkIGFycmF5LiBDb250YWlucyBudW1fZWxlbWVudHMgdmFsdWVzICovCisgICAgICAgIH0gczsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bV9jb21tb25fZmllbGRzOyAgICAgICAgIC8qIG51bWJlciBvZiBub24tdW5pb24gZmllbGRzIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RydWN0ICovCisgICAgICAgICAgICBiY21jbGlfZmllbGRfZGVzY3IgKmNvbW1vbl9maWVsZHM7ICAvKiBjb21tb24gZmllbGQgYXJyYXkuIENvbnRhaW5zIG51bV9lbGVtZW50cyB2YWx1ZXMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNsYXNzaWZpZXJfaWR4OyAgICAgICAgICAgIC8qIGluZGV4IG9mIHRoZSBjbGFzc2lmaWVyIGZpZWxkIHdpdGhpbiBjb21tb25fZmllbGRzICovCisgICAgICAgICAgICBiY21jbGlfZmllbGRfZGVzY3IgKnVuaW9uX2ZpZWxkczsgICAvKiBzdWItc3RydWN0IGZpZWxkcyB1bmRlciB0aGUgdW5pb24gKG5hbWUgPT0gTlVMTCBpZiBubyBmaWVsZHMgcHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmUgcGVyIGVudW0gZW50cnkgaW4gdGhlIGNsYXNzaWZpZXIgdHlwZSwgcGx1cyBvbmUgZm9yIGRlZmF1bHQpICovCisgICAgICAgIH0gdTsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV90eXBlX2Rlc2NyICplbGVtX3R5cGU7ICAgICAgIC8qIEFycmF5IGVsZW1lbnQgdHlwZSAqLworICAgICAgICAgICAgdWludDhfdCBsZW5fc2l6ZTsgICAgICAgICAgICAgICAgICAgLyogQnl0ZSB3aWR0aCBvZiBhcnJheSBsZW5ndGggZmllbGQgKGF0IHN0YXJ0IG9mIHN0cnVjdCkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1heF9zaXplOyAgICAgICAgICAgICAgICAgIC8qIE1heCBhcnJheSBzaXplICovCisgICAgICAgIH0gYXJyX2R5bjsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV90eXBlX2Rlc2NyICplbGVtX3R5cGU7ICAgICAgIC8qIEFycmF5IGVsZW1lbnQgdHlwZSAqLworICAgICAgICAgICAgdWludDE2X3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgYXJyYXkgc2l6ZSAqLworICAgICAgICB9IGFycl9maXhlZDsKKyAgICB9IHg7Cit9OworCisvKiBQcm9wZXJ0eSBkZXNjcmlwdG9yLgorICogVGhlIDFzdCA1IGZpZWxkcyBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBpbiBiY21jbGlfZmllbGRfZGVzY3IKKyAqIFRvRG86IHJlcGxhY2Ugd2l0aCBiY21jbGlfZmllbGRfZGVzY3Igc3Vic3RydWN0dXJlLgorICogUmVxdWlyZXMgY2hhbmdlcyBpbiBjb2RlIGdlbmVyYXRvcgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgLyogQyBuYW1lICovCisgICAgY29uc3QgY2hhciAqZGVzY3I7ICAgICAgICAgICAgICAvKiBQcm9wZXJ0eSBkZXNjcmlwdGlvbiAqLworICAgIGNvbnN0IGNoYXIgKmNsaV9uYW1lOyAgICAgICAgICAgLyogQ0xJIG5hbWUgKi8KKyAgICBiY21jbGlfdHlwZV9kZXNjciAqdHlwZTsgICAgICAgIC8qIFR5cGUgcmVmZXJlbmNlICovCisgICAgdWludDE2X3Qgb2Zmc2V0OyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgaW4gZ2VuZXJhdGVkIHBlci1ncm91cCBzdHJ1Y3R1cmUgKi8KKyAgICB1aW50MTZfdCBwcm9wZXJ0eTsgICAgICAgICAgICAgIC8qIFByb3BlcnR5IGlkIGluIHBlci1vYmplY3QgbWFuYWdlbWVudCBncm91cCAqLworICAgIGJjbW9sdF9wcm9wX2FjY2Vzc19pZCBhY2Nlc3M7ICAgLyogQWNjZXNzICovCit9IGJjbWNsaV9wcm9wX2Rlc2NyOworCisvKiBBbGwgQVBJcyByZXR1cm4KKyAqIEJDTV9FUlJfT0sgLSBvaworICogQkNNX0VSUl9OT0VOVCAtIGlmIGlkIGlzIGluIHJhbmdlLCBidXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFueSB2YWx1ZSAoYSBob2xlKQorICogQkNNX0VSUl9SQU5HRSAtIGlkIGlzIG91dCBvZiByYW5nZQorICovCisKKy8qIEdldCBvYmplY3QgbmFtZSBieSBpZCAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3RfbmFtZShiY21vbHRfb2JqX2lkIG9iaiwgY29uc3QgY2hhciAqKm5hbWUsIGNvbnN0IGNoYXIgKipkZXNjcik7CisKKy8qIEdldCBvYmplY3Qgc3RydWN0dXJlIHNpemUgKi8KK2JjbW9zX2Vycm5vIGFwaV9jbGlfb2JqZWN0X3N0cnVjdF9zaXplKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgdWludDMyX3QgKmtleV9zaXplLCB1aW50MzJfdCAqa2V5X29mZnNldCwgdWludDMyX3QgKmRhdGFfc2l6ZSwgdWludDMyX3QgKmRhdGFfb2Zmc2V0KTsKKworLyogR2V0IG9iamVjdCBzdWJncm91cCAoc3BlY2lmaWMgb3BlcmF0aW9uIG9yIHByb3h5KSBuYW1lIGFuZCBkZXNjcmlwdGlvbiAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDE2X3Qgc3ViZ3JvdXAsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyICoqZGVzY3IpOworCisvKiBHZXQgcHJvcGVydHkgYnkgb2JqZWN0LCBtZ3RfZ3JvdXAsIHN1Ymdyb3VwIChzcGVjaWZpYyBvcGVyYXRpb24gb3IgcHJveHkpLCBwcm9wZXJ0eV9pZCAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MTZfdCBwcm9wLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqKmRlc2NyKTsKKworLyogR2V0IHRoZSBudW1iZXIgb2Ygc3ViZ3JvdXBzIHByZXNlbnQgZm9yIGEgZ2l2ZW4gZ3JvdXAgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYXBpX2NsaV9nZXRfc3ViZ3JvdXBfY291bnQoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXApCit7CisgICAgdWludDE2X3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15OworICAgIHdoaWxlIChhcGlfY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZShvYmosIGdyb3VwLCBjb3VudCwgJmR1bW15LCAmZHVtbXksICZkdW1teSwgJmR1bW15KSAhPSBCQ01fRVJSX1JBTkdFKQorICAgIHsKKyAgICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qIER1bXAgYSBzaW5nbGUgcHJvcGVydHkgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX3Byb3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhKTsKKworLyogRHVtcCBhIHNpbmdsZSBwcm9wZXJ0eSB2YWx1ZSBpbiBDIGluaXRpYWxpemVyIGZvcm1hdCAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfcHJvcF9pbml0aWFsaXplcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEpOworCisvKiBEdW1wIGEgZHluYW1pYyBhcnJheSBpbiBDIGluaXRpYWxpemVyIGZvcm1hdCAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfZHluX2FycmF5KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBEdW1wIHByb3BlcnR5IGFzIENMSSBwYXJhbWV0ZXJzICovCitiY21vc19lcnJubyBhcGljbGlfZHVtcF9wcm9wX3BhcmFtKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIHZvaWQgKnByb3BfZGF0YSwgY29uc3QgY2hhciAqcHJlZml4KTsKKworLyogRHVtcCBtZXNzYWdlICovCitiY21vc19lcnJubyBhcGljbGlfbXNnX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9tc2cgKm1zZyk7CisKKy8qIE1lc3NhZ2UgZ3JvdXAgbmFtZSAqLworY29uc3QgY2hhciAqYXBpY2xpX21ndF9ncm91cF90b19zdHIoYmNtb2x0X21ndF9ncm91cCBncm91cCk7CisKKy8qIENvbnZlcnQgYW4gZW51bSB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcgKi8KKyNkZWZpbmUgQkNNT0xUX0VOVU1fU1RSSU5HX1ZBTChlbnVtX25hbWUsIHZhbHVlKSAgICBiY21jbGlfZW51bV9zdHJpbmd2YWwoZW51bV9uYW1lICMjIF9zdHJpbmdfdGFibGUsICh2YWx1ZSkpCisKKy8qIEVudW0gc3RyaW5nIHRhYmxlcyAqLworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWxsb2Nfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY190eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NpZ25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGlua190eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2hhbm5lbF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jaGFubmVsX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jb250cm9sX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGJhX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfcmFtX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGJhX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3BlZWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rydl9pY2ZfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kcnZfc2diX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZHNfdmxhbl9hY3Rpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90ZmJfdHJhcF9iZWhhdmlvcl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RmYl9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3NlY19tb2RlX3VwX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3NlY19tb2RlX2RuX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGltX3NlY19tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfaHNjX3JhbV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xpbV9yYW1fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sa3lfcmFtX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWljX3JhbV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hwY3NybV9yYW1fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2Vfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vYW1fdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua190eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9uc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX3Bpbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fcG9sYXJpdHlfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcnBfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXh0X2lycV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF90eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fcGluX2Rpcl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fdmFsdWVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9sb3NfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2RmaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2RnaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9lcnJfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2xvYWlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9sb2tpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3BzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbWNpX2RldmljZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb251X3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9pd2ZfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2ZpbGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfbGV2ZWxfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfc3R5bGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2Rfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX2Nvbm5lY3Rpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJpdmFsZW50X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29kbl9jbGFzc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfb3BlcmF0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb251X3Bvd2VyX2xldmVsX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdGNfcHJvdG9jb2xfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcGFja2V0X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3BvbGFyaXR5X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9sbGluZ19pbnRlcnZhbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvbl9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9uc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvbl9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19sb2NrX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVzdWx0X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2VyZGVzX2luc3RhbmNlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2hhcGVyX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3N5c3RlbV9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91YXJ0X2JhdWRyYXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c192bGFuX2FjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25faXdmX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcmVzZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2RmaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9kZ2lfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZGlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZmlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3RyeF90eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIE1BUExFX0NMSV9IRUxQRVJTX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV90eXBlcy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWVkNDBlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfdHlwZXMuaApAQCAtMCwwICsxLDYzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTV9BUElfREFUQV9UWVBFU19IXworI2RlZmluZSBCQ01fQVBJX0RBVEFfVFlQRVNfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisvKiBQcm9wZXJ0eSBhY2Nlc3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SID0gMHgxLCAgIC8qIFJlYWQgYWNjZXNzICovCisgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1cgPSAweDIsICAgLyogV3JpdGUgYWNjZXNzICovCisgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXID0gMHgzLCAgLyogUmVhZC13cml0ZSAqLworfSBiY21vbHRfcHJvcF9hY2Nlc3NfaWQ7CisKKy8qIEJhc2UgZGF0YSB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9TTlVNLCAgICAgICAvKiBzaWduZWQgbnVtYmVyICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNLCAgICAgICAvKiB1bnNpZ25lZCBudW1iZXIgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYLCAgIC8qIHVuc2lnbmVkIG51bWJlciBwcmludGVkIGluIGhleCAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQsICAgICAgLyogZmxvYXRpbmctcG9pbnQgbnVtYmVyICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9CT09MLCAgICAgICAvKiBib29sZWFuICh6ZXJvPW5vLCBub256ZXJvPXllcykgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORywgICAgIC8qIHN0cmluZyAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfSVBWNCwgICAgICAgLyogSVB2NCBhZGRyZXNzICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9NQUMsICAgICAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgICAgICAgLyogZW51bSAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLLCAgLyogYml0bWFzayBlbnVtICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsICAgICAvKiBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAgICAgIC8qIHVuaW9uICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAgICAvKiBkeW5hbWljYWxseS1zaXplZCBhcnJheSAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAgLyogZml4ZWQtc2l6ZSBhcnJheSAqLworfSBiY21vbHRfYmFzZV90eXBlX2lkOworCisjZW5kaWYgLyogQkNNX0FQSV9EQVRBX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2Rldl9sb2cvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2Rldl9sb2cvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MmU5YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACisjIAorIyBBUEkvbG9nZ2VyIGludGVncmF0aW9uCisjCitNT0RfTkFNRSA9IGFwaV9kZXZfbG9nCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nIAorCitpZmVxICgiJChFTkFCTEVfTE9HKSIsICJ5IikKKyAgICBpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKwlpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKwkgICAgTU9EX0RFUFMgKz0gYXBpX2NsaQorCWVsc2UKKwkgICAgTU9EX0RFUFMgKz0gYXBpX2NsaV9oZWxwZXJzCisJZW5kaWYKKworCWlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCSAgIE1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKwllbmRpZgorCisJc3JjcyA9IGJjbV9hcGlfZGV2X2xvZy5jCisgICAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2Rldl9sb2cvYmNtX2FwaV9kZXZfbG9nLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2Rldl9sb2cvYmNtX2FwaV9kZXZfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiODYzOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9iY21fYXBpX2Rldl9sb2cuYwpAQCAtMCwwICsxLDc3OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpX2hlbHBlcnMuaD4KKyNpbmNsdWRlICJiY21fYXBpX2Rldl9sb2cuaCIKKworLyogbWF4aW11bSBudW1iZXIgb2YgdGFza3MgdGhhdCBjYW4gdXNlIHRoZSBBUEkvbG9nZ2VyIGludGVncmF0aW9uIHNpbXVsdGFuZW91c2x5ICovCisjZGVmaW5lIEFQSV9MT0dfTlVNX0JMS1MgMTYKKworLyogc3RyaW5nIHRoYXQgZGVub3RlcyB0aGF0IHRoaXMgZW50cnkgaXMgbm90IGNvbXBsZXRlIC0gdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGNvbWUgKi8KKyNkZWZpbmUgQVBJX0xPR19DT05UX1NUUiAiLi4uIgorCisvKiBudW1iZXIgb2YgY2hhcmFjdGVycyByZXNlcnZlZCBhdCB0aGUgZW5kIG9mIGVhY2ggbG9nIGVudHJ5IChjb250aW51YXRpb24gc3RyaW5nICsgbmV3bGluZSkgKi8KKyNkZWZpbmUgQVBJX0xPR19FTlRSWV9PVkVSSEVBRCBzaXplb2YoQVBJX0xPR19DT05UX1NUUikKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKKyAgICBjb25zdCBiY21vbHRfbXNnICptc2c7CisgICAgY2hhciAqYnVmOworICAgIHVpbnQzMl90IHVzZWQ7Cit9IGFwaV9sb2dfcmVjOworCitzdGF0aWMgYmNtb3NfYmxrX3Bvb2wgYXBpX2xvZ19ibGtfcG9vbDsKKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUoCisgICAgYXBpX2xvZ19yZWMgKnJlYywKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIHVpbnQzMl90IG51bV9lbnRyaWVzLAorICAgIHVpbnQzMl90IGVudHJ5X3NpemUpOworCitzdGF0aWMgYmNtb3NfYm9vbCBhcGlfbG9nX2lzX3NpbmdsZXRvbihiY21vbHRfbWd0X2dyb3VwIGdyb3VwKQoreworICAgIHN3aXRjaCAoZ3JvdXApCisgICAgeworICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBhcGlfbG9nX2J1Zl9yZW1haW5pbmcoY29uc3QgYXBpX2xvZ19yZWMgKnJlYykKK3sKKyAgICByZXR1cm4gKE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAtIEFQSV9MT0dfRU5UUllfT1ZFUkhFQUQpIC0gcmVjLT51c2VkOworfQorCitzdGF0aWMgdm9pZCBhcGlfbG9nX2ZsdXNoKGFwaV9sb2dfcmVjICpyZWMsIGNvbnN0IGNoYXIgKmVuZF9vZl9saW5lKQoreworICAgIGlmIChyZWMtPnVzZWQgIT0gMCkKKyAgICB7CisgICAgICAgIHN0cm5jYXQocmVjLT5idWYsIGVuZF9vZl9saW5lLCBNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUgLSByZWMtPnVzZWQpOworICAgICAgICBiY21fZGV2X2xvZ19sb2cocmVjLT5sb2dfaWQsIERFVl9MT0dfTEVWRUxfSU5GTywgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsICIlcyIsIHJlYy0+YnVmKTsKKyAgICAgICAgcmVjLT51c2VkID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFwaV9sb2dfcHJpbnQoYXBpX2xvZ19yZWMgKnJlYywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCByZXQ7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIHJldCA9IHZzbnByaW50ZihyZWMtPmJ1ZiArIHJlYy0+dXNlZCwgYXBpX2xvZ19idWZfcmVtYWluaW5nKHJlYyksIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgaWYgKHJldCA8IDAgfHwgcmV0ID4gYXBpX2xvZ19idWZfcmVtYWluaW5nKHJlYykpCisgICAgeworICAgICAgICAvKiB0aGlzIHByaW50IGRvZXNuJ3QgZml0IGluIHRoZSBidWZmZXIgLSBzZW5kIHRoZSBjdXJyZW50IGJ1ZmZlciBhbmQgY3JlYXRlIGEgbmV3IGNvbnRpbnVhdGlvbiBsb2cgZW50cnkgKi8KKyAgICAgICAgcmVjLT5idWZbcmVjLT51c2VkXSA9ICdcMCc7CisgICAgICAgIGFwaV9sb2dfZmx1c2gocmVjLCBBUElfTE9HX0NPTlRfU1RSICJcbiIpOworCisgICAgICAgIC8qIHRoZSBjb250aW51YXRpb24gZW50cnkgY2FuIHNraXAgdGhlIGhlYWRlciAqLworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgQVBJX0xPR19DT05UX1NUUik7CisKKyAgICAgICAgLyogdHJ5IGFnYWluLCB0aGlzIHRpbWUgYWdhaW5zdCB0aGUgY29udGludWF0aW9uIGVudHJ5ICovCisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgICAgIHJldCA9IHZzbnByaW50ZihyZWMtPmJ1ZiArIHJlYy0+dXNlZCwgYXBpX2xvZ19idWZfcmVtYWluaW5nKHJlYyksIGZvcm1hdCwgYXJncyk7CisgICAgICAgIHZhX2VuZChhcmdzKTsKKworICAgICAgICBpZiAocmV0IDwgMCB8fCByZXQgPiBhcGlfbG9nX2J1Zl9yZW1haW5pbmcocmVjKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVjLT5sb2dfaWQsICJBUEkgbWVzc2FnZSBsb2cgb3ZlcmZsb3cgb24gbXNnICMldVxuIiwgcmVjLT5tc2ctPmNvcnJfdGFnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYy0+dXNlZCArPSByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVjLT51c2VkICs9IHJldDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX3JlYWRfc251bShjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIGNvbnN0IHZvaWQgKmRhdGEsIGludDY0X3QgKm4pCit7CisgICAgc3dpdGNoICh0ZC0+c2l6ZSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgIHsKKyAgICAgICAgaW50OF90IG4xID0gKihjb25zdCBpbnQ4X3QgKilkYXRhOworICAgICAgICAqbiA9IG4xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOgorICAgIHsKKyAgICAgICAgaW50MTZfdCBuMiA9ICooY29uc3QgaW50MTZfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDQ6CisgICAgeworICAgICAgICBpbnQzMl90IG40ID0gKihjb25zdCBpbnQzMl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuNDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgODoKKyAgICB7CisgICAgICAgIG1lbWNweShuLCBkYXRhLCBzaXplb2YoKm4pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpX2xvZ19yZWFkX3VudW0oY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCBjb25zdCB2b2lkICpkYXRhLCB1aW50NjRfdCAqbikKK3sKKyAgICBzd2l0Y2ggKHRkLT5zaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgeworICAgICAgICB1aW50OF90IG4xID0gKihjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjoKKyAgICB7CisgICAgICAgIHVpbnQxNl90IG4yID0gKihjb25zdCB1aW50MTZfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDQ6CisgICAgeworICAgICAgICB1aW50MzJfdCBuNCA9ICooY29uc3QgdWludDMyX3QgKilkYXRhOworICAgICAgICAqbiA9IG40OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OgorICAgIHsKKyAgICAgICAgbWVtY3B5KG4sIGRhdGEsIHNpemVvZigqbikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIGJyZWFrIGEgc3RyaW5nIHVwIGludG8gc21hbGxlciBjaHVua3MgKHByZWZlcmFibHkgYXQgXG4gYm91bmRhcmllcykgc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIHNpemUgb2YgYSBsb2cgZW50cnkgKi8KK3N0YXRpYyB2b2lkIGFwaV9sb2dfcHJpbnRfbG9uZ19saW5lKGFwaV9sb2dfcmVjICpyZWMsIGNvbnN0IGNoYXIgKmxpbmUsIHVpbnQzMl90IGxlbikKK3sKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQzMl90IGhhbmRsZWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChsaW5lW2ldID09ICdcbicpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID4gaGFuZGxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiUuKnMiLCBpIC0gaGFuZGxlZCwgJmxpbmVbaGFuZGxlZF0pOworICAgICAgICAgICAgICAgIGFwaV9sb2dfZmx1c2gocmVjLCBBUElfTE9HX0NPTlRfU1RSICJcbiIpOworICAgICAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCBBUElfTE9HX0NPTlRfU1RSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQgPSBpICsgMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+IGhhbmRsZWQgJiYgaSAtIGhhbmRsZWQgPT0gMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJS4qcyIsIDMyLCAmbGluZVtoYW5kbGVkXSk7CisgICAgICAgICAgICBoYW5kbGVkID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFuZGxlZCA8IGxlbikKKyAgICB7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJS4qcyIsIGxlbiAtIGhhbmRsZWQsICZsaW5lW2hhbmRsZWRdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX2R1bXBfc2ltcGxlX2RhdGFfdHlwZSgKKyAgICBhcGlfbG9nX3JlYyAqcmVjLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU06ICAgICAgIC8qIHNpZ25lZCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIGludDY0X3QgbiA9IDA7CisgICAgICAgIGVyciA9IGFwaV9sb2dfcmVhZF9zbnVtKHRkLCBkYXRhLCAmbik7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJWxsZCIsIChsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNOiAgICAgICAvKiB1bnNpZ25lZCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfdW51bSh0ZCwgZGF0YSwgJm4pOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKW4pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVg6ICAgLyogdW5zaWduZWQgbnVtYmVyIHByaW50ZWQgaW4gaGV4ICovCisgICAgeworICAgICAgICB1aW50NjRfdCBuID0gMDsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19yZWFkX3VudW0odGQsIGRhdGEsICZuKTsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKW4pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQ6ICAgICAgLyogZmxvYXRpbmctcG9pbnQgbnVtYmVyICovCisgICAgeworICAgICAgICBpZiAodGQtPnNpemUgPT0gc2l6ZW9mKGZsb2F0KSkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlZiIsICooY29uc3QgZmxvYXQgKilkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZC0+c2l6ZSA9PSBzaXplb2YoZG91YmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlZiIsICooY29uc3QgZG91YmxlICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0JPT0w6CisgICAgeworICAgICAgICB1aW50NjRfdCBuID0gMDsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19yZWFkX3VudW0odGQsIGRhdGEsICZuKTsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlcyIsIG4gPT0gMCA/ICJubyIgOiAieWVzIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJJTkc6ICAgICAvKiBzdHJpbmcgKi8KKyAgICB7CisgICAgICAgIHVpbnQzMl90IHNpemUgPSB0ZC0+c2l6ZTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGFwaV9sb2dfcHJpbnRfbG9uZ19saW5lKHJlYywgKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0lQVjQ6ICAgICAgIC8qIElQdjQgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgdWludDMyX3QgaXA7CisgICAgICAgIG1lbWNweSgmaXAsIGRhdGEsIHNpemVvZihpcCkpOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVkLiVkLiVkLiVkIiwgKGlwPj4yNCkmMHhmZiwgKGlwPj4xNikmMHhmZiwgKGlwPj44KSYweGZmLCBpcCAmIDB4ZmYpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfTUFDOiAgICAgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsKKyAgICAgICAgbWVtY3B5KG1hYy51OCwgZGF0YSwgc2l6ZW9mKG1hYy51OCkpOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgIG1hYy51OFswXSwgbWFjLnU4WzFdLCBtYWMudThbMl0sIG1hYy51OFszXSwgbWFjLnU4WzRdLCBtYWMudThbNV0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTTogICAgICAgLyogZW51bSAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGVyciA9IGFwaV9sb2dfcmVhZF91bnVtKHRkLCBkYXRhLCAmbik7CisgICAgICAgIEJVR19PTih0ZC0+eC5lID09IE5VTEwpOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVzIiwgYmNtY2xpX2VudW1fc3RyaW5ndmFsKHRkLT54LmUsIG4pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSzoKKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlID0gdGQtPnguZTsKKyAgICAgICAgYmNtb3NfYm9vbCBmaXJzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgIEJVR19PTih2YWx1ZSA9PSBOVUxMKTsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19yZWFkX3VudW0odGQsIGRhdGEsICZuKTsKKyAgICAgICAgd2hpbGUgKHZhbHVlLT5uYW1lICE9IE5VTEwgJiYgbiAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHZhbHVlLT52YWwgJiBuKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJXMlcyIsIGZpcnN0ID8gIiIgOiAiKyIsIHZhbHVlLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiAtPSB2YWx1ZS0+dmFsOworICAgICAgICAgICAgKyt2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiLSIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIGVyciA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBhcGlfbG9nX2dldF9udW1fZW51bV92YWxzKGNvbnN0IGJjbWNsaV9lbnVtX3ZhbCAqdmFscykKK3sKKyAgICBjb25zdCBiY21jbGlfZW51bV92YWwgKnYgPSB2YWxzOworICAgIHdoaWxlICh2ICE9IE5VTEwgJiYgdi0+bmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKyt2OworICAgIH0KKyAgICByZXR1cm4gKHVpbnQxNl90KSh2IC0gdmFscyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX2R1bXBfYXJyYXkoCisgICAgYXBpX2xvZ19yZWMgKnJlYywKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFByaW50IGFzIGJ1ZmZlciBvciBlbGVtZW50IGJ5IGVsZW1lbnQgPyAqLworICAgIGlmICgodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0gfHwgdGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYKSAmJiB0ZC0+c2l6ZSA9PSAxKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlcz0iLCBuYW1lKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICItIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJTAyWCIsICgoY29uc3QgdWludDhfdCAqKWRhdGEpW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiAiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX2RhdGFfdHlwZShyZWMsIHRkLCBkYXRhLCBuYW1lLCBzaXplLCB0ZC0+c2l6ZSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKAorICAgIGFwaV9sb2dfcmVjICpyZWMsCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICB1aW50MzJfdCBudW1fZW50cmllcywKKyAgICB1aW50MzJfdCBlbnRyeV9zaXplKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBzd2l0Y2ggKHRkLT5iYXNlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNUOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBmOworICAgICAgICAgICAgY2hhciBmdWxsX25hbWVbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICAgICAgICAgIGlmICh0ZC0+eC5zLm51bV9maWVsZHMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJVR19PTih0ZC0+eC5zLmZpZWxkcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCB0ZC0+eC5zLm51bV9maWVsZHM7IGYrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZsZCA9ICZ0ZC0+eC5zLmZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICB2b2lkICpmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUocmVjLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBQcmludCBmaWVsZHMgdXAgdG8gc2VsZWN0b3IsIHRoZW4gc2VsZWN0b3IsIHRoZW4gc2VsZWN0ZWQgc3ViLXN0cnVjdHVyZSAqLworICAgICAgICAgICAgdWludDE2X3QgZjsKKyAgICAgICAgICAgIGNoYXIgZnVsbF9uYW1lW0FQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSF07CisgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZsZDsKKyAgICAgICAgICAgIHZvaWQgKmZkYXRhOworICAgICAgICAgICAgaW50NjRfdCBzZWxlY3Rvcl92YWwgPSAwOworICAgICAgICAgICAgdWludDE2X3QgbnVtX3VuaW9uX3ZhbHM7CisKKyAgICAgICAgICAgIGlmICh0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCVUdfT04odGQtPngudS5jb21tb25fZmllbGRzID09IE5VTEwpOworICAgICAgICAgICAgLyogQ29tbW9uIGZpZWxkcywgaW5jbHVkaW5nIHNlbGVjdG9yICovCisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDw9IHRkLT54LnUuY2xhc3NpZmllcl9pZHggJiYgZXJyID09IEJDTV9FUlJfT0s7IGYrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICAgICAgICAgIGZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgIT0gTlVMTCAmJiBzdHJsZW4oZmxkLT5uYW1lKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX2RhdGFfdHlwZShyZWMsIGZsZC0+dHlwZSwgZmRhdGEsIGZ1bGxfbmFtZSwgbnVtX2VudHJpZXMsIGVudHJ5X3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSyAmJiBmID09IHRkLT54LnUuY2xhc3NpZmllcl9pZHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfc251bShmbGQtPnR5cGUsIGZkYXRhLCAmc2VsZWN0b3JfdmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtX3VuaW9uX3ZhbHMgPSBhcGlfbG9nX2dldF9udW1fZW51bV92YWxzKHRkLT54LnUuY29tbW9uX2ZpZWxkc1t0ZC0+eC51LmNsYXNzaWZpZXJfaWR4XS50eXBlLT54LmUpOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClzZWxlY3Rvcl92YWwgPj0gbnVtX3VuaW9uX3ZhbHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNlbGVjdGVkIGZpZWxkICovCisgICAgICAgICAgICBmbGQgPSAmdGQtPngudS51bmlvbl9maWVsZHNbc2VsZWN0b3JfdmFsXTsKKyAgICAgICAgICAgIGlmIChmbGQtPnR5cGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKworICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICBpZiAoZmxkLT5uYW1lICE9IE5VTEwgJiYgc3RybGVuKGZsZC0+bmFtZSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgZmxkLT5uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29tbW9uIGZpZWxkcyBmb2xsb3dpbmcgc2VsZWN0b3IgKi8KKyAgICAgICAgICAgIGZvciAoOyBmIDwgdGQtPngudS5udW1fY29tbW9uX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl07CisgICAgICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGZsZC0+bmFtZSAhPSBOVUxMICYmIHN0cmxlbihmbGQtPm5hbWUpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9hcnJheShyZWMsIHRkLT54LmFycl9maXhlZC5lbGVtX3R5cGUsIGRhdGEsIHRkLT54LmFycl9maXhlZC5zaXplLCBuYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU46CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYWQgbGVuZ3RoICovCisgICAgICAgICAgICB1aW50MzJfdCBhcnJheV9zaXplOworICAgICAgICAgICAgbG9uZyBiYXNlX3B0cjsKKworICAgICAgICAgICAgc3dpdGNoICh0ZC0+eC5hcnJfZHluLmxlbl9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTogYXJyYXlfc2l6ZSA9ICooY29uc3QgdWludDhfdCAqKWRhdGE7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogYXJyYXlfc2l6ZSA9ICooY29uc3QgdWludDE2X3QgKilkYXRhOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IGFycmF5X3NpemUgPSAqKGNvbnN0IHVpbnQzMl90ICopZGF0YTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhc2VfcHRyID0gQkNNT1NfUk9VTkRfVVAoKGxvbmcpZGF0YSArIHRkLT54LmFycl9keW4ubGVuX3NpemUsIHNpemVvZih2b2lkICopKTsKKyAgICAgICAgICAgIEJVR19PTihiYXNlX3B0ciA9PSAwKTsKKyAgICAgICAgICAgIGRhdGEgPSAqKHZvaWQgKiopYmFzZV9wdHI7CisgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfYXJyYXkocmVjLCB0ZC0+eC5hcnJfZHluLmVsZW1fdHlwZSwgZGF0YSwgYXJyYXlfc2l6ZSwgbmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgLyogRmluYWxseSEgU2ltcGxlIHR5cGUgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIG5hbWU9dmFsdWUgcGFpciAqLworICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVzPSIsIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRHVtcCBzaW1wbGUgdmFsdWUgb3IgYXJyYXkgb2Ygc2ltcGxlIHZhbHVlcyAqLworICAgICAgICAgICAgaWYgKG51bV9lbnRyaWVzID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICItIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbnVtX2VudHJpZXM7IG4rKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobiAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9zaW1wbGVfZGF0YV90eXBlKHJlYywgdGQsIGRhdGEsIG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRhdGEgPSAoY29uc3Qgdm9pZCAqKSgobG9uZylkYXRhICsgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX2R1bXBfcHJvcChhcGlfbG9nX3JlYyAqcmVjLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIGNvbnN0IHZvaWQgKnByb3BfZGF0YSkKK3sKKyAgICByZXR1cm4gYXBpX2xvZ19kdW1wX2RhdGFfdHlwZShyZWMsIHBkLT50eXBlLCBwcm9wX2RhdGEsIHBkLT5uYW1lLCAxLCAwKTsKK30KKworLyogQ2FsY3VsYXRlIHByb3BlcnR5IHBvaW50ZXIgZ2l2ZW4gdGhlIGdyb3VwIGRhdGEgcG9pbnRlciBhbmQgcHJvcGVydHkgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyBpbmxpbmUgY29uc3Qgdm9pZCAqYXBpX2xvZ19wcm9wX2RhdGFfcHRyKGNvbnN0IHZvaWQgKmdyb3VwX3B0ciwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkKQoreworICAgIHJldHVybiAoY29uc3Qgdm9pZCAqKSgobG9uZylncm91cF9wdHIgKyBwZC0+b2Zmc2V0KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfYXBwZW5kX2tleShhcGlfbG9nX3JlYyAqcmVjLCBjb25zdCB2b2lkICprZXksIHVpbnQzMl90IGtleV9zaXplKQoreworICAgIHVpbnQxNl90IHByb3A7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBmb3IgKHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkocmVjLT5tc2ctPm9ial90eXBlLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqcHJvcF9kYXRhID0gYXBpX2xvZ19wcm9wX2RhdGFfcHRyKGtleSwgcGQpOworICAgICAgICBpZiAocHJvcF9kYXRhID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEJVR19PTihwZC0+b2Zmc2V0ID4ga2V5X3NpemUpOworICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfcHJvcChyZWMsIHBkLCBwcm9wX2RhdGEpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX2FwcGVuZF9kYXRhKGFwaV9sb2dfcmVjICpyZWMsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCBwcm9wOworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworCisgICAgZm9yIChwcm9wID0gMDsKKyAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KHJlYy0+bXNnLT5vYmpfdHlwZSwgcmVjLT5tc2ctPmdyb3VwLCByZWMtPm1zZy0+c3ViZ3JvdXAsIHByb3AsICZwZCkgPT0gQkNNX0VSUl9PSzsKKyAgICAgICAgICsrcHJvcCkKKyAgICB7CisgICAgICAgIGNvbnN0IHZvaWQgKnByb3BfZGF0YSA9IGFwaV9sb2dfcHJvcF9kYXRhX3B0cihkYXRhLCBwZCk7CisgICAgICAgIGlmICgoKHJlYy0+bXNnLT5wcmVzZW5jZV9tYXNrICYgKDFMTCA8PCBwcm9wKSkgPT0gMCkgfHwgKHByb3BfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBkYXRhX3NpemUpOworICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfcHJvcChyZWMsIHBkLCBwcm9wX2RhdGEpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX2FwcGVuZF9oZHIoYXBpX2xvZ19yZWMgKnJlYykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpkZXNjcjsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X25hbWUocmVjLT5tc2ctPm9ial90eXBlLCAmbmFtZSwgJmRlc2NyKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGFwaV9sb2dfcHJpbnQocmVjLCBhcGljbGlfbWd0X2dyb3VwX3RvX3N0cihyZWMtPm1zZy0+Z3JvdXApKTsKKyAgICBpZiAoYXBpX2xvZ19pc19zaW5nbGV0b24ocmVjLT5tc2ctPmdyb3VwKSkKKyAgICB7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAocmVjLT5tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfU0VUKSAhPSAwID8gIl9zZXQiIDogIl9nZXQiKTsKKyAgICAgICAgaWYgKChyZWMtPm1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICJfbXVsdGkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZWMtPm1zZy0+Z3JvdXAgIT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPICYmIHJlYy0+bXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYKQorICAgIHsKKyAgICAgICAgaWYgKHJlYy0+bXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVRVUVTVCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIgcmVxdWVzdCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIgcmVzcG9uc2VbJWRdIiwgcmVjLT5tc2ctPmVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhcGlfbG9nX3ByaW50KHJlYywgIj4gJXMiLCBuYW1lKTsKKyAgICBpZiAoIWFwaV9sb2dfaXNfc2luZ2xldG9uKHJlYy0+bXNnLT5ncm91cCkpCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpzdWJfbmFtZTsKKyAgICAgICAgY29uc3QgY2hhciAqc3ViX2Q7CisgICAgICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUocmVjLT5tc2ctPm9ial90eXBlLCByZWMtPm1zZy0+Z3JvdXAsIHJlYy0+bXNnLT5zdWJncm91cCwgJnN1Yl9uYW1lLCAmc3ViX2QpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIuJXMiLCBzdWJfbmFtZSk7CisgICAgfQorCisgICAgYXBpX2xvZ19wcmludChyZWMsICI6ICIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX2FwcGVuZF9ib2R5KGFwaV9sb2dfcmVjICpyZWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQzMl90IGtleV9zaXplOworICAgIHVpbnQzMl90IGtleV9vZmZzZXQ7CisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IGRhdGFfb2Zmc2V0OworCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoCisgICAgICAgIHJlYy0+bXNnLT5vYmpfdHlwZSwKKyAgICAgICAgcmVjLT5tc2ctPmdyb3VwLAorICAgICAgICByZWMtPm1zZy0+c3ViZ3JvdXAsCisgICAgICAgICZrZXlfc2l6ZSwKKyAgICAgICAgJmtleV9vZmZzZXQsCisgICAgICAgICZkYXRhX3NpemUsCisgICAgICAgICZkYXRhX29mZnNldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKHJlYy0+bXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX01VTFRJKSAhPSAwKQorICAgIHsKKyAgICAgICAgLyogbWVzc2FnZSBzZXQgcHJpbnRpbmcgZm9yIG11bHRpLW9iamVjdCBjZmcgbm90IGltcGxlbWVudGVkICovCisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiKGRhdGEgb21pdHRlZCkiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChyZWMtPm1zZy0+Z3JvdXAgIT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRykgJiYgKGtleV9zaXplICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB2b2lkICprZXkgPSAoY29uc3Qgdm9pZCAqKSgobG9uZylyZWMtPm1zZyArIGtleV9vZmZzZXQpOworICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19hcHBlbmRfa2V5KHJlYywga2V5LCBrZXlfc2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZGF0YV9zaXplICE9IDApICYmCisgICAgICAgICAgICAoKChyZWMtPm1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpICYmIChyZWMtPm1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpKSAgfHwKKyAgICAgICAgICAgICAoKHJlYy0+bXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpICYmIChyZWMtPm1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9HRVQpKSB8fAorICAgICAgICAgICAgIChyZWMtPm1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgKHJlYy0+bXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSAoY29uc3Qgdm9pZCAqKSgobG9uZylyZWMtPm1zZyArIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfYXBwZW5kX2RhdGEocmVjLCBkYXRhLCBkYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19sb2coZGV2X2xvZ19pZCBsb2dfaWQsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGFwaV9sb2dfcmVjIHJlYyA9IHsgLmxvZ19pZCA9IGxvZ19pZCwgLm1zZyA9IG1zZywgLnVzZWQgPSAwIH07CisKKyAgICByZWMuYnVmID0gYmNtb3NfYmxrX3Bvb2xfYWxsb2MoJmFwaV9sb2dfYmxrX3Bvb2wpOworICAgIGlmIChyZWMuYnVmID09IE5VTEwpCisgICAgeworICAgICAgICBlcnIgPSBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGVyciA9IChlcnIgIT0gQkNNX0VSUl9PSykgPyBlcnIgOiBhcGlfbG9nX2FwcGVuZF9oZHIoJnJlYyk7CisgICAgZXJyID0gKGVyciAhPSBCQ01fRVJSX09LKSA/IGVyciA6IGFwaV9sb2dfYXBwZW5kX2JvZHkoJnJlYyk7CisgICAgYXBpX2xvZ19mbHVzaCgmcmVjLCAiXG4iKTsKKworICAgIGlmIChyZWMuYnVmICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ibGtfcG9vbF9mcmVlKHJlYy5idWYpOworICAgIH0KKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWQsICJBUEkgbWVzc2FnZSBsb2cgZXJyb3I6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgYmNtb2x0X21zZ19sb2dfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vc19ibGtfcG9vbF9wYXJtIGJsa19wb29sX3Bhcm0gPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiYXBpX2Rldl9sb2ciLAorICAgICAgICAuYmxrX3NpemUgPSBNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUsCisgICAgICAgIC5udW1fYmxrcyA9IEFQSV9MT0dfTlVNX0JMS1MsCisgICAgfTsKKworICAgIGVyciA9IGJjbW9zX2Jsa19wb29sX2NyZWF0ZSgmYXBpX2xvZ19ibGtfcG9vbCwgJmJsa19wb29sX3Bhcm0pOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9iY21fYXBpX2Rldl9sb2cuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9iY21fYXBpX2Rldl9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDc1YjVmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL2JjbV9hcGlfZGV2X2xvZy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNX0FQSV9ERVZfTE9HX0hfCisjZGVmaW5lIEJDTV9BUElfREVWX0xPR19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisKKy8qIFByaW50IG1lc3NhZ2UgaGVhZGVyL2JvZHkgdG8gYSBsb2dnZXIgSUQgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9tc2dfbG9nKGRldl9sb2dfaWQgbG9nX2lkLCBjb25zdCBiY21vbHRfbXNnICptc2cpOworCisvKiBJbml0aWFsaXplIEFQSS9kZXZsb2cgaW50ZWdyYXRpb24gKi8KK3ZvaWQgYmNtb2x0X21zZ19sb2dfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIEJDTV9BUElfREVWX0xPR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwYjgzOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAoraWZlcSAoIiQoT1MpIiwgInBvc2l4IikKKyAgICBNT0RfTkFNRSA9IGJjbV9hcGlfcHJveHkKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gdHJhbnNwb3J0IGNsaQoraWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisgICAgTU9EX0RFUFMgKz0gY29tbW9uX2FwaQorZWxzZQorICAgIE1PRF9ERVBTICs9IGFwaQorZW5kaWYKKworICAgIHNyY3MgPSBiY21vbHRfYXBpX3Byb3h5LmMKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX3Byb3h5L2JjbW9sdF9hcGlfcHJveHkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzE2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX3Byb3h5L2JjbW9sdF9hcGlfcHJveHkuYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbXRyX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJjbXRyX2hlYWRlci5oPgorI2luY2x1ZGUgPGJjbXRyX3RyYW5zcG9ydF9jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtdHJfZGVidWcuaD4KKyNpZmRlZiBFTkFCTEVfQ0xJCisjaW5jbHVkZSA8YmNtY2xpLmg+CisjZW5kaWYKKyNpbmNsdWRlICJiY21vbHRfYXBpX3Byb3h5LmgiCisjaWZkZWYgRU5BQkxFX0xPRworI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjZW5kaWYKKworLyogU3RhdGlzdGljcyAqLwordHlwZWRlZiBzdHJ1Y3QgcHJveHlfc3RhdHMKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7CisgICAgdW5zaWduZWQgbG9uZyByeF9ieXRlczsKKyAgICB1bnNpZ25lZCBsb25nIHR4X3BhY2tldHM7CisgICAgdW5zaWduZWQgbG9uZyB0eF9ieXRlczsKKyAgICB1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsKKyAgICB1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsKKyAgICB1bnNpZ25lZCBsb25nIHVucGFja19lcnJvcnM7CisgICAgdW5zaWduZWQgbG9uZyBwYWNrX2Vycm9yczsKKyAgICB1bnNpZ25lZCBsb25nIG1zZ19lcnJvcnM7Cit9IHByb3h5X3N0YXRzOworCit0eXBlZGVmIHN0cnVjdCBwcm94eV9jb250cm9sX2Jsb2NrCit7CisgICAgYmNtb3NfdGFzayBwcm94eV9yeF90YXNrOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnQ7CisgICAgdWludDMyX3QgcHJveHlfcG9ydDsKKyAgICBpbnQgZGV2aWNlX2lkOworICAgIGludCBjbGllbnRfc29ja2V0OworICAgIGJjbW9zX2Jvb2wgaXNfcnVubmluZzsKKyAgICBjaGFyICpvbl9yZWFkeV9jbWQ7CisKKyAgICAvKiB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgY291bGQgcG9zc2libHkgYnkgdXNlZCBieSBhbGwgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2l0aGluIGEgR0VUIHJlcXVlc3QgKi8KKyNkZWZpbmUgRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFICgzMiAqIDEwMjQpCisgICAgdWludDhfdCBkeW5hbWljX2xpc3RfYnVmZmVyW0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRV07CisKKyAgICBkZXZfbG9nX2lkIHByb3h5X2xvZzsKKworICAgIHByb3h5X3N0YXRzIHN0YXRzOworfSBwcm94eV9jb250cm9sX2Jsb2NrOworCisvKiBQZXIgZGV2aWNlIHByb3h5IGNvbnRyb2wgYmxvY2sgKi8KK3N0YXRpYyBwcm94eV9jb250cm9sX2Jsb2NrIHByb3h5X2RhdGFbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIGJjbW9zX2Jvb2wgaXNfZmlyc3RfcHJveHkgPSBCQ01PU19UUlVFOworCisjaWZkZWYgRU5BQkxFX0NMSQorLyovcHJveHkvc3RhdHMgY29tbWFuZCBoYW5kbGVyCisqLworc3RhdGljIGJjbW9zX2Vycm5vIF9wcm94eV9zdGF0c19jbWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBpbnQgZGV2aWNlID0gKGludClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAicnhfcGFja2V0cyIsIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5yeF9wYWNrZXRzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJyeF9ieXRlcyIsIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5yeF9ieXRlcyk7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAidHhfcGFja2V0cyIsIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy50eF9wYWNrZXRzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9ieXRlcyIsIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy50eF9ieXRlcyk7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAicnhfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnJ4X2Vycm9ycyk7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAidHhfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X2Vycm9ycyk7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAidW5wYWNrX2Vycm9ycyIsIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy51bnBhY2tfZXJyb3JzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJwYWNrX2Vycm9ycyIsIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5wYWNrX2Vycm9ycyk7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAibXNnX2Vycm9ycyIsIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5tc2dfZXJyb3JzKTsKKyAgICBtZW1zZXQoJnByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cywgMCwgc2l6ZW9mKHByb3h5X3N0YXRzKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRU5BQkxFX0NMSSAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX3Byb3h5X21zZ19lcnJvcihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICpwcm94eV9tc2cpCit7CisgICAgcHJveHlfY29udHJvbF9ibG9jayAqcHJveHkgPSAmcHJveHlfZGF0YVtkZXZpY2VdOworICAgICsrcHJveHktPnN0YXRzLm1zZ19lcnJvcnM7CisgICAgYmNtb2x0X21zZ19lcnIocHJveHlfbXNnLCBwcm94eS0+cHJveHlfbG9nLCBCQ01fRVJSX1BBUk0sIEJDTU9MVF9FUlJfRklFTERfTk9ORSwgIk1lc3NhZ2UgaXMgaW5zYW5lIik7CisgICAgcHJveHlfbXNnLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworfQorCitzdGF0aWMgdm9pZCBfcHJveHlfaW52b2tlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKnByb3h5X21zZykKK3sKKyAgICBwcm94eV9jb250cm9sX2Jsb2NrICpwcm94eSA9ICZwcm94eV9kYXRhW2RldmljZV07CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgbWVzc2FnZSB0YXJnZXRzIGFuIG9iamVjdCB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBvdXIgc3lzdGVtIG1vZGUgKi8KKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGRldmljZSwgJnN5c3RlbV9tb2RlKTsKKyAgICBpZiAoc3lzdGVtX21vZGUgIT0gQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0YgJiYgIWJjbW9sdF9vYmplY3RfaXNfc3VwcG9ydGVkKHN5c3RlbV9tb2RlLCBwcm94eV9tc2ctPm9ial90eXBlKSkKKyAgICB7CisgICAgICAgICsrcHJveHktPnN0YXRzLm1zZ19lcnJvcnM7CisgICAgICAgIHByb3h5X21zZy0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgcHJveHlfbXNnLAorICAgICAgICAgICAgcHJveHktPnByb3h5X2xvZywKKyAgICAgICAgICAgIEJDTV9FUlJfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJPYmplY3QgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIG1vZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEludm9rZSBBUEkgKi8KKyAgICBzd2l0Y2ggKHByb3h5X21zZy0+Z3JvdXApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgaWYgKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZSwgKGJjbW9sdF9jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9HRVQpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfTVVMVEkpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJveHlfbXNnLT5tc2dfc2V0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gX3Byb3h5X21zZ19lcnJvcihkZXZpY2UsIHByb3h5X21zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNtb2x0X2NmZyAqKXByb3h5X21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9tc2ctPm1zZ19zZXQtPmZpbHRlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9tc2ctPm1zZ19zZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAoYmNtb2x0X2NmZyAqKXByb3h5X21zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2UsIChiY21vbHRfY2ZnICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IF9wcm94eV9tc2dfZXJyb3IoZGV2aWNlLCBwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X3N0YXRfZmxhZ3MgZmxhZ3M7CisKKyAgICAgICAgICAgICAgICBmbGFncyA9ICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0NMRUFSKSAhPSAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfU1RBVF9GTEFHU19DTEVBUl9PTl9SRUFEIDogMDsKKworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZSwgKGJjbW9sdF9zdGF0ICopcHJveHlfbXNnLCBmbGFncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZSwgKGJjbW9sdF9vcGVyICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlLCAoYmNtb2x0X3Byb3h5ICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlLCAoYmNtb2x0X3N0YXRfY2ZnICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfU0VUKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2UsIChiY21vbHRfc3RhdF9jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX3Byb3h5X21zZ19lcnJvcihkZXZpY2UsIHByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9HRVQpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZSwgKGJjbW9sdF9hdXRvX2NmZyAqKXByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX1NFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlLCAoYmNtb2x0X2F1dG9fY2ZnICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IF9wcm94eV9tc2dfZXJyb3IoZGV2aWNlLCBwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gX3Byb3h5X21zZ19lcnJvcihkZXZpY2UsIHByb3h5X21zZyk7CisgICAgfQorCisgICAgcHJveHlfbXNnLT5lcnIgPSByYzsKK30KKworLyogUGFjayBhbmQgc2VuZCBtZXNzYWdlICovCitzdGF0aWMgdm9pZCBfcHJveHlfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtdHJfaGRyIGhkciA9IHt9OworICAgIGludDMyX3QgcGFja2VkX2xlbmd0aDsKKyAgICBiY21vbHRfYnVmIHR4YiA9IHt9OworICAgIGludCBsZW47CisKKyAgICAvKiBBbGxvY2F0ZSBidWZmZXIgYW5kIHBhY2sgKi8KKyAgICBwYWNrZWRfbGVuZ3RoID0gYmNtb2x0X21zZ19nZXRfcGFja2VkX2xlbmd0aChtc2cpOworICAgIGlmIChwYWNrZWRfbGVuZ3RoIDw9IDApCisgICAgeworICAgICAgICArK3Byb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5wYWNrX2Vycm9yczsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBwYWNrZWRfbGVuZ3RoICs9IEJDTVRSX0hEUl9TSVpFOworICAgIGlmIChiY21vbHRfYnVmX2FsbG9jKCZ0eGIsIHBhY2tlZF9sZW5ndGgsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKSAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgKytwcm94eV9kYXRhW2RldmljZV0uc3RhdHMucGFja19lcnJvcnM7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgYmNtdHJfaGVhZGVyX2ZpbGwobXNnLCAmaGRyKTsKKyAgICBiY210cl9oZWFkZXJfcGFjaygmaGRyLCB0eGIuc3RhcnQpOworICAgIGJjbW9sdF9idWZfc2tpcCgmdHhiLCBCQ01UUl9IRFJfU0laRSk7CisgICAgaWYgKGJjbW9sdF9tc2dfcGFjayhtc2csICZ0eGIpICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICArK3Byb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5wYWNrX2Vycm9yczsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qIFNlbmQgdG8gY2xpZW50ICovCisgICAgbGVuID0gc2VuZHRvKHByb3h5X2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0LCB0eGIuc3RhcnQsIGJjbW9sdF9idWZfZ2V0X3VzZWQoJnR4YiksIDAsCisgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmcHJveHlfZGF0YVtkZXZpY2VdLmNsaWVudCwgc2l6ZW9mKHByb3h5X2RhdGFbZGV2aWNlXS5jbGllbnQpKTsKKyAgICBpZiAobGVuIDw9IDApCisgICAgeworICAgICAgICArK3Byb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy50eF9lcnJvcnM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICsrcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X3BhY2tldHM7CisgICAgICAgIHByb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy50eF9ieXRlcyArPSBsZW47CisgICAgfQorCitkb25lOgorICAgIGJjbW9sdF9idWZfZnJlZSgmdHhiKTsKKyAgICByZXR1cm47Cit9CisKKy8qIFRhc2sgdGhhdCB3YWl0cyBmb3IgbWVzc2FnZXMgZnJvbSBNYXBsZS4KKyAqIE9uY2UgbWVzc2FnZSBpcyByZWNlaXZlZCwgaXQgaXMgZm9yd2FyZGVkIHRvIHJlbW90ZSBhcHBsaWNhdGlvbgorICogdmlhIFVEUCBzb2NrZXQuCisgKi8KK3N0YXRpYyBpbnQgX3Byb3h5X3J4X2hhbmRsZXIobG9uZyBkYXRhKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7CisgICAgYmNtb3NfdGFzayAqc2VsZiA9IGJjbW9zX3Rhc2tfY3VycmVudCgpOworICAgIHByb3h5X2NvbnRyb2xfYmxvY2sgKnByb3h5ID0gJnByb3h5X2RhdGFbZGV2aWNlXTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VuZGVyOworICAgIHNvY2tsZW5fdCBzZW5kc2l6ZSA9IHNpemVvZihzZW5kZXIpOworICAgIHVpbnQ4X3QgY2xpZW50X2J1ZmZlcltCQ01UUl9NQVhfTVRVX1NJWkUgKyAxMjhdOworICAgIGJjbW9sdF9tc2cgKnByb3h5X21zZzsKKyAgICBiY210cl9oZHIgdHJfaGRyOworICAgIGJjbW9sdF9idWYgcnhiOworICAgIGludCBsZW47CisgICAgdWludDE2X3QgY29ycl90YWc7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICB3aGlsZSAoIXNlbGYtPmRlc3Ryb3llZCkKKyAgICB7CisgICAgICAgIG1lbXNldCgmc2VuZGVyLCAwLCBzaXplb2Yoc2VuZGVyKSk7CisgICAgICAgIGxlbiA9IHJlY3Zmcm9tKHByb3h5LT5jbGllbnRfc29ja2V0LCBjbGllbnRfYnVmZmVyLCBzaXplb2YoY2xpZW50X2J1ZmZlciksIDAsCisgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VuZGVyLCAmc2VuZHNpemUpOworICAgICAgICBpZiAobGVuIDwgQkNNVFJfSERSX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrcHJveHktPnN0YXRzLnJ4X2Vycm9yczsKKyAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwMDAwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsrcHJveHktPnN0YXRzLnJ4X3BhY2tldHM7CisgICAgICAgIHByb3h5LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKyAgICAgICAgaWYgKHByb3h5LT5jbGllbnQuc2luX2FkZHIuc19hZGRyICE9IHNlbmRlci5zaW5fYWRkci5zX2FkZHIgfHwKKyAgICAgICAgICAgIHByb3h5LT5jbGllbnQuc2luX3BvcnQgIT0gc2VuZGVyLnNpbl9wb3J0KQorICAgICAgICB7CisjaWZkZWYgRU5BQkxFX0xPRworICAgICAgICAgICAgaW50IGNsaWVudF9pcCA9IG50b2hsKHNlbmRlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgICAgaW50IGNsaWVudF9wb3J0ID0gbnRvaHMoc2VuZGVyLnNpbl9wb3J0KTsKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgcHJveHktPnByb3h5X2xvZywgImJjbV9hcGlfcHJveHk6IGRldmljZSAlaSBjb25uZWN0ZWQgdG8gJWQuJWQuJWQuJWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAoY2xpZW50X2lwID4+IDI0KSAmIDB4ZmYsIChjbGllbnRfaXAgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgKGNsaWVudF9pcCA+PiA4KSAmIDB4ZmYsIGNsaWVudF9pcCAmIDB4ZmYsIGNsaWVudF9wb3J0KTsKKyNlbmRpZgorICAgICAgICAgICAgcHJveHktPmNsaWVudCA9IHNlbmRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVucGFjayByZWNlaXZlZCBtZXNzYWdlICovCisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmcnhiLCBsZW4sIGNsaWVudF9idWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICAgICAgYmNtdHJfaGVhZGVyX3VucGFjayhjbGllbnRfYnVmZmVyLCAmdHJfaGRyKTsKKworICAgICAgICAvKiBTa2lwIHJlZ2lzdHJhdGlvbiBtZXNzYWdlcyBmb3Igbm93LiBUaGUgcHJveHkgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgZXZlcnl0aGluZyAqLworICAgICAgICBpZiAodHJfaGRyLmF1dG9fcHJveHlfcmVnIHx8IHRyX2hkci5hdXRvX3Byb3h5X3VucmVnKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYmNtb2x0X2J1Zl9za2lwKCZyeGIsIEJDTVRSX0hEUl9TSVpFKTsKKyAgICAgICAgcHJveHlfbXNnID0gTlVMTDsKKyAgICAgICAgcmMgPSBiY21vbHRfbXNnX3VucGFjaygmcnhiLCAmcHJveHlfbXNnKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBVbnBhY2sgZXJyb3IuIE5vdGhpbmcgbXVjaCB3ZSBjYW4gZG8gKi8KKyAgICAgICAgICAgICsrcHJveHktPnN0YXRzLnVucGFja19lcnJvcnM7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFN0b3JlIGNvcnJlbGF0aW9uIHRhZyBmb3IgbGF0ZXIgKi8KKyAgICAgICAgcHJveHlfbXNnLT5jb3JyX3RhZyA9IHRyX2hkci5jb3JyX3RhZzsKKyAgICAgICAgY29ycl90YWcgPSBwcm94eV9tc2ctPmNvcnJfdGFnOworCisgICAgICAgIC8qIFBvaW50IHRoZSBtZXNzYWdlIHVucGFja2VyIHRvIGxvY2FsIHN0b3JhZ2UgZm9yIGR5bmFtaWNhbGx5LXNpemVkIGxpc3RzICovCisgICAgICAgIHByb3h5X21zZy0+bGlzdF9idWYgPSBwcm94eS0+ZHluYW1pY19saXN0X2J1ZmZlcjsKKyAgICAgICAgcHJveHlfbXNnLT5saXN0X2J1Zl9zaXplID0gRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFOworCisgICAgICAgIC8qIEludm9rZSBBUEkgKi8KKyAgICAgICAgX3Byb3h5X2ludm9rZShkZXZpY2UsIHByb3h5X21zZyk7CisKKyAgICAgICAgLyogUGFjayBhbmQgc2VuZCBiYWNrIHRvIHRoZSBjbGllbnQgKi8KKyAgICAgICAgcHJveHlfbXNnLT5jb3JyX3RhZyA9IGNvcnJfdGFnOworICAgICAgICBfcHJveHlfc2VuZChkZXZpY2UsIHByb3h5X21zZyk7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShwcm94eV9tc2cpOworICAgIH0KKworICAgIHNlbGYtPmRlc3Ryb3llZCA9IEJDTU9TX1RSVUU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEF1dG8gLyBwcm94eSBtZXNzYWdlIGhhbmRsZXIgKi8KK3ZvaWQgYmNtb2x0X2FwaV9wcm94eV9hdXRvX3J4X2NiKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocHJveHlfZGF0YVtkZXZpY2VdLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBpZiAocHJveHlfZGF0YVtkZXZpY2VdLm9uX3JlYWR5X2NtZCAmJgorICAgICAgICAgICAgbXNnLT5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFVklDRSAmJgorICAgICAgICAgICAgbXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE8gJiYKKyAgICAgICAgICAgIG1zZy0+c3ViZ3JvdXAgPT0gQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgb25fcmVhZHlfY21kWzUxMl07CisgICAgICAgICAgICBpbnQgcmM7CisgICAgICAgICAgICBzbnByaW50Zihvbl9yZWFkeV9jbWQsIHNpemVvZihvbl9yZWFkeV9jbWQpIC0gMSwgIiVzICVkIiwgcHJveHlfZGF0YVtkZXZpY2VdLm9uX3JlYWR5X2NtZCwgKGludClkZXZpY2UpOworICAgICAgICAgICAgcmMgPSBzeXN0ZW0ob25fcmVhZHlfY21kKTsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgICAgICBCQ01fTE9HKElORk8sIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2csICJFeGVjdXRlZCBjb21tYW5kICVzLiByYz0lZFxuIiwgb25fcmVhZHlfY21kLCByYyk7CisjZWxzZQorICAgICAgICAgICAgKHZvaWQpcmM7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBfcHJveHlfc2VuZChkZXZpY2UsIG1zZyk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX3Byb3h5X3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHVkcF9wb3J0LCBjaGFyICpvbl9yZWFkeSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vc190YXNrX3Bhcm0gcHJveHlfcnhfcGFybSA9CisgICAgeworICAgICAgICAubmFtZSA9ICJwcm94eV9yeCIsCisgICAgICAgIC5oYW5kbGVyID0gX3Byb3h5X3J4X2hhbmRsZXIsCisgICAgICAgIC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfVFJBTlNQT1JUX1BST1hZLAorICAgICAgICAuZGF0YSA9IGRldmljZQorICAgIH07CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhID0ge307CisKKyAgICBwcm94eV9kYXRhW2RldmljZV0ucHJveHlfcG9ydCA9IHVkcF9wb3J0OworICAgIHByb3h5X2RhdGFbZGV2aWNlXS5kZXZpY2VfaWQgPSBkZXZpY2U7CisgICAgcHJveHlfZGF0YVtkZXZpY2VdLm9uX3JlYWR5X2NtZCA9IG9uX3JlYWR5OworCisgICAgLyogU3RhcnQgbGlzdGVuaW5nIG9uIHByb3h5IHBvcnQgKi8KKyAgICBwcm94eV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAocHJveHlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQgPCAwKQorICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIEJDTV9MT0coRVJST1IsIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2csICJDYW4ndCBjcmVhdGUgVURQIHNvY2tldFxuIik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorCisgICAgLyogQmluZCBsb2NhbCAqLworICAgIHNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHNhLnNpbl9wb3J0ID0gaHRvbnMocHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X3BvcnQpOworICAgIHNhLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgaWYgKGJpbmQocHJveHlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgc2l6ZW9mKHNhKSApID09IC0xKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJiaW5kIik7CisjaWZkZWYgRU5BQkxFX0xPRworICAgICAgICBCQ01fTE9HKEVSUk9SLCBwcm94eV9kYXRhW2RldmljZV0ucHJveHlfbG9nLCAiQ2FuJ3QgYmluZCBVRFAgc29ja2V0IHRvIHBvcnQgJXVcbiIsIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9wb3J0KTsKKyNlbmRpZgorICAgICAgICBjbG9zZShwcm94eV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0aHJlYWQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBBUElzICovCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X3J4X3Rhc2ssICZwcm94eV9yeF9wYXJtKTsKKyAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSByYyk7CisKKyAgICBwcm94eV9kYXRhW2RldmljZV0uaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgQkNNX0xPRyhJTkZPLCBwcm94eV9kYXRhW2RldmljZV0ucHJveHlfbG9nLCAiQkNNNjg2MjAgQVBJIHByb3h5IGZvciBkZXZpY2UgJWQgaXMgbGlzdGVuaW5nIGZvciByZXF1ZXN0cyBvbiBVRFAgcG9ydCAldVxuIiwKKyAgICAgICAgKGludClkZXZpY2UsIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9wb3J0KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9hcGlfcHJveHlfaW5pdChiY21jbGlfZW50cnkgKnJvb3QsIGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHVkcF9wb3J0LCBjaGFyICpvbl9yZWFkeSkKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisjZW5kaWYKKworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAocHJveHlfZGF0YVtkZXZpY2VdLmlzX3J1bm5pbmcpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgeworICAgICAgICBjaGFyIGxvZ19pZFszMl07CisgICAgICAgIHNucHJpbnRmKGxvZ19pZCwgc2l6ZW9mKGxvZ19pZCkgLSAxLCAicHJveHlfJWQiLCAoaW50KWRldmljZSk7CisgICAgICAgIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2cgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfaWQsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIH0KKyNlbHNlCisgICAgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZyA9IERFVl9MT0dfSU5WQUxJRF9JRDsKKyNlbmRpZgorCisgICAgaWYgKGlzX2ZpcnN0X3Byb3h5KQorICAgIHsKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKHJvb3QsICJwcm94eSIsICJBUEkgcHJveHkiLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMKTsKKyAgICAgICAgaWYgKCFkaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2csICJDYW4ndCBjcmVhdGUgcHJveHkgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICAgIEJVRygpOworICAgICAgICB9CisKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInN0YXQiLCAiUHJveHkgc3RhdGlzdGljcyIsIF9wcm94eV9zdGF0c19jbWQsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgICAgIDAsIEJDTVRSX01BWF9PTFRTLTEpKTsKKworI2VuZGlmCisgICAgICAgIGlzX2ZpcnN0X3Byb3h5ID0gQkNNT1NfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBfcHJveHlfc3RhcnQoZGV2aWNlLCB1ZHBfcG9ydCwgb25fcmVhZHkpOworfQorCit2b2lkIGJjbW9sdF9hcGlfcHJveHlfc3RvcCh2b2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEJDTVRSX01BWF9PTFRTOyBpKyspCisgICAgeworICAgICAgICBpZiAocHJveHlfZGF0YVtpXS5pc19ydW5uaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190YXNrX2Rlc3Ryb3koJnByb3h5X2RhdGFbaV0ucHJveHlfcnhfdGFzayk7CisgICAgICAgICAgICBjbG9zZShwcm94eV9kYXRhW2ldLmNsaWVudF9zb2NrZXQpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX3Byb3h5L2JjbW9sdF9hcGlfcHJveHkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmMyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX3Byb3h5L2JjbW9sdF9hcGlfcHJveHkuaApAQCAtMCwwICsxLDQ0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfQVBJX1BST1hZX0hfCisjZGVmaW5lIF9CQ01PTFRfQVBJX1BST1hZX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisKK3ZvaWQgYmNtb2x0X2FwaV9wcm94eV9hdXRvX3J4X2NiKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZyk7CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9hcGlfcHJveHlfaW5pdChiY21jbGlfZW50cnkgKnJvb3QsIGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHVkcF9wb3J0LCBjaGFyICpvbl9yZWFkeV9jbWQpOworCit2b2lkIGJjbW9sdF9hcGlfcHJveHlfc3RvcCh2b2lkKTsKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5NzRjMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSwyNiBAQAorIyBDTEkgZW5naW5lCisjCitNT0RfTkFNRSA9IGNsaQorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gdXRpbHMKKworc3JjcyA9IGJjbWNsaV9zZXNzaW9uLmMKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIHNyY3MgKz0gYmNtY2xpLmMKKyAgICBNT0RfREVGUyA9IC1ERU5BQkxFX0NMSQorCisgICAgIyBFbmFibGUgbGluZSBlZGl0aW5nIGJ5IGRlZmF1bHQuIENhbiBiZSBvdmVyd3JpdHRlbiBpbiBtYWtlIGNvbW1hbmQgbGluZQorICAgIENPTkZJR19MSUJFRElUCT89IG4KKyAgICBDT05GSUdfTElORU5PSVNFID89IHkKKyAgICAKKyAgICAjIEV4dHJhIGNvbmZpZ3VyYXRpb24KKyAgICBpZmVxICgiJChDT05GSUdfTElCRURJVCkiLCAieSIpCisgICAgCU1PRF9ERUZTICs9IC1EQ09ORklHX0xJQkVESVQgLURDT05GSUdfRURJVExJTkUKKyAgICAJTU9EX0xJQlMgKz0gLWxlZGl0IC1sdGVybWNhcAorICAgIAlDT05GSUdfTElORU5PSVNFID0gbgorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoQ09ORklHX0xJTkVOT0lTRSkiLCAieSIpCisgICAgCU1PRF9ERVBTICs9IGxpbmVub2lzZQorICAgIGVuZGlmCitlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkwZTVkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGkuYwpAQCAtMCwwICsxLDI4MzUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJjbWNsaS5jCisgKgorICogQ0xJIGVuZ2luZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2RlZmluZSBCQ01DTElfSU5URVJOQUwKKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vc190eXBlcy5oPgorCisjZGVmaW5lIEJDTUNMSV9JTkJVRl9MRU4gICAgICAgICAgMjA0OAorI2RlZmluZSBCQ01DTElfTUFYX1FVQUxfTkFNRV9MRU5HVEggMjU2CisjZGVmaW5lIEJDTUNMSV9NQVhfUEFSTVMgICAgICAgICAgMTI4CisjZGVmaW5lIEJDTUNMSV9VUF9TVFIgICAgICAgICAgICAgIi4uIgorI2RlZmluZSBCQ01DTElfUk9PVF9TVFIgICAgICAgICAgICIvIgorI2RlZmluZSBCQ01DTElfQ09NTUVOVF9DSEFSICAgICAgICcjJworI2RlZmluZSBCQ01DTElfSEVMUF9DSEFSICAgICAgICAgICc/JworI2RlZmluZSBCQ01DTElfQVJSQVlfREVMSU1fQ0hBUiAgICcsJworI2RlZmluZSBCQ01DTElfUk9PVF9IRUxQICAgICAgICAgICJyb290IGRpcmVjdG9yeSIKKyNkZWZpbmUgQkNNQ0xJX01BWF9QQVJNX1ZBTF9MRU4gICAyNTYKKyNkZWZpbmUgQkNNQ0xJX0VOVU1fTUFTS19ERUxfQ0hBUiAnKycKKyNkZWZpbmUgQkNNQ0xJX0hFTFBfQlVGRkVSX1NJWkUgICAxNjM4NAorCisjZGVmaW5lIEJDTUNMSV9FUVVBTF9DSEFSICAgICAgICAgJz0nCisKKwordHlwZWRlZiBlbnVtIHsgQkNNQ0xJX0VOVFJZX0RJUiwgQkNNQ0xJX0VOVFJZX0NNRCB9IGJjbWNsaV9lbnRyeV9zZWxlY3RvcjsKKworLyogRXh0ZXJuYWwgdGFibGUgLSBib29sZWFuIHZhbHVlcyAqLworYmNtY2xpX2VudW1fdmFsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGVbXSA9IHsKKyAgICB7IC5uYW1lPSJ0cnVlIiwgLnZhbCA9IDEgfSwKKyAgICB7IC5uYW1lPSJ5ZXMiLCAudmFsID0gMSB9LAorICAgIHsgLm5hbWU9Im9uIiwgLnZhbCA9IDEgfSwKKyAgICB7IC5uYW1lPSJmYWxzZSIsIC52YWwgPSAwIH0sCisgICAgeyAubmFtZT0ibm8iLCAudmFsID0gMCB9LAorICAgIHsgLm5hbWU9Im9mZiIsIC52YWwgPSAwIH0sCisgICAgQkNNQ0xJX0VOVU1fTEFTVAorfTsKKworLyogTW9uaXRvciB0b2tlbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBiY21jbGlfZW50cnkKK3sKKyAgICBzdHJ1Y3QgYmNtY2xpX2VudHJ5ICAqbmV4dDsKKyAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kL2RpcmVjdG9yeSBuYW1lICovCisgICAgY2hhciAqaGVscDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZC9kaXJlY3RvcnkgaGVscCAqLworICAgIGJjbWNsaV9lbnRyeV9zZWxlY3RvciBzZWw7ICAgICAgICAgICAgICAgICAgIC8qIEVudHJ5IHNlbGVjdG9yICovCisgICAgY2hhciAqYWxpYXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxpYXMgKi8KKyAgICB1aW50MTZfdCBhbGlhc19sZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGlhcyBsZW5ndGggKi8KKyAgICBzdHJ1Y3QgYmNtY2xpX2VudHJ5ICpwYXJlbnQ7ICAgICAgICAgICAgICAgICAvKiBQYXJlbnQgZGlyZWN0b3J5ICovCisgICAgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3NfcmlnaHQ7CisKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgYmNtY2xpX2VudHJ5ICpmaXJzdDsgICAgICAgICAgLyogRmlyc3QgZW50cnkgaW4gZGlyZWN0b3J5ICovCisgICAgICAgICAgICBiY21jbGlfZGlyX2V4dHJhX3Bhcm0gZXh0cmFzOyAgICAgICAgLyogT3B0aW9uYWwgZXh0cmFzICovCisgICAgICAgIH0gZGlyOworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX2NtZF9jYiBjbWRfY2I7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybXM7ICAgICAgICAgICAgICAvKiBDb21tYW5kIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIGJjbWNsaV9jbWRfZXh0cmFfcGFybSBleHRyYXM7ICAgICAgICAvKiBPcHRpb25hbCBleHRyYXMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG51bV9wYXJtczsKKyAgICAgICAgfSBjbWQ7CisgICAgfSB1OworfTsKKworCisvKiBUb2tlbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNQ0xJX1RPS0VOX0VNUFRZLAorICAgIEJDTUNMSV9UT0tFTl9VUCwKKyAgICBCQ01DTElfVE9LRU5fUk9PVCwKKyAgICBCQ01DTElfVE9LRU5fQlJFQUssCisgICAgQkNNQ0xJX1RPS0VOX0hFTFAsCisgICAgQkNNQ0xJX1RPS0VOX05BTUUsCisgICAgQkNNQ0xJX1RPS0VOX1ZBTFVFLAorfSBiY21jbGlfdG9rZW5fdHlwZTsKKworLyogUGFyYW1ldGVyIHZhbHVlIHNldCBkZXNjcmlwdG9yICovCit0eXBlZGVmIHVuaW9uIGJjbWNsaV9wYXJtX3ZhbHVlX3N0YXR1cworeworICAgIGJjbW9zX2Jvb2wgIHZhbHVlX3NldDsKKyAgICBiY21vc19ib29sICp2YWx1ZXNfc2V0OworfSBiY21jbGlfcGFybV92YWx1ZV9zdGF0dXM7CisKKy8qIENMSSBzZXNzaW9uIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9zZXNzaW9uX2RhdGEKK3sKKyAgICBiY21jbGlfZW50cnkgKmN1cmRpcjsKKyAgICBiY21jbGlfZW50cnkgKmN1cmNtZDsKKyAgICBiY21jbGlfY21kX3Bhcm0gY21kX3Bhcm1zW0JDTUNMSV9NQVhfUEFSTVNdOworICAgIGJjbWNsaV9wYXJtX3ZhbHVlX3N0YXR1cyB2YWx1ZV9zdGF0dXNbQkNNQ0xJX01BWF9QQVJNU107CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgdWludDE2X3QgbnVtX3Bhcm1zOworICAgIGNoYXIgKnBfaW5idWY7CisgICAgaW50IHN0b3BfbW9uaXRvcjsKKyAgICBjaGFyIGluYnVmW0JDTUNMSV9JTkJVRl9MRU5dOworfSBiY21jbGlfc2Vzc2lvbl9leHRyYXM7CisKKy8qIE5hbWUsIHZhbHVlIHBhaXJzICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfbmFtZV92YWx1ZQoreworICAgIGJjbWNsaV90b2tlbl90eXBlIHR5cGU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZTsKK30gYmNtY2xpX25hbWVfdmFsdWU7CisKK3N0YXRpYyBiY21jbGlfZW50cnkgICAgICAgICAgICpfYmNtY2xpX3Jvb3RfZGlyOworc3RhdGljIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAgKl9iY21jbGlfcm9vdF9zZXNzaW9uOworc3RhdGljIGJjbWNsaV9sb2dfbW9kZSAgICAgICAgIF9iY21jbGlfbG9nX21vZGU7CitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gICAgICAgICAqX2JjbWNsaV9sb2dfc2Vzc2lvbjsKKworI2RlZmluZSBCQ01DTElfTUlOX05BTUVfTEVOR1RIX0ZPUl9BTElBUyAgIDMKKyNkZWZpbmUgQkNNQ0xJX1JPT1RfTkFNRSAgICAgICAiLyIKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9hbGxvY19yb290KGNvbnN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0gKnBhcm0pOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX2RpciApOworc3RhdGljIGJjbWNsaV90b2tlbl90eXBlIF9iY21jbGlfZ2V0X3dvcmQoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICpzZXNzaW9uLCBjaGFyICoqaW5idWYsIGNoYXIgKipwX3dvcmQpOworc3RhdGljIGJjbWNsaV90b2tlbl90eXBlIF9iY21jbGlfYW5hbHl6ZV90b2tlbiggY29uc3QgY2hhciAqbmFtZSApOworc3RhdGljIGludCAgICAgICAgIF9iY21jbGlfcGFyc2VfcGFybXMoIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsIGludCBucGFpcnMpOworc3RhdGljIGludCBfYmNtY2xpX2V4dGVuZF9wYXJtcyggYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX25hbWVfdmFsdWUgKnBhaXJzLAorICAgIGludCBucGFpcnMsIGJjbW9zX2Jvb2wgbGFzdF9pc19zcGFjZSwgY2hhciAqaW5zZXJ0X3N0ciwgdWludDMyX3QgaW5zZXJ0X3NpemUpOworc3RhdGljIGJjbWNsaV9lbnRyeSAqX2JjbWNsaV9zZWFyY2hfdG9rZW4oIGJjbWNsaV9lbnRyeSAqcF9kaXIsIGNvbnN0IGNoYXIgKm5hbWUgKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2hlbHBfZGlyKCBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKnBfZGlyICk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9oZWxwX2VudHJ5KGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsIGludCBucGFpcnMsIGJjbW9zX2Jvb2wgc3VwcHJlc3NfZXJyX3ByaW50KTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2hlbHBfcG9wdWxhdGVkX2NtZChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKnBfdG9rZW4sCisgICAgY29uc3QgY2hhciAqcGFydGlhbF9tYXRjaCwgYmNtb3NfYm9vbCBzdXBwcmVzc19hc3NpZ25lZCk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9jaG9vc2VfYWxpYXMoIGJjbWNsaV9lbnRyeSAqcF9kaXIsIGJjbWNsaV9lbnRyeSAqcF9uZXdfdG9rZW4gKTsKK3N0YXRpYyBiY21jbGlfY21kX3Bhcm0gKl9iY21jbGlfZmluZF9uYW1lZF9wYXJtKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIGNoYXIgICAgICAgKl9iY21jbGlfc3RybHdyKCBjaGFyICpzICk7CitzdGF0aWMgaW50ICAgICAgICAgX2JjbWNsaV9zdHJpY21wKCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBsZW4gKTsKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2RmdF9zY2FuX2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsKTsKK3N0YXRpYyBjb25zdCBjaGFyICpfYmNtY2xpX2dldF90eXBlX25hbWUoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2RmdF9mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9lbnVtX3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfZW51bV9mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9lbnVtX21hc2tfc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9lbnVtX21hc2tfZm9ybWF0X2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsdWUsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfYnVmZmVyX3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpOworc3RhdGljIGNvbnN0IGNoYXIgKl9iY21jbGlfcXVhbGlmaWVkX25hbWUoIGJjbWNsaV9lbnRyeSAqdG9rZW4sIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfc3BsaXQoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX25hbWVfdmFsdWUgKipwYWlycywgaW50ICpucGFpcnMpOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfYXNzaWduX2NhbGxiYWNrcyhiY21jbGlfY21kX3Bhcm0gKnBhcm0pOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfbG9nX2NtZChjb25zdCBjaGFyICpjbWQpOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfbG9nX3JjKGJjbW9zX2Vycm5vIHJjKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2ZyZWVfc2Vzc2lvbl92YWx1ZV9zdGF0dXMoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbik7CisKK3N0YXRpYyBpbmxpbmUgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICpfYmNtY2xpX3Nlc3Npb25fZGF0YShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBpZiAoIXNlc3Npb24pCisgICAgICAgIHJldHVybiBfYmNtY2xpX3Jvb3Rfc2Vzc2lvbjsKKyAgICByZXR1cm4gYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKK30KKworLyoqIEFkZCBzdWJkaXJlY3RvcnkgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkKKyAqCisgKiBccGFyYW1baW5dICAgcGFyZW50ICAgICAgICAgIFBhcmVudCBkaXJlY3RvcnkgaGFuZGxlLiBOVUxMPXJvb3QKKyAqIFxwYXJhbVtpbl0gICBuYW1lICAgICAgICAgICAgRGlyZWN0b3J5IG5hbWUKKyAqIFxwYXJhbVtpbl0gICBoZWxwICAgICAgICAgICAgSGVscCBzdHJpbmcKKyAqIFxwYXJhbVtpbl0gICBhY2Nlc3NfcmlnaHQgICAgQWNjZXNzIHJpZ2h0cworICogXHBhcmFtW2luXSAgIGV4dHJhcyAgICAgICAgICBPcHRpb25hbCBkaXJlY3RvcnkgZGVzY3JpcHRvci4gTXVzdG4ndCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorICogXHJldHVybiAgICAgIG5ldyBkaXJlY3RvcnkgaGFuZGxlIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2Rpcl9hZGQoYmNtY2xpX2VudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhlbHAsIGJjbWNsaV9hY2Nlc3NfcmlnaHQgYWNjZXNzX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfZGlyX2V4dHJhX3Bhcm0gKmV4dHJhcykKK3sKKyAgICBiY21jbGlfZW50cnkgKnBfZGlyOworICAgIGJjbWNsaV9lbnRyeSAqKnBfZTsKKworICAgIGFzc2VydChuYW1lKTsKKyAgICBhc3NlcnQoaGVscCk7CisgICAgaWYgKCFuYW1lIHx8ICFoZWxwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghX2JjbWNsaV9yb290X2RpcikKKyAgICB7CisgICAgICAgIF9iY21jbGlfYWxsb2Nfcm9vdChOVUxMKTsKKyAgICAgICAgaWYgKCFfYmNtY2xpX3Jvb3RfZGlyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFwYXJlbnQpCisgICAgICAgIHBhcmVudCA9IF9iY21jbGlfcm9vdF9kaXI7CisKKyAgICBwX2Rpcj0oYmNtY2xpX2VudHJ5ICopYmNtb3NfY2FsbG9jKCBzaXplb2YoYmNtY2xpX2VudHJ5KSArIHN0cmxlbihuYW1lKSArIHN0cmxlbihoZWxwKSArIDIgKTsKKyAgICBpZiAoICFwX2RpciApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcF9kaXItPm5hbWUgPSAoY2hhciAqKShwX2RpciArIDEpOworICAgIHN0cmNweSggcF9kaXItPm5hbWUsIG5hbWUpOworICAgIHBfZGlyLT5oZWxwID0gcF9kaXItPm5hbWUgKyBzdHJsZW4obmFtZSkgKyAxOworICAgIHN0cmNweShwX2Rpci0+aGVscCwgaGVscCk7CisgICAgcF9kaXItPnNlbCA9IEJDTUNMSV9FTlRSWV9ESVI7CisgICAgX2JjbWNsaV9jaG9vc2VfYWxpYXMoIHBhcmVudCwgcF9kaXIgKTsKKyAgICBwX2Rpci0+YWNjZXNzX3JpZ2h0ID0gYWNjZXNzX3JpZ2h0OworICAgIGlmIChleHRyYXMpCisgICAgICAgIHBfZGlyLT51LmRpci5leHRyYXMgPSAqZXh0cmFzOworCisgICAgLyogQWRkIG5ldyBkaXJlY3RvcnkgdG8gdGhlIHBhcmVudCdzIGxpc3QgKi8KKyAgICBwX2Rpci0+cGFyZW50ID0gcGFyZW50OworICAgIHBfZSA9ICYocGFyZW50LT51LmRpci5maXJzdCk7CisgICAgd2hpbGUgKCpwX2UpCisgICAgICAgIHBfZSA9ICYoKCpwX2UpLT5uZXh0KTsKKyAgICAqcF9lID0gcF9kaXI7CisKKyAgICByZXR1cm4gcF9kaXI7Cit9CisKK3N0YXRpYyBiY21jbGlfZW50cnkgKiBmaW5kX2VudHJ5X2luX2RpciggYmNtY2xpX2VudHJ5ICpkaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGJjbWNsaV9lbnRyeV9zZWxlY3RvciB0eXBlLCB1aW50MTZfdCByZWN1cnNpdmVfc2VhcmNoKQoreworICAgIGJjbWNsaV9lbnRyeSAqcDEsICpwOworCisgICAgaWYgKCAhZGlyICkKKyAgICB7CisgICAgICAgIGRpciA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgICAgIGlmICghZGlyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAgPSBkaXItPnUuZGlyLmZpcnN0OworICAgIHdoaWxlIChwKQorICAgIHsKKyAgICAgICAgaWYgKCAhX2JjbWNsaV9zdHJpY21wKHAtPm5hbWUsIG5hbWUsIC0xKSAmJiB0eXBlID09IHAtPnNlbCApCisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgaWYgKCByZWN1cnNpdmVfc2VhcmNoICYmIHAtPnNlbCA9PSBCQ01DTElfRU5UUllfRElSICkKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBmaW5kX2VudHJ5X2luX2RpcihwLCBuYW1lICwgdHlwZSwgMSApOworICAgICAgICAgICAgaWYgKCBwMSApCisgICAgICAgICAgICAgICAgcmV0dXJuIHAxOworICAgICAgICB9CisgICAgICAgIHAgPSBwLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvKiBTY2FuIGRpcmVjdG9yeSB0cmVlIGFuZCBsb29rIGZvciBkaXJlY3Rvcnkgd2l0aCBuYW1lIHN0YXJ0cyBmcm9tCisgKiByb290IGRpcmVjdG9yeSB3aXRoIG5hbWUgcm9vdF9uYW1lCisgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2Rpcl9maW5kKGJjbWNsaV9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICAqbmFtZSkKK3sKKyAgICBpZiAoICFwYXJlbnQgKQorICAgICAgICBwYXJlbnQgPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgIHJldHVybiBmaW5kX2VudHJ5X2luX2RpcihwYXJlbnQsIG5hbWUsIEJDTUNMSV9FTlRSWV9ESVIsIDAgKTsKK30KKworCisvKiBTY2FuIGRpcmVjdG9yeSB0cmVlIGFuZCBsb29rIGZvciBjb21tYW5kIG5hbWVkICJuYW1lIi4gKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2NtZF9maW5kKGJjbWNsaV9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lICkKK3sKKyAgICBpZiAoICFwYXJlbnQgKQorICAgICAgICBwYXJlbnQgPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgIHJldHVybiBmaW5kX2VudHJ5X2luX2RpcihwYXJlbnQsIG5hbWUsIEJDTUNMSV9FTlRSWV9DTUQsIDAgKTsKK30KKworCisvKiogQWRkIENMSSBjb21tYW5kCisgKgorICogXHBhcmFtW2luXSAgIGRpciAgICAgICAgICAgICBIYW5kbGUgb2YgZGlyZWN0b3J5IHRvIGFkZCBjb21tYW5kIHRvLiBOVUxMPXJvb3QKKyAqIFxwYXJhbVtpbl0gICBuYW1lICAgICAgICAgICAgQ29tbWFuZCBuYW1lCisgKiBccGFyYW1baW5dICAgY21kX2NiICAgICAgICAgIENvbW1hbmQgaGFuZGxlcgorICogXHBhcmFtW2luXSAgIGhlbHAgICAgICAgICAgICBIZWxwIHN0cmluZworICogXHBhcmFtW2luXSAgIGFjY2Vzc19yaWdodCAgICBBY2Nlc3MgcmlnaHRzCisgKiBccGFyYW1baW5dICAgZXh0cmFzICAgICAgICAgIE9wdGlvbmFsIGV4dHJhcworICogXHBhcmFtW2luXSAgIHBhcm1zICAgICAgICAgICBPcHRpb25hbCBwYXJhbWV0ZXJzIGFycmF5LiBNdXN0IG5vdCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwYXJtcyE9TlVMTCwgdGhlIGxhc3QgcGFyYW1ldGVyIGluIHRoZSBhcnJheSBtdXN0IGhhdmUgbmFtZT09TlVMTC4KKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgID1PS1xuCisgKiAgICAgIDwwICA9ZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlfY21kX2FkZChiY21jbGlfZW50cnkgKmRpciwgY29uc3QgY2hhciAqbmFtZSwgYmNtY2xpX2NtZF9jYiBjbWRfY2IsCisgICAgY29uc3QgY2hhciAqaGVscCwgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3NfcmlnaHQsCisgICAgY29uc3QgYmNtY2xpX2NtZF9leHRyYV9wYXJtICpleHRyYXMsIGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbjsKKyAgICBiY21jbGlfZW50cnkgKipwX2U7CisgICAgdWludDE2X3QgICAgICAgaTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm0gPSBwYXJtczsKKworICAgIGFzc2VydChuYW1lKTsKKyAgICBhc3NlcnQoaGVscCk7CisgICAgYXNzZXJ0KGNtZF9jYik7CisgICAgaWYgKCFuYW1lIHx8ICFjbWRfY2IgfHwgIWhlbHApCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgeworICAgICAgICBfYmNtY2xpX2FsbG9jX3Jvb3QoTlVMTCk7CisgICAgICAgIGlmICghX2JjbWNsaV9yb290X2RpcikKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGlmICghZGlyKQorICAgICAgICBkaXIgPSBfYmNtY2xpX3Jvb3RfZGlyOworCisgICAgcF90b2tlbj0oYmNtY2xpX2VudHJ5ICopYmNtb3NfY2FsbG9jKCBzaXplb2YoYmNtY2xpX2VudHJ5KSArIHN0cmxlbihuYW1lKSArIHN0cmxlbihoZWxwKSArIDIgKTsKKyAgICBpZiAoICFwX3Rva2VuICkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICAvKiBDb3B5IG5hbWUgKi8KKyAgICBwX3Rva2VuLT5uYW1lID0gKGNoYXIgKikocF90b2tlbiArIDEpOworICAgIHN0cmNweSggcF90b2tlbi0+bmFtZSwgbmFtZSApOworICAgIHBfdG9rZW4tPmhlbHAgPSBwX3Rva2VuLT5uYW1lICsgc3RybGVuKG5hbWUpICsgMTsKKyAgICBzdHJjcHkocF90b2tlbi0+aGVscCwgaGVscCk7CisgICAgcF90b2tlbi0+c2VsID0gQkNNQ0xJX0VOVFJZX0NNRDsKKyAgICBwX3Rva2VuLT51LmNtZC5jbWRfY2IgPSBjbWRfY2I7CisgICAgcF90b2tlbi0+dS5jbWQucGFybXMgPSBwYXJtczsKKyAgICBpZiAoZXh0cmFzKQorICAgICAgICBwX3Rva2VuLT51LmNtZC5leHRyYXMgPSAqZXh0cmFzOworICAgIHBfdG9rZW4tPmFjY2Vzc19yaWdodCA9IGFjY2Vzc19yaWdodDsKKworICAgIC8qIENvbnZlcnQgbmFtZSB0byBsb3dlciBjYXNlIGFuZCBjaG9vc2UgYWxpYXMgKi8KKyAgICBfYmNtY2xpX2Nob29zZV9hbGlhcyhkaXIsIHBfdG9rZW4gKTsKKworCisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01DTElfTUFYX1BBUk1TICYmIHBhcm1zICYmIHBhcm1zW2ldLm5hbWU7IGkrKykKKyAgICB7CisgICAgICAgIHBhcm0gPSAmcGFybXNbaV07CisgICAgICAgIC8qIFVzZXItZGVmaW5lZCBwYXJhbWV0ZXIgbXVzdCBoYXZlIGEgc2Nhbl9jYiBjYWxsYmFjayBmb3IgdGV4dC0+dmFsdWUgY29udmVyc2lvbiAqLworICAgICAgICBpZiAoKHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX1VTRVJERUYpICYmICFwYXJtLT5zY2FuX2NiKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wcmludGYoIk1PTjogJXM+IHNjYW5fY2IgY2FsbGJhY2sgbXVzdCBiZSBzZXQgZm9yIHVzZXItZGVmaW5lZCBwYXJhbWV0ZXIgJXNcbiIsIG5hbWUsIHBhcm0tPm5hbWUpOworICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJtLT50eXBlPT1CQ01DTElfUEFSTV9FTlVNIHx8IHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX0VOVU1fTUFTSykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwYXJtLT5lbnVtX3RhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gdmFsdWUgdGFibGUgbXVzdCBiZSBzZXQgaW4gbG93X3ZhbCBmb3IgZW51bSBwYXJhbWV0ZXIgJXNcbiIsIG5hbWUsIHBhcm0tPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gY21kX2FkZF9lcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgZGVmYXVsdCB2YWx1ZSBpZiBhbnkgKi8KKyAgICAgICAgICAgIGlmICgocGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9iY21jbGlfZW51bV9tYXNrX3NjYW5fY2IocGFybSwgJnBhcm0tPnZhbHVlLCBwYXJtLT52YWx1ZS5zdHJpbmcpIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gZGVmYXVsdCB2YWx1ZSAlcyBkb2Vzbid0IG1hdGNoIGFueSB2YWx1ZSBvZiBlbnVtIHBhcmFtZXRlciAlc1xuIiwgbmFtZSwgcGFybS0+dmFsdWUuc3RyaW5nLCBwYXJtLT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChwYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE9wdGlvbmFsIGVudW0gcGFyYW1ldGVycyBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlaXIgMXN0IHZhbHVlIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICogQWxsIG90aGVyIHBhcmFtZXRlcnMgYXJlIGluaXRpYWxpemVkIHRvIDAuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM9cGFybS0+ZW51bV90YWJsZTsKKyAgICAgICAgICAgICAgICBwYXJtLT52YWx1ZS5lbnVtX3ZhbCA9IHZhbHVlc1swXS52YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEFsbCB2YWx1ZXMgb2YgZW51bSBtYXNrIHBhcmFtZXRlcnMgbWFzdCBiZSBjb21wbGVtZW50YXJ5IGJpdHMgKi8KKyAgICAgICAgICAgIGlmIChwYXJtLT50eXBlPT1CQ01DTElfUEFSTV9FTlVNX01BU0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBhbGxfbWFzayA9IDA7CisgICAgICAgICAgICAgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM7CisgICAgICAgICAgICAgICAgZm9yICh2YWx1ZXM9cGFybS0+ZW51bV90YWJsZTsgdmFsdWVzLT5uYW1lOyArK3ZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgYWxsX21hc2sgfD0gdmFsdWVzLT52YWw7CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOyB2YWx1ZXMtPm5hbWU7ICsrdmFsdWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhbGxfbWFzayAmIHZhbHVlcy0+dmFsKSAhPSB2YWx1ZXMtPnZhbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiBlbnVtX3RhYmxlIHZhbHVlcyBvZiBlbnVtX21hc2sgcGFyYW1ldGVycyBtdXN0IGJlIGNvbXBsZW1lbnRhcnkgYml0c1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNtZF9hZGRfZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWxsX21hc2sgJj0gfnZhbHVlcy0+dmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwYXJtLT50eXBlPT1CQ01DTElfUEFSTV9CVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghcGFybS0+dmFsdWUuYnVmZmVyLnN0YXJ0IHx8ICFwYXJtLT52YWx1ZS5idWZmZXIubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gdmFsdWUuYnVmZmVyLnN0YXJ0IGlzIG5vdCBzZXQgZm9yIEJVRkZFUiBwYXJhbWV0ZXIgJXNcbiIsIG5hbWUsIHBhcm0tPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gY21kX2FkZF9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJtLT5tYXhfYXJyYXlfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19wcmludGYoIk1PTjogJXM+IEJVRkZFUiBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgJXNcbiIsIG5hbWUsIHBhcm0tPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gY21kX2FkZF9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGFybS0+bWF4X2FycmF5X3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghcGFybS0+dmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gcGFybS0+dmFsdWVzIG11c3QgYmUgc2V0IGZvciBwYXJhbWV0ZXItYXJyYXkgJXNcbiIsIG5hbWUsIHBhcm0tPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gY21kX2FkZF9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfYmNtY2xpX2Fzc2lnbl9jYWxsYmFja3MocGFybSk7CisgICAgfQorICAgIGlmICgoaSA9PSBCQ01DTElfTUFYX1BBUk1TKSAmJiBwYXJtc1tpXS5uYW1lWzBdKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiB0b28gbWFueSBwYXJhbWV0ZXJzXG4iLCBuYW1lKTsKKyAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgIH0KKyAgICBwX3Rva2VuLT51LmNtZC5udW1fcGFybXMgPSBpOworCisgICAgLyogQWRkIHRva2VuIHRvIHRoZSBkaXJlY3RvcnkgKi8KKyAgICBwX3Rva2VuLT5wYXJlbnQgPSBkaXI7CisgICAgcF9lID0gJihkaXItPnUuZGlyLmZpcnN0KTsKKyAgICB3aGlsZSAoKnBfZSkKKyAgICAgICAgcF9lID0gJigoKnBfZSktPm5leHQpOworICAgICpwX2UgPSBwX3Rva2VuOworCisgICAgcmV0dXJuIDA7CisKK2NtZF9hZGRfZXJyb3I6CisgICAgYmNtb3NfZnJlZSggcF90b2tlbiApOworICAgIHJldHVybiBCQ01fRVJSX1BBUk07Cit9CisKKworLyoqIERlc3Ryb3kgdG9rZW4gKGNvbW1hbmQgb3IgZGlyZWN0b3J5KQorICogXHBhcmFtW2luXSAgIHRva2VuICAgICAgICAgICBEaXJlY3Rvcnkgb3IgY29tbWFuZCB0b2tlbi4gTlVMTD1yb290CisgKi8KK3ZvaWQgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koYmNtY2xpX2VudHJ5ICp0b2tlbikKK3sKKyAgICBpZiAoIXRva2VuKQorICAgIHsKKyAgICAgICAgaWYgKCFfYmNtY2xpX3Jvb3RfZGlyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0b2tlbiA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgfQorICAgIC8qIFJlbW92ZSBmcm9tIHBhcmVudCdzIGxpc3QgKi8KKyAgICBpZiAodG9rZW4tPnBhcmVudCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9lbnRyeSAqKnBfZTsKKyAgICAgICAgcF9lID0gJih0b2tlbi0+cGFyZW50LT51LmRpci5maXJzdCk7CisgICAgICAgIHdoaWxlICgqcF9lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKnBfZSA9PSB0b2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcF9lID0gdG9rZW4tPm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2UgPSAmKCgqcF9lKS0+bmV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZW1vdmUgYWxsIGRpcmVjdG9yeSBlbnRyaWVzICovCisgICAgaWYgKHRva2VuLT5zZWwgPT0gQkNNQ0xJX0VOVFJZX0RJUikKKyAgICB7CisgICAgICAgIGJjbWNsaV9lbnRyeSAqZSA9IHRva2VuLT51LmRpci5maXJzdDsKKyAgICAgICAgd2hpbGUgKChlID0gdG9rZW4tPnUuZGlyLmZpcnN0KSkKKyAgICAgICAgICAgIGJjbWNsaV90b2tlbl9kZXN0cm95KGUpOworICAgIH0KKyAgICBlbHNlIGlmICh0b2tlbi0+dS5jbWQuZXh0cmFzLmZyZWVfcGFybXMpCisgICAgICAgICAgICB0b2tlbi0+dS5jbWQuZXh0cmFzLmZyZWVfcGFybXModG9rZW4tPnUuY21kLnBhcm1zKTsKKworICAgIC8qIFJlbGVhc2UgdGhlIHRva2VuICovCisgICAgYmNtb3NfZnJlZSh0b2tlbik7CisKKyAgICBpZiAodG9rZW4gPT0gX2JjbWNsaV9yb290X2RpcikKKyAgICB7CisgICAgICAgIF9iY21jbGlfcm9vdF9kaXIgPSBOVUxMOworICAgICAgICBpZiAoX2JjbWNsaV9yb290X3Nlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKF9iY21jbGlfcm9vdF9zZXNzaW9uLT5zZXNzaW9uKTsKKyAgICAgICAgICAgIF9iY21jbGlfcm9vdF9zZXNzaW9uID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqIE9wZW4gbW9uaXRvciBzZXNzaW9uCisgKgorICogTW9uaXRvciBzdXBwb3J0cyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgc2Vzc2lvbnMgd2l0aCBkaWZmZXJlbnQKKyAqIGFjY2VzcyByaWdodHMuCisgKiBOb3RlIHRoYXQgdGhlcmUgYWxyZWFkeSBpcyBhIGRlZmF1bHQgc2Vzc2lvbiB3aXRoIGZ1bGwgYWRtaW5pc3RyYXRpdmUgcmlnaHRzLAorICogdGhhdCB0YWtlcyBpbnB1dCBmcm9tIHN0ZGluIGFuZCBvdXRwdXRzIHRvIHN0ZG91dC4KKyAqIFxwYXJhbVtpbl0gICBwYXJtICAgICAgICBTZXNzaW9uIHBhcmFtZXRlcnMuIE11c3Qgbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKiBccGFyYW1bb3V0XSAgcF9zZXNzaW9uICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgID1PS1xuCisgKiAgICAgIDwwICA9ZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlfc2Vzc2lvbl9vcGVuKGNvbnN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0gKnBhcm0sIGJjbWNsaV9zZXNzaW9uICoqcF9zZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb247CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBzZXNzaW9uX3Bhcm1zOworICAgIGludCByYzsKKworICAgIGFzc2VydChwX3Nlc3Npb24pOworICAgIGlmICghcF9zZXNzaW9uKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKCFfYmNtY2xpX3Jvb3RfZGlyKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9hbGxvY19yb290KHBhcm0pOworICAgICAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgaWYgKHBhcm0pCisgICAgICAgIHNlc3Npb25fcGFybXMgPSAqcGFybTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1zZXQoJnNlc3Npb25fcGFybXMsIDAsIHNpemVvZihzZXNzaW9uX3Bhcm1zKSk7CisgICAgICAgIHNlc3Npb25fcGFybXMubmFtZSA9ICJ1bm5hbWVkIjsKKyAgICB9CisKKyAgICAvKiBPcGVuIGNvbW0gc2Vzc2lvbiAqLworICAgIHNlc3Npb25fcGFybXMuZXh0cmFfc2l6ZSA9IHNpemVvZihiY21jbGlfc2Vzc2lvbl9leHRyYXMpOworICAgIHJjID0gYmNtY2xpX3Nlc3Npb25fb3Blbl91c2VyKCZzZXNzaW9uX3Bhcm1zLCAmc2Vzc2lvbik7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisgICAgbW9uX3Nlc3Npb24gPSBfYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBtb25fc2Vzc2lvbi0+Y3VyZGlyID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICBtb25fc2Vzc2lvbi0+c2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICAqcF9zZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEJDTUNMSV9QQVJTRV9SRVRVUk4ocmV0KSBcCisgICAgZG8geyBcCisgICAgICAgIHJjID0gcmV0OyAgIFwKKyAgICAgICAgZ290byBiY21jbGlfcGFyc2Vfb3V0OyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUGFyc2UgYSBzaW5nbGUgY29tbWFuZC4gU3RvcCBvbiAnOycgb3IgRU9MICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtY2xpX3BhcnNlX2NvbW1hbmQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBiY21jbGlfZW50cnkgICpwX3Rva2VuOworICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycyA9IE5VTEw7CisgICAgaW50IHN0b3BfcGFyc2luZyA9IDA7CisgICAgaW50IG5wYWlyczsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpjbWRfbGluZTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBzZXNzaW9uID0gbW9uX3Nlc3Npb24tPnNlc3Npb247CisKKyAgICAvKiBNYWtlIGEgY29weSBvZiBjb21tYW5kIGxpbmUgLSBmb3IgbG9nZ2luZyAqLworICAgIGNtZF9saW5lID0gYmNtb3NfYWxsb2Moc3RybGVuKG1vbl9zZXNzaW9uLT5wX2luYnVmKSArIDEpOworICAgIGlmICghY21kX2xpbmUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIHN0cmNweShjbWRfbGluZSwgbW9uX3Nlc3Npb24tPnBfaW5idWYpOworCisgICAgLyogU3BsaXQgc3RyaW5nIHRvIG5hbWUvdmFsdWUgcGFpcnMgKi8KKyAgICByYyA9IF9iY21jbGlfc3BsaXQobW9uX3Nlc3Npb24sICZwYWlycywgJm5wYWlycyk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfTk9FTlQpCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfT0s7CisgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4ocmMpOworICAgIH0KKworICAgIC8qIEludGVycHJldCBlbXB0eSBzdHJpbmcgYXMgImRpc3BsYXkgZGlyZWN0b3J5IiAqLworICAgIGlmICggIW5wYWlycyApCisgICAgeworICAgICAgICBfYmNtY2xpX2Rpc3BsYXlfZGlyKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyZGlyICk7CisgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9PSyk7CisgICAgfQorCisgICAgLyogSWRlbnRpZnkgcGFyYW1ldGVycyAqLworICAgIGZvciAoaT0wOyBpPG5wYWlycyAmJiAhcmMgJiYgIXN0b3BfcGFyc2luZzsgaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwYWlyc1tpXS50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX05BTUU6CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1ZBTFVFOgorICAgICAgICAgICAgLyogSWRlbnRpZnkgY29tbWFuZC4gVGhlIDFzdCBwYWlyIGNhbid0IGNvbnRhaW4gbmFtZSwgb25seSB2YWx1ZSAqLworICAgICAgICAgICAgaWYgKHBhaXJzW2ldLm5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIioqRVJSOiAlcyBpcyB1bmV4cGVjdGVkXG4iLCBwYWlyc1tpXS5uYW1lKTsKKyAgICAgICAgICAgICAgICBCQ01DTElfUEFSU0VfUkVUVVJOKEJDTV9FUlJfUEFSTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX3Rva2VuID0gX2JjbWNsaV9zZWFyY2hfdG9rZW4obW9uX3Nlc3Npb24tPmN1cmRpciwgcGFpcnNbaV0udmFsdWUpOworICAgICAgICAgICAgaWYgKHBfdG9rZW4gPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiKipFUlI6ICVzIGlzIHVuZXhwZWN0ZWRcbiIsIHBhaXJzW2ldLnZhbHVlKTsKKyAgICAgICAgICAgICAgICBCQ01DTElfUEFSU0VfUkVUVVJOKEJDTV9FUlJfUEFSTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBEaXJlY3Rvcnkgb3IgY29tbWFuZCA/ICovCisgICAgICAgICAgICBpZiAocF90b2tlbi0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb24tPmN1cmRpciA9IHBfdG9rZW47CisgICAgICAgICAgICAgICAgX2JjbWNsaV9kaXNwbGF5X2Rpcihtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmRpciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIHRva2VuICovCisgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb24tPmN1cmNtZCA9IHBfdG9rZW47CisgICAgICAgICAgICAgICAgaWYgKF9iY21jbGlfcGFyc2VfcGFybXMobW9uX3Nlc3Npb24sIHBfdG9rZW4sICZwYWlyc1tpKzFdLCBucGFpcnMtaS0xKSA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfYmNtY2xpX2hlbHBfZW50cnkobW9uX3Nlc3Npb24sIHBfdG9rZW4sICZwYWlyc1tpKzFdLCBucGFpcnMtaS0xLCBCQ01PU19UUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9iY21jbGlfbG9nX2NtZChjbWRfbGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gcF90b2tlbi0+dS5jbWQuY21kX2NiKHNlc3Npb24sIG1vbl9zZXNzaW9uLT5jbWRfcGFybXMsIG5wYWlycy1pLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlcltCQ01DTElfTUFYX1FVQUxfTkFNRV9MRU5HVEhdOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk1PTjogJXM+IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJXMoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iY21jbGlfcXVhbGlmaWVkX25hbWUocF90b2tlbiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9iY21jbGlfbG9nX3JjKHJjKTsKKyAgICAgICAgICAgICAgICAgICAgX2JjbWNsaV9mcmVlX3Nlc3Npb25fdmFsdWVfc3RhdHVzKG1vbl9zZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcF9wYXJzaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1VQOiAvKiBHbyB0byB1cHBlciBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGlmIChtb25fc2Vzc2lvbi0+Y3VyZGlyLT5wYXJlbnQpCisgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb24tPmN1cmRpciA9IG1vbl9zZXNzaW9uLT5jdXJkaXItPnBhcmVudDsKKyAgICAgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1JPT1Q6IC8qIEdvIHRvIHRoZSByb290IGRpcmVjdG9yeSAqLworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPmN1cmRpciA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgICAgICAgICBfYmNtY2xpX2Rpc3BsYXlfZGlyKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyZGlyICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTUNMSV9UT0tFTl9IRUxQOiAvKiBEaXNwbGF5IGhlbHAgKi8KKyAgICAgICAgICAgIGlmIChpIDwgbnBhaXJzLTEgJiYKKyAgICAgICAgICAgICAgICAoKHBfdG9rZW4gPSBfYmNtY2xpX3NlYXJjaF90b2tlbiggbW9uX3Nlc3Npb24tPmN1cmRpciwgcGFpcnNbaSsxXS52YWx1ZSkpICE9IE5VTEwgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYmNtY2xpX2hlbHBfZW50cnkobW9uX3Nlc3Npb24sIHBfdG9rZW4sICZwYWlyc1tpKzJdLCBucGFpcnMtaS0yLCBCQ01PU19GQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2JjbWNsaV9oZWxwX2Rpcihtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmRpcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9wX3BhcnNpbmcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0b3BfcGFyc2luZyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworYmNtY2xpX3BhcnNlX291dDoKKyAgICBpZiAocGFpcnMpCisgICAgICAgIGJjbW9zX2ZyZWUocGFpcnMpOworICAgIGlmIChjbWRfbGluZSkKKyAgICAgICAgYmNtb3NfZnJlZShjbWRfbGluZSk7CisgICAgcmV0dXJuIHJjOworCit9CisKKy8qKiBDb250ZXh0IGV4dGVuc2lvbiAqLworYmNtb3NfZXJybm8gYmNtY2xpX2V4dGVuZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqaW5wdXRfc3RyLCBjaGFyICppbnNlcnRfc3RyLCB1aW50MzJfdCBpbnNlcnRfc2l6ZSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGJjbWNsaV9lbnRyeSAgKnBfdG9rZW47CisgICAgYmNtY2xpX25hbWVfdmFsdWUgKnBhaXJzOworICAgIGJjbW9zX2Jvb2wgbGFzdF9pc19zcGFjZTsKKyAgICBpbnQgbnBhaXJzOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghbW9uX3Nlc3Npb24gfHwgIW1vbl9zZXNzaW9uLT5jdXJkaXIgfHwgIWlucHV0X3N0cikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGluc2VydF9zdHJbMF0gPSAwOworICAgIG1vbl9zZXNzaW9uLT5wX2luYnVmID0gaW5wdXRfc3RyOworCisgICAgbGFzdF9pc19zcGFjZSA9IHN0cmxlbihpbnB1dF9zdHIpICYmIChpbnB1dF9zdHJbc3RybGVuKGlucHV0X3N0cikgLSAxXSA9PSAnICcpOworCisgICAgLyogU3BsaXQgc3RyaW5nIHRvIG5hbWUvdmFsdWUgcGFpcnMgKi8KKyAgICByYyA9IF9iY21jbGlfc3BsaXQobW9uX3Nlc3Npb24sICZwYWlycywgJm5wYWlycyk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICAvKiBlbXB0eSBsaXN0IC0gZGlzcGxheSBsaXN0IG9mIGNvbW1hbmRzICovCisgICAgaWYgKCAhbnBhaXJzICkKKyAgICB7CisgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgQkNNQ0xJX1BBUlNFX1JFVFVSTigwKTsKKyAgICB9CisKKyAgICAvKiBJZGVudGlmeSBwYXJhbWV0ZXJzICovCisgICAgc3dpdGNoIChwYWlyc1swXS50eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTUNMSV9UT0tFTl9OQU1FOgorICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1ZBTFVFOgorICAgICAgICAvKiBJZGVudGlmeSBjb21tYW5kLiBUaGUgMXN0IHBhaXIgY2FuJ3QgY29udGFpbiBuYW1lLCBvbmx5IHZhbHVlICovCisgICAgICAgIGlmIChwYWlyc1swXS5uYW1lIHx8CisgICAgICAgICAgICAhKHBfdG9rZW4gPSBfYmNtY2xpX3NlYXJjaF90b2tlbihtb25fc2Vzc2lvbi0+Y3VyZGlyLCBwYWlyc1swXS52YWx1ZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBfYmNtY2xpX2Rpc3BsYXlfZGlyKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyZGlyICk7CisgICAgICAgICAgICBCQ01DTElfUEFSU0VfUkVUVVJOKEJDTV9FUlJfUEFSTSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBEaXJlY3Rvcnkgb3IgY29tbWFuZCA/ICovCisgICAgICAgIGlmIChwX3Rva2VuLT5zZWwgIT0gQkNNQ0xJX0VOVFJZX0NNRCkKKyAgICAgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9PSyk7CisKKyAgICAgICAgLyogRnVuY3Rpb24gdG9rZW4gKi8KKyAgICAgICAgbW9uX3Nlc3Npb24tPmN1cmNtZCA9IHBfdG9rZW47CisgICAgICAgIHJjID0gX2JjbWNsaV9leHRlbmRfcGFybXMobW9uX3Nlc3Npb24sICZwYWlyc1sxXSwgbnBhaXJzLTEsIGxhc3RfaXNfc3BhY2UsIGluc2VydF9zdHIsIGluc2VydF9zaXplKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKK2JjbWNsaV9wYXJzZV9vdXQ6CisgICAgYmNtb3NfZnJlZShwYWlycyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiogUGFyc2UgYW5kIGV4ZWN1dGUgaW5wdXQgc3RyaW5nLgorICogaW5wdXRfc3RyaW5nIGNhbiBjb250YWluIG11bHRpcGxlIGNvbW1hbmRzIGRlbGltaXRlZCBieSAnOycKKyAqCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgaW5wdXRfc3RyaW5nICAgIFN0cmluZyB0byBiZSBwYXJzZWQuIE1heSBjb25zaXN0IG9mIG11bHRpcGxlICc7Jy1kZWxpbWl0ZWQgY29tbWFuZHMKKyAqIFxyZXR1cm4KKyAqICAgICAgPTAgIC0gT0sgXG4KKyAqICAgICAgQkNNX0VSUl9QQVJNIC0gcGFyc2luZyBlcnJvclxuCisgKiAgICAgIG90aGVyIC0gcmV0dXJuIGNvZGUgLSBhcyByZXR1cm5lZCBmcm9tIGNvbW1hbmQgaGFuZGxlci4KKyAqICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gcmV0dXJuIC1FSU5UUiB0byBpbnRlcnJ1cHQgbW9uaXRvciBsb29wLgorICovCitiY21vc19lcnJubyBiY21jbGlfcGFyc2UoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIqIGlucHV0X3N0cmluZykKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIHVpbnQzMl90IGlucHV0X2xlbjsKKyAgICBpbnQgcmMgPSAwOworCisgICAgaWYgKCFtb25fc2Vzc2lvbiB8fCAhbW9uX3Nlc3Npb24tPmN1cmRpciB8fCAhaW5wdXRfc3RyaW5nKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlucHV0X2xlbiA9IHN0cmxlbihpbnB1dF9zdHJpbmcpOworICAgIGlmICghaW5wdXRfbGVuKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGN1dCBDUiwgTEYgaWYgYW55ICovCisgICAgd2hpbGUgKGlucHV0X2xlbiAmJiAoaW5wdXRfc3RyaW5nW2lucHV0X2xlbi0xXT09J1xuJyB8fCBpbnB1dF9zdHJpbmdbaW5wdXRfbGVuLTFdPT0nXHInKSkKKyAgICAgICAgaW5wdXRfc3RyaW5nWy0taW5wdXRfbGVuXT0wOworCisgICAgbW9uX3Nlc3Npb24tPnBfaW5idWYgPSBpbnB1dF9zdHJpbmc7CisgICAgbW9uX3Nlc3Npb24tPnN0b3BfbW9uaXRvciA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIHJjID0gYmNtY2xpX3BhcnNlX2NvbW1hbmQoc2Vzc2lvbik7CisgICAgfSB3aGlsZSAobW9uX3Nlc3Npb24tPnBfaW5idWYgJiYgbW9uX3Nlc3Npb24tPnBfaW5idWZbMF0gJiYgIW1vbl9zZXNzaW9uLT5zdG9wX21vbml0b3IgJiYgIXJjKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqIFJlYWQgaW5wdXQgYW5kIHBhcnNlIGl0ZXJhdGl2ZWx5IHVudGlsIEVPRiBvciBiY21jbGlfaXNfc3RvcHBlZCgpCisgKgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICovCitiY21vc19lcnJubyBiY21jbGlfZHJpdmVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisKKyAgICBzZXNzaW9uID0gbW9uX3Nlc3Npb24tPnNlc3Npb247CisgICAgbW9uX3Nlc3Npb24tPnN0b3BfbW9uaXRvciA9IDA7CisgICAgd2hpbGUgKCFiY21jbGlfaXNfc3RvcHBlZChzZXNzaW9uKSAmJgorICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX2dldHMoc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmluYnVmLCBzaXplb2YobW9uX3Nlc3Npb24tPmluYnVmKS0xKSkKKyAgICB7CisgICAgICAgIC8qIFNlc3Npb24gY291bGQndmUgYmVlbiBzdG9wcGVkIHdoaWxlIGluICJnZXRzIi4gQ2hlY2sgYWdhaW4gYW5kIHByb2NlZWQgaWYgYWN0aXZlICovCisgICAgICAgIGlmICghYmNtY2xpX2lzX3N0b3BwZWQoc2Vzc2lvbikpCisgICAgICAgICAgICBiY21jbGlfcGFyc2Uoc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmluYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKiBTdG9wIG1vbml0b3IgZHJpdmVyICovCit2b2lkIGJjbWNsaV9zdG9wKCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiApCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBhc3NlcnQobW9uX3Nlc3Npb24pOworICAgIG1vbl9zZXNzaW9uLT5zdG9wX21vbml0b3IgPSAxOworfQorCisvKiogUmV0dXJucyAxIGlmIG1vbml0b3Igc2Vzc2lvbiBpcyBzdG9wcGVkCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJucyAxIGlmIG1vbml0b3Igc2Vzc2lvbiBzdG9wcGVkIGJ5IGJjbWNsaV9zdG9wKClcbgorICogMCBvdGhlcndpc2UKKyAqLworYmNtb3NfYm9vbCBiY21jbGlfaXNfc3RvcHBlZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIHJldHVybiBtb25fc2Vzc2lvbi0+c3RvcF9tb25pdG9yOworfQorCisKKy8qKiBHZXQgcGFyYW1ldGVyIG51bWJlciBnaXZlbiBpdHMgbmFtZS4KKyAqIFRoZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNvbW1hbmQgaGFuZGxlcnMKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW4sb3V0XSAgIHBhcm1fbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHJldHVybgorICogID49MCAtIHBhcmFtZXRlciBudW1iZXJcbgorICogIDwwICAtIHBhcmFtZXRlciB3aXRoIHRoaXMgbmFtZSBkb2Vzbid0IGV4aXN0CisgKi8KK2ludCBiY21jbGlfcGFybV9udW1iZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnBhcm1fbmFtZSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGludCBpOworICAgIGlmICghcGFybV9uYW1lIHx8ICFtb25fc2Vzc2lvbiB8fCAhbW9uX3Nlc3Npb24tPmN1cmNtZCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBmb3IoaT0wOworICAgICAgICBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldLm5hbWUgJiYKKyAgICAgICAgICAgIF9iY21jbGlfc3RyaWNtcCggcGFybV9uYW1lLCBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldLm5hbWUsIC0xKTsKKyAgICAgICAgaSsrKQorICAgICAgICA7CisgICAgaWYgKCFtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldLm5hbWUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgcmV0dXJuIGk7Cit9CisKKworLyoqIEdldCBwYXJhbWV0ZXIgYnkgbmFtZQorICogVGhlIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgY29tbWFuZCBoYW5kbGVycworICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybV9uYW1lICAgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccmV0dXJuCisgKiBwYXJhbWV0ZXIgcG9pbnRlciBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitiY21jbGlfY21kX3Bhcm0gKmJjbWNsaV9wYXJtX2dldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFybV9uYW1lKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgaW50IG5wYXJtID0gYmNtY2xpX3Bhcm1fbnVtYmVyKHNlc3Npb24sIHBhcm1fbmFtZSk7CisgICAgaWYgKG5wYXJtIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gJm1vbl9zZXNzaW9uLT5jbWRfcGFybXNbbnBhcm1dOworfQorCisKKy8qKiBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgc2V0CisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX251bWJlciAgICAgUGFyYW1ldGVyIG51bWJlcgorICogXHJldHVybgorICogIDEgaWYgcGFyYW1ldGVyIGlzIHNldFxuCisgKiAgMCBpZiBwYXJhbWV0ZXIgaXMgbm90IHNldCBvciBwYXJtX251bWJlciBpcyBpbnZhbGlkCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9wYXJtX2NoZWNrKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBpbnQgcGFybV9udW1iZXIpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKworICAgIGlmIChwYXJtX251bWJlciA8IDAgfHwgIW1vbl9zZXNzaW9uIHx8ICFtb25fc2Vzc2lvbi0+Y3VyY21kKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmIChwYXJtX251bWJlciA+PSBtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmICghKG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbcGFybV9udW1iZXJdLmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qKiBHZXQgZW51bSdzIHN0cmluZyB2YWx1ZSBnaXZlbiBpdHMgaW50ZXJuYWwgdmFsdWUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbnVtYmVyICAgICBQYXJhbWV0ZXIgbnVtYmVyCisgKiBccGFyYW1baW5dICAgICAgIHZhbHVlICAgICAgICAgICBJbnRlcm5hbCB2YWx1ZQorICogXHJldHVybgorICogICAgICBlbnVtIHN0cmluZyB2YWx1ZSBvciBOVUxMIGlmIHBhcmFtZXRlciBpcyBub3QgZW51bSBvcgorICogICAgICBpbnRlcm5hbCB2YWx1ZSBpcyBpbnZhbGlkCisgKi8KK2NvbnN0IGNoYXIgKmJjbWNsaV9lbnVtX3Bhcm1fc3RyaW5ndmFsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBpbnQgcGFybV9udW1iZXIsIGxvbmcgdmFsdWUpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBpbnQgaTsKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlczsKKyAgICBpZiAocGFybV9udW1iZXIgPCAwIHx8ICFtb25fc2Vzc2lvbiB8fCAhbW9uX3Nlc3Npb24tPmN1cmNtZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yKGk9MDsgaTxwYXJtX251bWJlciAmJiBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldLm5hbWU7IGkrKykKKyAgICAgICAgOworICAgIGlmIChpIDwgcGFybV9udW1iZXIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW3Bhcm1fbnVtYmVyXS50eXBlICE9IEJDTUNMSV9QQVJNX0VOVU0pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZhbHVlcyA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbcGFybV9udW1iZXJdLmVudW1fdGFibGU7CisgICAgcmV0dXJuIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbCh2YWx1ZXMsIHZhbHVlKTsKK30KKworCisvKiBHZXQgY3VycmVudCBkaXJlY3RvcnkgaGFuZGxlICovCitiY21jbGlfZW50cnkgKmJjbWNsaV9kaXJfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgaWYgKCFtb25fc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG1vbl9zZXNzaW9uLT5jdXJkaXI7Cit9CisKKy8qIFNldCBjdXJyZW50IGRpcmVjdG9yeSAqLworYmNtb3NfZXJybm8gYmNtY2xpX2Rpcl9zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWNsaV9lbnRyeSAqZGlyKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgYXNzZXJ0KG1vbl9zZXNzaW9uKTsKKyAgICBpZiAoIW1vbl9zZXNzaW9uKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIC8qIENoZWNrIGFjY2VzcyByaWdodHMgKi8KKyAgICBpZiAoIWRpcikKKyAgICAgICAgZGlyID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICBpZiAoZGlyLT5hY2Nlc3NfcmlnaHQgPiBiY21jbGlfc2Vzc2lvbl9hY2Nlc3NfcmlnaHQobW9uX3Nlc3Npb24tPnNlc3Npb24pKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QRVJNOworICAgIG1vbl9zZXNzaW9uLT5jdXJkaXIgPSBkaXI7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBHZXQgdG9rZW4gbmFtZQorICogXHBhcmFtW2luXSAgIHRva2VuICAgICAgICAgICBEaXJlY3Rvcnkgb3IgY29tbWFuZCB0b2tlbgorICogXHJldHVybiAgICAgIGRpcmVjdG9yeSB0b2tlbiBuYW1lCisgKi8KK2NvbnN0IGNoYXIgKmJjbWNsaV90b2tlbl9uYW1lKGJjbWNsaV9lbnRyeSAqdG9rZW4pCit7CisgICAgaWYgKCF0b2tlbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRva2VuLT5uYW1lOworfQorCitiY21jbGlfY21kX3Bhcm0gKmJjbWNsaV9maW5kX25hbWVkX3Bhcm0oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICogY21kX3Bhcm07CisKKyAgICBpZiAoICFzZXNzaW9uIHx8ICFuYW1lIHx8ICpuYW1lPT0nXDAnKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNtZF9wYXJtID0gX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0oX2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbiksIG5hbWUpOworICAgIGlmKGNtZF9wYXJtICYmIChjbWRfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICB7CisgICAgICAgIHJldHVybiBjbWRfcGFybTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIFRSVUUgaWYgcGFyYW1ldGVyIHZhbHVlIGlzIHNldCAqLworYmNtb3NfYm9vbCBiY21jbGlfcGFybV92YWx1ZV9pc19zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWNsaV9jbWRfcGFybSAqcGFybSwgdWludDMyX3QgdmFsdWVfaW5kZXgpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICB1aW50MzJfdCBwYXJtX2luZGV4ID0gcGFybSAtIG1vbl9zZXNzaW9uLT5jbWRfcGFybXM7CisKKyAgICBpZiAoIW1vbl9zZXNzaW9uKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KE5VTEwsICJNT04+IFNlc3Npb24gJXAgaXMgaW52YWxpZFxuIiwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwYXJtX2luZGV4ID0gcGFybSAtIG1vbl9zZXNzaW9uLT5jbWRfcGFybXM7CisgICAgaWYgKHBhcm1faW5kZXggPj0gQkNNQ0xJX01BWF9QQVJNUykKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiTU9OPiBQYXJhbWV0ZXIgJXAgaXMgaW52YWxpZFxuIiwgcGFybSk7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIXBhcm0tPmFycmF5X3NpemUpCisgICAgICAgIHJldHVybiBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW3Bhcm1faW5kZXhdLnZhbHVlX3NldDsKKworICAgIGlmICh2YWx1ZV9pbmRleCA+PSBwYXJtLT5hcnJheV9zaXplKQorICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisKKyAgICByZXR1cm4gbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1twYXJtX2luZGV4XS52YWx1ZXNfc2V0W3ZhbHVlX2luZGV4XTsKK30KKworYmNtY2xpX2NtZF9wYXJtICpiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqcHJlZml4KQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm07CisKKyAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMIHx8IHByZWZpeCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY21kX3Bhcm0gPSBfYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKS0+Y21kX3Bhcm1zOworICAgIHdoaWxlIChjbWRfcGFybS0+bmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKChfYmNtY2xpX3N0cmljbXAocHJlZml4LCBjbWRfcGFybS0+bmFtZSwgc3RybGVuKHByZWZpeCkpID09IDApICYmCisgICAgICAgICAgICAoKGNtZF9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY21kX3Bhcm07CisgICAgICAgIH0KKyAgICAgICAgKytjbWRfcGFybTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIFByaW50IENMSSBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm0gICAgICAgICAgICBQYXJhbWV0ZXIKKyAqLwordm9pZCBiY21jbGlfcGFybV9wcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtKQoreworICAgIGNoYXIgYnVmW0JDTUNMSV9NQVhfUEFSTV9WQUxfTEVOXSA9ICIiOworICAgIGlmIChwYXJtLT50eXBlICE9IEJDTUNMSV9QQVJNX0JVRkZFUikKKyAgICB7CisgICAgICAgIHBhcm0tPmZvcm1hdF9jYihwYXJtLCBwYXJtLT52YWx1ZSwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXNcbiIsIGJ1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwYXJtLT52YWx1ZS5idWZmZXIubGVuID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLVxuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlxuIik7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9oZXhkdW1wKHNlc3Npb24sIHBhcm0tPnZhbHVlLmJ1ZmZlci5zdGFydCwgMCwKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX2dldF91c2VkKCZwYXJtLT52YWx1ZS5idWZmZXIpLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqIEVuYWJsZSAvIGRpc2FibGUgQ0xJIGNvbW1hbmQgbG9nZ2luZworICogXHBhcmFtW2luXSAgIG1vZGUgICAgTG9nZ2luZyBmbGFncworICogXHBhcmFtW2luXSAgIGxvZyAgICAgTG9nIHNlc3Npb24uIE11c3QgYmUgc2V0IGlmIG1vZGUgIT0gQkNNQ0xJX0NNRF9MT0dfTk9ORQorICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9sb2dfc2V0KGJjbWNsaV9sb2dfbW9kZSBtb2RlLCBiY21jbGlfc2Vzc2lvbiAqbG9nKQoreworICAgIGlmIChtb2RlICE9IEJDTUNMSV9MT0dfTk9ORSAmJiBsb2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigibG9nIHNlc3Npb24gbXVzdCBiZSBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZiAobW9kZSA9PSBCQ01DTElfTE9HX05PTkUpCisgICAgeworICAgICAgICBfYmNtY2xpX2xvZ19zZXNzaW9uID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9sb2dfc2Vzc2lvbiA9IGxvZzsKKyAgICB9CisgICAgX2JjbWNsaV9sb2dfbW9kZSA9IG1vZGU7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBXcml0ZSBzdHJpbmcgdG8gQ0xJIGxvZy4KKyAqIFRoZSBmdW5jdGlvbiBpcyBpZ25vcmVkIGlmIENMSSBsb2dnaW5nIGlzIG5vdCBlbmFibGVkIHVzaW5nIGJjbWNsaV9sb2dfc2V0KCkKKyAqIFxwYXJhbVtpbl0gICBmb3JtYXQgIHByaW50Zi1saWtlIGZvcm1hdCBmb2xsb3dlZCBieSBhcmd1bWVudHMKKyAqLwordm9pZCBiY21jbGlfbG9nKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaWYgKCFfYmNtY2xpX2xvZ19zZXNzaW9uKQorICAgICAgICByZXR1cm47CisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgYmNtY2xpX3Nlc3Npb25fdnByaW50KF9iY21jbGlfbG9nX3Nlc3Npb24sIGZvcm1hdCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX2JjbWNsaV9sb2dfY21kKGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgICBzd2l0Y2ggKF9iY21jbGlfbG9nX21vZGUpCisgICAgeworICAgIGNhc2UgQkNNQ0xJX0xPR19DTEk6CisgICAgICAgIGJjbWNsaV9sb2coIiVzXG4iLCBjbWQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUNMSV9MT0dfQ19DT01NRU5UOgorICAgICAgICBiY21jbGlfbG9nKCIvKiAlcyAqL1xuIiwgY21kKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfYmNtY2xpX2xvZ19yYyhiY21vc19lcnJubyByYykKK3sKKyAgICBzd2l0Y2ggKF9iY21jbGlfbG9nX21vZGUpCisgICAgeworICAgIGNhc2UgQkNNQ0xJX0xPR19DTEk6CisgICAgICAgIGJjbWNsaV9sb2coIiMgQ0xJIGNvbW1hbmQgY29tcGxldGVkOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01DTElfTE9HX0NfQ09NTUVOVDoKKyAgICAgICAgYmNtY2xpX2xvZygiLyogQ0xJIGNvbW1hbmQgY29tcGxldGVkOiAlcyAoJWQpICovXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAqX2JjbWNsaV9oZWxwX3Nlc3Npb25fb3BlbihiY21jbGlfc2Vzc2lvbiAqbWFpbl9zZXNzaW9uKQoreworICAgIGJjbW9sdF9zdHJpbmcgKmhlbHBfc2NyYXRjaDsKKyAgICBiY21jbGlfc2Vzc2lvbiAqaGVscF9zZXNzaW9uOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGJjbW9sdF9zdHJpbmdfY3JlYXRlKCZoZWxwX3NjcmF0Y2gsIEJDTUNMSV9IRUxQX0JVRkZFUl9TSVpFKTsKKyAgICBlcnIgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3N0cmluZygmaGVscF9zZXNzaW9uLCBoZWxwX3NjcmF0Y2gpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtYWluX3Nlc3Npb24sICJDTEk6IGNhbid0IGNyZWF0ZSBoZWxwIHNlc3Npb24uIEVycm9yICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGhlbHBfc2Vzc2lvbjsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV9oZWxwX3Nlc3Npb25fcHJpbnRfYW5kX2Nsb3NlKGJjbWNsaV9zZXNzaW9uICptYWluX3Nlc3Npb24sIGJjbWNsaV9zZXNzaW9uICpoZWxwX3Nlc3Npb24pCit7CisgICAgYmNtb2x0X3N0cmluZyAqc3RyID0gYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KGhlbHBfc2Vzc2lvbik7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtYWluX3Nlc3Npb24sICIlcyIsIGJjbW9sdF9zdHJpbmdfZ2V0KHN0cikpOworICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKGhlbHBfc2Vzc2lvbik7CisgICAgYmNtb2x0X3N0cmluZ19kZXN0cm95KHN0cik7Cit9CisKKyNpZmRlZiBDT05GSUdfTElORU5PSVNFCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9saW5lX2VkaXRfY21kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGlmIChuX3Bhcm1zID4gMCkKKyAgICB7CisgICAgICAgIGlmICgocGFybVswXS5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpKQorICAgICAgICAgICAgbGluZW5vaXNlU2V0RHVtYlRlcm1pbmFsKHNlc3Npb24tPmxuX3Nlc3Npb24sICEgcGFybVswXS52YWx1ZS5udW1iZXIpOworICAgICAgICBpZiAoKHBhcm1bMV0uZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgICAgIGxpbmVub2lzZVNldE11bHRpTGluZShzZXNzaW9uLT5sbl9zZXNzaW9uLCBwYXJtWzFdLnZhbHVlLm51bWJlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBkdW1iID0gbGluZW5vaXNlR2V0RHVtYlRlcm1pbmFsKHNlc3Npb24tPmxuX3Nlc3Npb24pOworICAgICAgICBpbnQgbXVsdGlsaW5lID0gbGluZW5vaXNlR2V0TXVsdGlMaW5lKHNlc3Npb24tPmxuX3Nlc3Npb24pOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiTGluZSBlZGl0aW5nOiAlcyAgTXVsdGlsaW5lOiAlc1xuIiwKKyAgICAgICAgICAgIGR1bWIgPyAib2ZmIiA6ICJvbiIsIG11bHRpbGluZSA/ICJvbiIgOiAib2ZmIik7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCisKKy8qIEFsbG9jYXRlIHJvb3QgZGlyZWN0b3J5IGFuZCBkZWZhdWx0IHNlc3Npb24gKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfYWxsb2Nfcm9vdChjb25zdCBiY21jbGlfc2Vzc2lvbl9wYXJtICpmaXJzdF9zZXNzaW9uX3Bhcm0pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBzZXNzaW9uX3Bhcm1zOworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIGludCByYzsKKworICAgIC8qIFRoZSB2ZXJ5IGZpcnN0IGNhbGwuIEFsbG9jYXRlIHJvb3Qgc3RydWN0dXJlICovCisgICAgaWYgKChfYmNtY2xpX3Jvb3RfZGlyPShiY21jbGlfZW50cnkgKiliY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnRyeSkgKyBzdHJsZW4oQkNNQ0xJX1JPT1RfSEVMUCkgKyAyICkpID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBfYmNtY2xpX3Jvb3RfZGlyLT5uYW1lID0gKGNoYXIgKikoX2JjbWNsaV9yb290X2RpciArIDEpOworICAgIF9iY21jbGlfcm9vdF9kaXItPmhlbHAgPSAoY2hhciAqKShfYmNtY2xpX3Jvb3RfZGlyLT5uYW1lICsgMSk7CisgICAgc3RyY3B5KF9iY21jbGlfcm9vdF9kaXItPmhlbHAsIEJDTUNMSV9ST09UX0hFTFApOworICAgIF9iY21jbGlfcm9vdF9kaXItPnNlbCA9IEJDTUNMSV9FTlRSWV9ESVI7CisgICAgX2JjbWNsaV9yb290X2Rpci0+YWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19HVUVTVDsKKworICAgIG1lbXNldCgmc2Vzc2lvbl9wYXJtcywgMCwgc2l6ZW9mKHNlc3Npb25fcGFybXMpKTsKKyAgICBzZXNzaW9uX3Bhcm1zLmFjY2Vzc19yaWdodCA9IEJDTUNMSV9BQ0NFU1NfQURNSU47CisgICAgc2Vzc2lvbl9wYXJtcy5leHRyYV9zaXplID0gc2l6ZW9mKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyk7CisgICAgc2Vzc2lvbl9wYXJtcy5uYW1lID0gIm1vbnJvb3QiOworICAgIGlmIChmaXJzdF9zZXNzaW9uX3Bhcm0pCisgICAgeworICAgICAgICBzZXNzaW9uX3Bhcm1zLmxpbmVfZWRpdF9tb2RlID0gZmlyc3Rfc2Vzc2lvbl9wYXJtLT5saW5lX2VkaXRfbW9kZTsKKyAgICB9CisgICAgcmMgPSBiY21jbGlfc2Vzc2lvbl9vcGVuKCZzZXNzaW9uX3Bhcm1zLCAmc2Vzc2lvbik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShfYmNtY2xpX3Jvb3RfZGlyKTsKKyAgICAgICAgX2JjbWNsaV9yb290X2RpciA9IE5VTEw7CisgICAgICAgIF9iY21jbGlfcm9vdF9zZXNzaW9uID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfYmNtY2xpX3Jvb3Rfc2Vzc2lvbiA9IF9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIF9iY21jbGlfcm9vdF9zZXNzaW9uLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBfYmNtY2xpX3Jvb3Rfc2Vzc2lvbi0+Y3VyZGlyID0gX2JjbWNsaV9yb290X2RpcjsKKworICAgIC8qIEFkZCBjb21tYW5kIHRvIGRpc2FibGUvZW5hYmxlIGxpbmUgZWRpdGluZyAqLworI2lmZGVmIENPTkZJR19MSU5FTk9JU0UKKyAgICBpZiAoc2Vzc2lvbl9wYXJtcy5saW5lX2VkaXRfbW9kZSAhPSBCQ01DTElfTElORV9FRElUX0RJU0FCTEUpCisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoTlVMTCwgIn4iLCAiRW5hYmxlL2Rpc2FibGUvcXVlcnkgbGluZSBlZGl0aW5nIiwgX2JjbWNsaV9saW5lX2VkaXRfY21kLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJlbmFibGUiLCAiRW5hYmxlIGxpbmUgZWRpdGluZyIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJtdWx0aWxpbmUiLCAiRW5hYmxlIG11bHRpbGluZSBtb2RlIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwKKyAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisgICAgfQorI2VuZGlmCit9CisKKy8qIERpc3BsYXkgZGlyZWN0b3J5ICovCitzdGF0aWMgdm9pZCBfYmNtY2xpX2Rpc3BsYXlfZGlyKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF9kaXIpCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSBtb25fc2Vzc2lvbi0+c2Vzc2lvbjsKKyAgICBiY21jbGlfZW50cnkgKnBfdG9rZW47CisgICAgYmNtY2xpX2VudHJ5ICpwcmV2PU5VTEw7CisgICAgYmNtY2xpX3Nlc3Npb24gKmhlbHBfc2Vzc2lvbiA9IF9iY21jbGlfaGVscF9zZXNzaW9uX29wZW4oc2Vzc2lvbik7CisKKyAgICBpZiAoIWhlbHBfc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiJXMlcz4gIiwgKHBfZGlyPT1fYmNtY2xpX3Jvb3RfZGlyKT8iIjoiLi4uLyIsIHBfZGlyLT5uYW1lICk7CisgICAgcF90b2tlbiA9IHBfZGlyLT51LmRpci5maXJzdDsKKyAgICB3aGlsZSAoIHBfdG9rZW4gKQorICAgIHsKKyAgICAgICAgaWYgKHBfdG9rZW4tPmFjY2Vzc19yaWdodCA8PSBiY21jbGlfc2Vzc2lvbl9hY2Nlc3NfcmlnaHQoc2Vzc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIiwgIik7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICIlcyIsIHBfdG9rZW4tPm5hbWUgKTsKKyAgICAgICAgICAgIGlmIChwX3Rva2VuLT5zZWwgPT0gQkNNQ0xJX0VOVFJZX0RJUiApCisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiLyIpOworICAgICAgICAgICAgcHJldiA9IHBfdG9rZW47CisgICAgICAgIH0KKyAgICAgICAgcF90b2tlbiA9IHBfdG9rZW4tPm5leHQ7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIlxuIik7CisgICAgX2JjbWNsaV9oZWxwX3Nlc3Npb25fcHJpbnRfYW5kX2Nsb3NlKHNlc3Npb24sIGhlbHBfc2Vzc2lvbik7Cit9CisKKworLyogSXMgY2hhcmFjdGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW5nbGUgdG9rZW4gPyAqLworc3RhdGljIGlubGluZSBpbnQgX2JjbWNsaV9pc19zcGVjaWFsX2NoYXIoY2hhciBjKQoreworICAgIGlmICghYykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIChjID09IEJDTUNMSV9IRUxQX0NIQVIgfHwgYyA9PSBCQ01DTElfQ09NTUVOVF9DSEFSIHx8IGMgPT0gQkNNQ0xJX0VRVUFMX0NIQVIpOworfQorCisvKiBNYWtlIGEgcHJlbGltaW5hcnkgYW5hbGl6aXMgb2YgPG5hbWU+IHRva2VuLgorICogICBSZXR1cm5zIGEgdG9rZW4gdHlwZSAoRW1wdHksIFVwLCBSb290LCBCcmVhaywgTmFtZSkKKyAqLworc3RhdGljIGJjbWNsaV90b2tlbl90eXBlIF9iY21jbGlfYW5hbHl6ZV90b2tlbiggY29uc3QgY2hhciAqbmFtZSApCit7CisgICAgaWYgKCFuYW1lWzBdIHx8IG5hbWVbMF09PSc7JykKKyAgICAgICAgcmV0dXJuIEJDTUNMSV9UT0tFTl9FTVBUWTsKKworICAgIGlmICgqbmFtZSA9PSBCQ01DTElfQ09NTUVOVF9DSEFSKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0JSRUFLOworCisgICAgaWYgKCFzdHJjbXAobmFtZSwgQkNNQ0xJX1VQX1NUUikpCisgICAgICAgIHJldHVybiBCQ01DTElfVE9LRU5fVVA7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCBCQ01DTElfUk9PVF9TVFIpKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX1JPT1Q7CisKKyAgICBpZiAoKm5hbWUgPT0gQkNNQ0xJX0hFTFBfQ0hBUikKKyAgICAgICAgcmV0dXJuIEJDTUNMSV9UT0tFTl9IRUxQOworCisgICAgcmV0dXJuIEJDTUNMSV9UT0tFTl9WQUxVRTsKKworfQorCisKKy8qIGlzc3BhY2Ugd3JhcHBlciAqLworc3RhdGljIGlubGluZSBpbnQgX2JjbWNsaV9pc3NwYWNlKGNoYXIgYykKK3sKKyAgICByZXR1cm4gaXNzcGFjZSgoaW50KWMpOworfQorCisvKiBDdXQgdGhlIGZpcnN0IHdvcmQgZnJvbSA8cF9pbmJ1Zj4uCisgKiAtIFJldHVybiBwb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSB3b3JkIGluIHBfd29yZAorICogLSAwIHRlcm1pbmF0b3IgaXMgaW5zZXJ0ZWQgaW4gdGhlIGVuZCBvZiB0aGUgd29yZAorICogLSBzZXNzaW9uLT5wX2luYnVmIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYWZ0ZXIgdGhlIHdvcmQKKyAqIFJldHVybnMgdG9rZW4gdHlwZQorICovCitzdGF0aWMgYmNtY2xpX3Rva2VuX3R5cGUgX2JjbWNsaV9nZXRfd29yZChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBjaGFyICoqYnVmLCBjaGFyICoqcF93b3JkKQoreworICAgIGJjbWNsaV90b2tlbl90eXBlIHRva2VuX3R5cGU7CisgICAgY2hhciAqcF9pbmJ1ZiA9ICpidWY7CisgICAgY2hhciBuZXh0X2NoYXIgPSAwOworICAgIGJjbW9zX2Jvb2wgcXVvdGVkX3N0cmluZyA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogU2tpcCBsZWFkaW5nIGJsYW5rcyAqLworICAgIHdoaWxlICgqcF9pbmJ1ZiAmJiAoX2JjbWNsaV9pc3NwYWNlKCpwX2luYnVmKSB8fCAoKnBfaW5idWY9PScsJykpKQorICAgICAgICArK3BfaW5idWY7CisKKyAgICAqYnVmID0gcF9pbmJ1ZjsKKyAgICBpZiAoISAqcF9pbmJ1ZikKKyAgICAgICAgcmV0dXJuIEJDTUNMSV9UT0tFTl9FTVBUWTsKKyAgICBpZiAoKnBfaW5idWYgPT0gJzsnKQorICAgIHsKKyAgICAgICAgKnBfaW5idWYgPSAwOworICAgICAgICAqYnVmID0gKytwX2luYnVmOworICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0VNUFRZOworICAgIH0KKworICAgIC8qIFF1b3RlZCBzdHJpbmcgPyAqLworICAgIGlmICgqcF9pbmJ1ZiA9PSAnIicpCisgICAgeworICAgICAgICBxdW90ZWRfc3RyaW5nID0gQkNNT1NfVFJVRTsKKyAgICAgICAgKnBfd29yZCA9ICsrcF9pbmJ1ZjsKKyAgICAgICAgd2hpbGUgKCAqcF9pbmJ1ZiAmJiAqcF9pbmJ1ZiE9JyInICkKKyAgICAgICAgICAgICsrcF9pbmJ1ZjsKKyAgICAgICAgaWYgKCpwX2luYnVmICE9ICciJykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046IHVudGVybWluYXRlZCBzdHJpbmcgJXNcbiIsICpwX3dvcmQpOworICAgICAgICAgICAgcmV0dXJuIEJDTUNMSV9UT0tFTl9FTVBUWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnBfaW5idWYpCisgICAgICAgICAgICAqKHBfaW5idWYrKykgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcF93b3JkID0gcF9pbmJ1ZjsKKyAgICAgICAgaWYgKCFfYmNtY2xpX2lzX3NwZWNpYWxfY2hhcigqcF9pbmJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvICsrcF9pbmJ1ZjsKKyAgICAgICAgICAgIHdoaWxlICgqcF9pbmJ1ZiAmJiAhX2JjbWNsaV9pc3NwYWNlKCpwX2luYnVmKSAmJiAqcF9pbmJ1ZiE9JzsnICYmICFfYmNtY2xpX2lzX3NwZWNpYWxfY2hhcigqcF9pbmJ1ZikpOworICAgICAgICAgICAgLyogU2tpcCB0cmFpbGluZyBzcGFjZXMgKi8KKyAgICAgICAgICAgIHdoaWxlICgqcF9pbmJ1ZiAmJiBfYmNtY2xpX2lzc3BhY2UoKnBfaW5idWYpKQorICAgICAgICAgICAgICAgICoocF9pbmJ1ZisrKSA9IDA7CisgICAgICAgICAgICBuZXh0X2NoYXIgPSAqcF9pbmJ1ZjsKKyAgICAgICAgICAgIGlmIChuZXh0X2NoYXIgPT0gQkNNQ0xJX0VRVUFMX0NIQVIpCisgICAgICAgICAgICAgICAgKihwX2luYnVmKyspID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICsrcF9pbmJ1ZjsKKyAgICAgICAgfQorICAgIH0KKyAgICAqYnVmID0gcF9pbmJ1ZjsKKyAgICB0b2tlbl90eXBlICAgPSBfYmNtY2xpX2FuYWx5emVfdG9rZW4oICpwX3dvcmQgKTsKKyAgICBpZiAodG9rZW5fdHlwZSA9PSBCQ01DTElfVE9LRU5fVkFMVUUgJiYgbmV4dF9jaGFyID09IEJDTUNMSV9FUVVBTF9DSEFSKQorICAgICAgICB0b2tlbl90eXBlID0gQkNNQ0xJX1RPS0VOX05BTUU7CisgICAgaWYgKCh0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9FTVBUWSkgJiYgcXVvdGVkX3N0cmluZykKKyAgICAgICAgdG9rZW5fdHlwZSA9IEJDTUNMSV9UT0tFTl9WQUxVRTsKKyAgICByZXR1cm4gdG9rZW5fdHlwZTsKK30KKworLyogU3BsaXQgc3RyaW5nIHRvIFtuYW1lPV12YWx1ZSBwYWlycyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfc3BsaXQoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX25hbWVfdmFsdWUgKipwX3BhaXJzLCBpbnQgKnBfbnBhaXJzKQoreworICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlyczsKKyAgICBjaGFyICp0bXBfYnVmLCAqdG1wX2J1Zl9vcmc7CisgICAgY2hhciAqd29yZDsKKyAgICBiY21jbGlfdG9rZW5fdHlwZSB0b2tlbl90eXBlLCBwcmV2X3R5cGU9QkNNQ0xJX1RPS0VOX0VNUFRZOworICAgIGludCBuID0gMDsKKworICAgIC8qIE1ha2UgYSBjb3B5IG9mIGlucHV0IGJ1ZmZlciAqLworICAgIHRtcF9idWZfb3JnID0gdG1wX2J1ZiA9IGJjbW9zX2FsbG9jKHN0cmxlbihtb25fc2Vzc2lvbi0+cF9pbmJ1ZikgKyAxKTsKKyAgICBpZiAoIXRtcF9idWYpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIHN0cmNweSh0bXBfYnVmLCBtb25fc2Vzc2lvbi0+cF9pbmJ1Zik7CisKKyAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHBhaXJzIGZpcnN0ICovCisgICAgdG9rZW5fdHlwZSA9IF9iY21jbGlfZ2V0X3dvcmQobW9uX3Nlc3Npb24sICZ0bXBfYnVmLCAmd29yZCk7CisgICAgd2hpbGUgKHRva2VuX3R5cGUgIT0gQkNNQ0xJX1RPS0VOX0VNUFRZICYmIHRva2VuX3R5cGUgIT0gQkNNQ0xJX1RPS0VOX0JSRUFLKQorICAgIHsKKyAgICAgICAgLyogU2tpcCA9dmFsdWUgKi8KKyAgICAgICAgaWYgKCEocHJldl90eXBlID09IEJDTUNMSV9UT0tFTl9OQU1FICYmIHRva2VuX3R5cGUgPT0gQkNNQ0xJX1RPS0VOX1ZBTFVFKSkKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgcHJldl90eXBlID0gdG9rZW5fdHlwZTsKKyAgICAgICAgdG9rZW5fdHlwZSA9IF9iY21jbGlfZ2V0X3dvcmQobW9uX3Nlc3Npb24sICZ0bXBfYnVmLCAmd29yZCk7CisgICAgfQorICAgIGJjbW9zX2ZyZWUodG1wX2J1Zl9vcmcpOworICAgICpwX25wYWlycyA9IG47CisgICAgaWYgKCFuKQorICAgIHsKKyAgICAgICAgKnBfcGFpcnMgPSBOVUxMOworICAgICAgICAvKiBDdXQgaW5wdXQgc3RyaW5nIGluIG9yZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiB0aGUgcGFyc2VyIGlmIHRoZSBzdHJpbmcKKyAgICAgICAgICogaXMgbm90IGVtcHR5IChlLmcuLCBjb250YWlucyBzcGFjZXMpICovCisgICAgICAgICptb25fc2Vzc2lvbi0+cF9pbmJ1ZiA9IDA7CisgICAgICAgIGlmICh0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9CUkVBSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKnBfcGFpcnMgPSBwYWlycyA9IGJjbW9zX2NhbGxvYyhuICogc2l6ZW9mKGJjbWNsaV9uYW1lX3ZhbHVlKSk7CisgICAgaWYgKCEgcGFpcnMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworCisgICAgLyogTm93IHNjYW4gdGhlIG9yaWdpbmFsIHN0cmluZyBhbmQgc2V0IG5hbWVzIGFuZCB2YWx1ZXMgKi8KKyAgICB0b2tlbl90eXBlID0gX2JjbWNsaV9nZXRfd29yZChtb25fc2Vzc2lvbiwgJm1vbl9zZXNzaW9uLT5wX2luYnVmLCAmd29yZCk7CisgICAgcHJldl90eXBlPUJDTUNMSV9UT0tFTl9FTVBUWTsKKyAgICAtLXBhaXJzOyAvKiBpdCBpcyBnb2luZyB0byBiZSBwcmUtaW5jcmVtZW50ZWQgKi8KKyAgICB3aGlsZSAodG9rZW5fdHlwZSAhPSBCQ01DTElfVE9LRU5fRU1QVFkgJiYgdG9rZW5fdHlwZSAhPSBCQ01DTElfVE9LRU5fQlJFQUspCisgICAgeworICAgICAgICBpZiAoIShwcmV2X3R5cGUgPT0gQkNNQ0xJX1RPS0VOX05BTUUgJiYgdG9rZW5fdHlwZSA9PSBCQ01DTElfVE9LRU5fVkFMVUUpKQorICAgICAgICAgICAgKytwYWlyczsKKyAgICAgICAgcGFpcnMtPnR5cGUgPSB0b2tlbl90eXBlOworICAgICAgICBpZiAodG9rZW5fdHlwZSA9PSBCQ01DTElfVE9LRU5fTkFNRSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFpcnMtPm5hbWUgPSB3b3JkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFpcnMtPnZhbHVlID0gd29yZDsKKyAgICAgICAgfQorICAgICAgICBwcmV2X3R5cGUgPSB0b2tlbl90eXBlOworICAgICAgICB0b2tlbl90eXBlID0gX2JjbWNsaV9nZXRfd29yZChtb25fc2Vzc2lvbiwgJm1vbl9zZXNzaW9uLT5wX2luYnVmLCAmd29yZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBGaW5kIHBhcmFtZXRlciBieSBuYW1lICovCitzdGF0aWMgYmNtY2xpX2NtZF9wYXJtICpfYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm0gPSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworCisgICAgd2hpbGUgKGNtZF9wYXJtLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFfYmNtY2xpX3N0cmljbXAobmFtZSwgY21kX3Bhcm0tPm5hbWUsIC0xKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICArK2NtZF9wYXJtOworICAgIH0KKworICAgIGlmICghY21kX3Bhcm0tPm5hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNtZF9wYXJtOworfQorCisvKiBFeHRlbmQgc2Vzc2lvbiBwYXJhbWV0ZXIgdGFibGUgYmFzZWQgb24gc2VsZWN0b3IgdmFsdWUgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2V4dGVuZF9wYXJtX3RhYmxlKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sCisgICAgYmNtY2xpX2NtZF9wYXJtICpzZWxlY3RvciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM9c2VsZWN0b3ItPmVudW1fdGFibGU7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtczsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnNlc3Npb25fcGFybTsKKyAgICBpbnQgbnNlbCA9IHNlbGVjdG9yIC0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKyAgICBiY21jbGlfcGFybV92YWx1ZV9zdGF0dXMgKnZhbF9zdGF0dXM7CisgICAgaW50IG5wYXJtczsKKworICAgIHdoaWxlICh2YWx1ZXMtPm5hbWUpCisgICAgeworICAgICAgICBpZiAoIV9iY21jbGlfc3RyaWNtcCh2YWx1ZXMtPm5hbWUsIHZhbHVlLCAtMSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKyt2YWx1ZXM7CisgICAgfQorICAgIGlmICghdmFsdWVzLT5uYW1lKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKworICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiBzZWxlY3RlZCB0YWJsZSAqLworICAgIHBhcm1zID0gdmFsdWVzLT5wYXJtczsKKyAgICB3aGlsZSAocGFybXMgJiYgcGFybXMtPm5hbWUpCisgICAgeworICAgICAgICArK3Bhcm1zOworICAgIH0KKyAgICBucGFybXMgPSBwYXJtcyAtIHZhbHVlcy0+cGFybXM7CisKKyAgICBpZiAobW9uX3Nlc3Npb24tPm51bV9wYXJtcyArIG5wYXJtcyA+PSBCQ01DTElfTUFYX1BBUk1TKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBDYW4ncyBwcm9jZXNzIHNlbGVjdG9yICVzLiBUb28gbWFueSBwYXJhbWV0ZXJzXG4iLAorICAgICAgICAgICAgbW9uX3Nlc3Npb24tPmN1cmNtZC0+bmFtZSwgc2VsZWN0b3ItPm5hbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICAvKiBTaGlmdCBzZXNzaW9uIHBhcmFtZXRlcnMgbWFraW5nIHJvb20gZm9yIHRoZSBuZXcgdGFibGUgKi8KKyAgICBpZiAoc2VsZWN0b3IgIT0gJm1vbl9zZXNzaW9uLT5jbWRfcGFybXNbbW9uX3Nlc3Npb24tPm51bV9wYXJtcy0xXSkKKyAgICB7CisgICAgICAgIG1lbW1vdmUoc2VsZWN0b3IgKyBucGFybXMgKyAxLCBzZWxlY3RvciArIDEsCisgICAgICAgICAgICAoJm1vbl9zZXNzaW9uLT5jbWRfcGFybXNbbW9uX3Nlc3Npb24tPm51bV9wYXJtcy0xXSAtIHNlbGVjdG9yKSAqIHNpemVvZihiY21jbGlfY21kX3Bhcm0pKTsKKyAgICAgICAgbWVtbW92ZSgmbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tuc2VsICsgbnBhcm1zICsgMV0sICZtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW25zZWwgKyAxXSwKKyAgICAgICAgICAgIChtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zIC0gbnNlbCkgKiBzaXplb2YoYmNtY2xpX3Bhcm1fdmFsdWVfc3RhdHVzKSk7CisgICAgfQorCisgICAgLyogRmluYWxseSBpbnNlcnQgc2VsZWN0b3IncyB0YWJsZSAqLworICAgIHBhcm1zID0gdmFsdWVzLT5wYXJtczsKKyAgICBzZXNzaW9uX3Bhcm0gPSBzZWxlY3RvcisxOworICAgIHZhbF9zdGF0dXMgPSAmbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tuc2VsICsgMV07CisgICAgd2hpbGUgKHBhcm1zICYmIHBhcm1zLT5uYW1lKQorICAgIHsKKyAgICAgICAgKnNlc3Npb25fcGFybSA9ICpwYXJtczsKKyAgICAgICAgX2JjbWNsaV9hc3NpZ25fY2FsbGJhY2tzKHNlc3Npb25fcGFybSk7CisKKyAgICAgICAgaWYgKHBhcm1zLT5tYXhfYXJyYXlfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsX3N0YXR1cy0+dmFsdWVzX3NldCA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtb3NfYm9vbCkgKiBwYXJtcy0+bWF4X2FycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKCF2YWxfc3RhdHVzLT52YWx1ZXNfc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiA+IENvdWxkbid0IGFsbG9jYXRlIHZhbHVlIHN0YXR1cyBhcnJheSBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbF9zdGF0dXMtPnZhbHVlX3NldCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKworICAgICAgICArK3Bhcm1zOworICAgICAgICArK3Nlc3Npb25fcGFybTsKKyAgICAgICAgKyt2YWxfc3RhdHVzOworICAgIH0KKyAgICBtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zICs9IG5wYXJtczsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBQYXJzZSBhIHNpbmdsZSBwYXJhbWV0ZXIgdmFsdWUgKHNjYWxhciB2YWx1ZSBvciBhcnJheSBlbGVtZW50KSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfcGFyc2VfMXZhbHVlKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqY21kLAorICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsdWUsCisgICAgaW50IHZhbF9sZW4sIGJjbW9zX2Jvb2wgc3VwcHJlc3NfZXJyX3ByaW50KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKHZhbF9sZW4gPj0gMCkKKyAgICB7CisgICAgICAgIC8qIFdlIGFyZSBkZWFsaW5nIHdpdGggYXJyYXkgZWxlbWVudC4gc3RyaW5nX3ZhbHVlIGlzIGNvbW1hIHJhdGhlciB0aGFuCisgICAgICAgICAqIDAtdGVybWluYXRlZC4gQ29weSBpdCBhc2lkZS4KKyAgICAgICAgICovCisgICAgICAgIGNoYXIgdmFsX2NvcHlbdmFsX2xlbiArIDFdOworICAgICAgICBzdHJuY3B5KHZhbF9jb3B5LCBzdHJpbmdfdmFsdWUsIHZhbF9sZW4pOworICAgICAgICB2YWxfY29weVt2YWxfbGVuXSA9IDA7CisgICAgICAgIHJjID0gcGFybS0+c2Nhbl9jYihwYXJtLCB2YWx1ZSwgdmFsX2NvcHkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IHBhcm0tPnNjYW5fY2IocGFybSwgdmFsdWUsIHN0cmluZ192YWx1ZSk7CisgICAgfQorICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IDwlcz46IHZhbHVlICVzIGlzIGludmFsaWRcbiIsCisgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBwYXJtLT5uYW1lLCBzdHJpbmdfdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCisvKiBQYXJzZSBwYXJhbWV0ZXIgdmFsdWUsIGluY2x1ZGluZyBhcnJheSB2YWx1ZSAoY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgZWxlbWVudCB2YWx1ZXMpICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9wYXJzZV92YWx1ZShiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKmNtZCwKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGNvbnN0IGNoYXIgKnN0cmluZ192YWx1ZSwgYmNtb3NfYm9vbCBzdXBwcmVzc19lcnJfcHJpbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IHBhcm1faW5kZXggPSBwYXJtIC0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKworICAgIEJVR19PTihwYXJtX2luZGV4ID49IEJDTUNMSV9NQVhfUEFSTVMpOworCisgICAgaWYgKHBhcm0tPm1heF9hcnJheV9zaXplKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICAgICAgLyogRW1wdHkgYXJyYXk/ICovCisgICAgICAgIGlmIChfYmNtY2xpX3N0cmljbXAoc3RyaW5nX3ZhbHVlLCBCQ01DTElfQVJSQVlfRU1QVFksIC0xKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogYXJyYXkgZWxlbWVudCB2YWx1ZXMgYXJlIGNvbW1hLWRlbGltaXRlZCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcm0tPm1heF9hcnJheV9zaXplICYmIHN0cmluZ192YWx1ZSAmJiAqc3RyaW5nX3ZhbHVlICYmICFyYzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBjb21tYTsKKyAgICAgICAgICAgICAgICBpbnQgdmFsX2xlbjsKKworICAgICAgICAgICAgICAgIHBjb21tYSA9IHN0cmNocihzdHJpbmdfdmFsdWUsIEJDTUNMSV9BUlJBWV9ERUxJTV9DSEFSKTsKKyAgICAgICAgICAgICAgICBpZiAocGNvbW1hKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsX2xlbiA9IHBjb21tYSAtIHN0cmluZ192YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsX2xlbiA9IC0xOyAvKiB0byB0aGUgZW5kIG9mIHN0cmluZyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBObyB2YWx1ZSA/ICovCisgICAgICAgICAgICAgICAgaWYgKF9iY21jbGlfc3RyaWNtcChzdHJpbmdfdmFsdWUsIEJDTUNMSV9QQVJNX05PX1ZBTFVFLCB2YWxfbGVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gX2JjbWNsaV9wYXJzZV8xdmFsdWUobW9uX3Nlc3Npb24sIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcm0sICZwYXJtLT52YWx1ZXNbaV0sIHN0cmluZ192YWx1ZSwgdmFsX2xlbiwgc3VwcHJlc3NfZXJyX3ByaW50KTsKKyAgICAgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1twYXJtX2luZGV4XS52YWx1ZXNfc2V0W2ldID0gKHJjID09IEJDTV9FUlJfT0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWUgPSBwY29tbWEgPyBwY29tbWEgKyAxIDogTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIElmIGFsbCBwYXJzZWQgdmFsdWVzIHdlcmUgb2ssIGJ1dCB3ZSBoYXZlIG1vcmUgdmFsdWVzIHRoYW4gYXJyYXkgc2l6ZSAtIGl0IGlzIGFuIGVycm9yICovCisgICAgICAgICAgICBpZiAoc3RyaW5nX3ZhbHVlICYmICpzdHJpbmdfdmFsdWUgJiYgIXJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9UT09fTUFOWTsKKyAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gPCVzPjogdG9vIG1hbnkgdmFsdWVzLiAlcyBpcyBpbnZhbGlkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBwYXJtLT5uYW1lLCBzdHJpbmdfdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBhcm0tPmFycmF5X3NpemUgPSBpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoX2JjbWNsaV9zdHJpY21wKHN0cmluZ192YWx1ZSwgQkNNQ0xJX1BBUk1fTk9fVkFMVUUsIHN0cmxlbihzdHJpbmdfdmFsdWUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBfYmNtY2xpX3BhcnNlXzF2YWx1ZShtb25fc2Vzc2lvbiwgY21kLAorICAgICAgICAgICAgICAgIHBhcm0sICZwYXJtLT52YWx1ZSwgc3RyaW5nX3ZhbHVlLCAtMSwgc3VwcHJlc3NfZXJyX3ByaW50KTsKKyAgICAgICAgICAgIG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbcGFybV9pbmRleF0udmFsdWVfc2V0ID0gKHJjID09IEJDTV9FUlJfT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZWxlYXNlIHZhbHVlIHN0YXR1cyBhcnJheXMgKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfZnJlZV9zZXNzaW9uX3ZhbHVlX3N0YXR1cyhiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybXM9bW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01DTElfTUFYX1BBUk1TOyBpKyspCisgICAgeworICAgICAgICBpZiAocGFybXNbaV0ubWF4X2FycmF5X3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW2ldLnZhbHVlc19zZXQgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbaV0udmFsdWVzX3NldCk7CisgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZXNfc2V0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbaV0udmFsdWVfc2V0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFBvcHVsYXRlIHNlc3Npb24gcGFyYW1ldGVycy4gQXBwbHkgc2VsZWN0b3JzICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9wb3B1bGF0ZV9wYXJtcyhiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKmNtZCwKKyAgICBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsIGludCBucGFpcnMsIGJjbW9zX2Jvb2wgc3VwcHJlc3NfZXJyX3ByaW50LCBpbnQgKmxhc3QpCit7CisgICAgY29uc3QgY2hhciAqcGFybV92YWx1ZTsKKyAgICBpbnQgcG9zaXRpb25hbD0xOworICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybXM9bW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmN1cl9wYXJtOworICAgIGludCByYzsKKyAgICBpbnQgaTsKKworICAgIC8qIE1hcmsgYWxsIHBhcmFtZXRlcnMgYXMgZG9uJ3QgaGF2aW5nIGFuIGV4cGxpY2l0IHZhbHVlICovCisgICAgbWVtc2V0KCZwYXJtc1swXSwgMCwgc2l6ZW9mKG1vbl9zZXNzaW9uLT5jbWRfcGFybXMpKTsKKyAgICBtZW1jcHkoJnBhcm1zWzBdLCBjbWQtPnUuY21kLnBhcm1zLCBzaXplb2YoYmNtY2xpX2NtZF9wYXJtKSpjbWQtPnUuY21kLm51bV9wYXJtcyk7CisgICAgLyogQ2xlYXIgYXJyYXkgYnVmZmVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjbWQtPnUuY21kLm51bV9wYXJtczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBhcm1zW2ldLm1heF9hcnJheV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBCVUdfT04oIXBhcm1zW2ldLnZhbHVlcyk7CisgICAgICAgICAgICBtZW1zZXQocGFybXNbaV0udmFsdWVzLCAwLCBzaXplb2YoYmNtY2xpX3Bhcm1fdmFsdWUpICogcGFybXNbaV0ubWF4X2FycmF5X3NpemUpOworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZXNfc2V0ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19ib29sKSAqIHBhcm1zW2ldLm1heF9hcnJheV9zaXplKTsKKyAgICAgICAgICAgIGlmICghbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZXNfc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gQ291bGRuJ3QgYWxsb2NhdGUgdmFsdWUgc3RhdHVzIGFycmF5IGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBwYWlyc1tpXS5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbaV0udmFsdWVfc2V0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgbW9uX3Nlc3Npb24tPmN1cmNtZCA9IGNtZDsKKyAgICBtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zID0gY21kLT51LmNtZC5udW1fcGFybXM7CisgICAgaWYgKGxhc3QpCisgICAgICAgICpsYXN0ID0gMDsKKyAgICAvKiBCdWlsZCBhIGZvcm1hdCBzdHJpbmcgKi8KKyAgICBmb3IgKGk9MDsgaTxucGFpcnMgJiYgcGFpcnNbaV0udHlwZSAhPSBCQ01DTElfVE9LRU5fQlJFQUs7IGkrKykKKyAgICB7CisgICAgICAgIHBhcm1fdmFsdWUgPSBwYWlyc1tpXS52YWx1ZTsKKyAgICAgICAgaWYgKGxhc3QpCisgICAgICAgICAgICAqbGFzdCA9IGk7CisgICAgICAgIGN1cl9wYXJtID0gTlVMTDsKKyAgICAgICAgLyogTmFtZWQgcGFyYW1ldGVyID8gKi8KKyAgICAgICAgaWYgKHBhaXJzW2ldLm5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKGNtZC0+dS5jbWQuZXh0cmFzLmZsYWdzICYgQkNNQ0xJX0NNRF9GTEFHX05PX05BTUVfUEFSTVMpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gRG9lc24ndCBzdXBwb3J0IG5hbWVkIHBhcmFtZXRlcnMuICVzIGlzIHVuZXhwZWN0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zaXRpb25hbCA9IDA7IC8qIE5vIG1vcmUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICAvKiBDaGVjayBuYW1lICovCisgICAgICAgICAgICBjdXJfcGFybSA9IF9iY21jbGlfZmluZF9uYW1lZF9wYXJtKG1vbl9zZXNzaW9uLCBwYWlyc1tpXS5uYW1lKTsKKyAgICAgICAgICAgIGlmICghY3VyX3Bhcm0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdXBwcmVzc19lcnJfcHJpbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IHBhcmFtZXRlciA8JXM+IGRvZXNuJ3QgZXhpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwYXJtX3ZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiA8JXM+OiB2YWx1ZSBpcyBtaXNzaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBjdXJfcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpdCBjYW4gc3RpbGwgYmUgbmFtZWQgRU5VTSBwYXJhbWV0ZXIgKHdpdGhvdXQgPXZhbHVlKS4gSW4gdGhpcyBjYXNlIHRoZSAxc3QKKyAgICAgICAgICAgICAqIGVudW0gdmFsdWUgaXMgYXNzdW1lZC4gQ2hlY2sgaXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBhcm1fdmFsdWUgJiYgKGN1cl9wYXJtID0gX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0obW9uX3Nlc3Npb24sIHBhcm1fdmFsdWUpKSAmJgorICAgICAgICAgICAgICAgIChjdXJfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9FTlVNKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS5uYW1lID0gcGFybV92YWx1ZTsKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS52YWx1ZSA9IHBhcm1fdmFsdWUgPSBjdXJfcGFybS0+ZW51bV90YWJsZS0+bmFtZTsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbmFsID0gMDsgLyogTm8gbW9yZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBvc2l0aW9uYWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gRXhwZWN0ZWQgbmFtZWQgcGFyYW1ldGVyLiBHb3QgJXNcbiIsIGNtZC0+bmFtZSwgcGFybV92YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cl9wYXJtID0gJnBhcm1zW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjdXJfcGFybS0+bmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBUb28gbWFueSBwYXJhbWV0ZXJzLiAlcyBpcyB1bmV4cGVjdGVkXG4iLCBjbWQtPm5hbWUsIHBhcm1fdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwcmVzc19lcnJfcHJpbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBBdHRlbXB0IHRvIGFzc2lnbiBwYXJhbWV0ZXIgJXMgbW9yZSB0aGFuIG9uY2VcbiIsCisgICAgICAgICAgICAgICAgICAgIGNtZC0+bmFtZSwgY3VyX3Bhcm0tPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJtX3ZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VyX3Bhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fU1RSSU5HKQorICAgICAgICAgICAgICAgIGN1cl9wYXJtLT52YWx1ZS5zdHJpbmcgPSBwYXJtX3ZhbHVlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX2JjbWNsaV9wYXJzZV92YWx1ZShtb25fc2Vzc2lvbiwgY21kLCBjdXJfcGFybSwgcGFybV92YWx1ZSwgc3VwcHJlc3NfZXJyX3ByaW50KTsKKyAgICAgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsKKworICAgICAgICAgICAgICAgIC8qIEZvciBwYXJhbWV0ZXItc2VsZWN0b3IgZXh0ZW5kIGxpc3Qgb2YgcGFyYW1ldGVycyBhY2NvcmRpbmdseSAqLworICAgICAgICAgICAgICAgIGlmIChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBfYmNtY2xpX2V4dGVuZF9wYXJtX3RhYmxlKG1vbl9zZXNzaW9uLCBjdXJfcGFybSwgcGFybV92YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUGFyc2UgcF9pbmJ1ZiBzdHJpbmcgYmFzZWQgb24gcGFyYW1ldGVyIGRlc2NyaXB0aW9ucyBpbiA8cF90b2tlbj4uCisgKiAgIEZpbGwgcGFyYW1ldGVyIHZhbHVlcyBpbiA8cF90b2tlbj4uCisgKiAgIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGZpbGxlZCBvciBCQ01fRVJSX1BBUk0KKyAqICAgVG8gRG86IGFkZCBhIG9wdGlvbiBvZiBvbmUtYnktb25lIHVzZXIgaW5wdXQgb2YgbWlzc2luZyBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgaW50IF9iY21jbGlfcGFyc2VfcGFybXMoIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqY21kLCBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsIGludCBucGFpcnMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtcz1tb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworICAgIGludCByYzsKKyAgICBpbnQgaTsKKworICAgIC8qIFBvcHVsYXRlIHBhcmFtZXRlciB0YWJsZSAqLworICAgIHJjID0gX2JjbWNsaV9wb3B1bGF0ZV9wYXJtcyhtb25fc2Vzc2lvbiwgY21kLCBwYWlycywgbnBhaXJzLCBCQ01PU19GQUxTRSwgTlVMTCk7CisgICAgaWYgKHJjKQorICAgICAgICBnb3RvIGVycl9yZXR1cm47CisKKworICAgIHJjID0gQkNNX0VSUl9QQVJNOworCisgICAgLyogTWFrZSBzdXJlIHRoYXQgcGFyYW1ldGVycyBhcmUgT0suIENoZWNrIHJhbmdlLCBwcm9jZXNzIGRlZmF1bHQgdmFsdWVzICovCisgICAgZm9yIChpPTA7IGk8bW9uX3Nlc3Npb24tPm51bV9wYXJtczsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtY2xpX2NtZF9wYXJtICpjdXJfcGFybSA9ICZwYXJtc1tpXTsKKworICAgICAgICBpZiAoIShjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyX3Bhcm0tPmZsYWdzIHw9IEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBNYW5kYXRvcnkgcGFyYW1ldGVyIG1pc3NpbmcgKi8KKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IE1hbmRhdG9yeSBwYXJhbWV0ZXIgPCVzPiBpcyBtaXNzaW5nXG4iLCBjbWQtPm5hbWUsIHBhcm1zW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIHZhbHVlICovCisgICAgICAgIGlmICgoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN1cl9wYXJtLT5hcnJheV9zaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgajsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3VyX3Bhcm0tPmFycmF5X3NpemU7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoY3VyX3Bhcm0tPnZhbHVlc1tqXS5udW1iZXIgPCBjdXJfcGFybS0+bG93X3ZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VyX3Bhcm0tPnZhbHVlc1tqXS5udW1iZXIgPiBjdXJfcGFybS0+aGlfdmFsKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiA8JXM+OiAlbGQgb3V0IG9mIHJhbmdlICglbGQsICVsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+bmFtZSwgY3VyX3Bhcm0tPm5hbWUsIGN1cl9wYXJtLT52YWx1ZXNbal0ubnVtYmVyLCBjdXJfcGFybS0+bG93X3ZhbCwgY3VyX3Bhcm0tPmhpX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJfcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgoY3VyX3Bhcm0tPnZhbHVlLm51bWJlciA8IGN1cl9wYXJtLT5sb3dfdmFsKSB8fAorICAgICAgICAgICAgICAgICAgICAoY3VyX3Bhcm0tPnZhbHVlLm51bWJlciA+IGN1cl9wYXJtLT5oaV92YWwpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gPCVzPjogJWxkIG91dCBvZiByYW5nZSAoJWxkLCAlbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBjdXJfcGFybS0+bmFtZSwgY3VyX3Bhcm0tPnZhbHVlLm51bWJlciwgY3VyX3Bhcm0tPmxvd192YWwsIGN1cl9wYXJtLT5oaV92YWwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKK2Vycl9yZXR1cm46CisgICAgX2JjbWNsaV9mcmVlX3Nlc3Npb25fdmFsdWVfc3RhdHVzKG1vbl9zZXNzaW9uKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIGluc2VydCB2YWx1ZSBza2lwcGluZyBwYXJ0aWFsIG1hdGNoIHRyaGF0IGlzIGFscmVhZHkgcHJlc2VudCAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9pbnNlcnQoY29uc3QgY2hhciAqcGFydGlhbF9tYXRjaCwgY29uc3QgY2hhciAqaW5zZXJ0X3ZhbDEsCisgICAgY29uc3QgY2hhciAqaW5zZXJ0X3ZhbDIsIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKQoreworICAgIGlmIChwYXJ0aWFsX21hdGNoKQorICAgICAgICBpbnNlcnRfdmFsMSArPSBzdHJsZW4ocGFydGlhbF9tYXRjaCk7CisgICAgYmNtY2xpX3N0cm5jcHkoaW5zZXJ0X3N0ciwgaW5zZXJ0X3ZhbDEsIGluc2VydF9zaXplKTsKKyAgICBpZiAoaW5zZXJ0X3ZhbDIpCisgICAgICAgIGJjbWNsaV9zdHJuY2F0KGluc2VydF9zdHIsIGluc2VydF92YWwyLCBpbnNlcnRfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9iY21jbGlfdXBkYXRlX2xvbmdlc3RfbWF0Y2goY2hhciAqbG9uZ2VzdF9tYXRjaCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBubGVuID0gc3RybGVuKG5hbWUpOworICAgIHVpbnQzMl90IGxtbGVuID0gc3RybGVuKGxvbmdlc3RfbWF0Y2gpOworCisgICAgaWYgKG5sZW4gPCBsbWxlbikKKyAgICB7CisgICAgICAgIGxtbGVuID0gbmxlbjsKKyAgICB9CisgICAgd2hpbGUgKGxtbGVuICYmIG1lbWNtcChsb25nZXN0X21hdGNoLCBuYW1lLCBsbWxlbikpCisgICAgeworICAgICAgICAtLWxtbGVuOworICAgIH0KKyAgICBsb25nZXN0X21hdGNoW2xtbGVuXSA9IDA7Cit9CisKKworLyogZXh0ZW5kIHZhbHVlLgorICogSWYgIWVudW0gLSBkbyBub3RoaW5nCisgKiBJZiBtb3JlIHRoYW4gMSBtYXRjaGluZyB2YWx1ZSAtIGRpc3BsYXkgdGhlbQorICogSWYgbm8gbWF0Y2hpbmcgdmFsdWUgLSBkbyBub3RoaW5nCisgKiBJZiAxIG1hdGNoaW5nIHZhbHVlIC0gaW5zZXJ0CisgKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfZXh0ZW5kX3ZhbHVlKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9jbWRfcGFybSAqcGFybSwKKyAgICBjb25zdCBjaGFyICpwYXJ0aWFsX3ZhbHVlLCBjaGFyICppbnNlcnRfc3RyLCB1aW50MzJfdCBpbnNlcnRfc2l6ZSkKK3sKKyAgICBpbnQgbm1hdGNoID0gMDsKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHMgPSBwYXJtLT5lbnVtX3RhYmxlOworICAgIGNoYXIgbG9uZ2VzdF9tYXRjaFtCQ01DTElfTUFYX1NFQVJDSF9TVUJTVFJfTEVOR1RIXT0iIjsKKworICAgIGlmICgocGFybS0+dHlwZSAhPSBCQ01DTElfUEFSTV9FTlVNICYmIHBhcm0tPnR5cGUgIT0gQkNNQ0xJX1BBUk1fRU5VTV9NQVNLKSB8fCAhdmFscykKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogSWYgZW51bSBtYXNrLCBwYXJ0aWFsIHZhbHVlIGNhbiBiZSBhIHN1bSBvZiB2YWx1ZXMuIFNraXAgcGFzdCB0aGUgbGFzdCAnKycgc2lnbiAqLworICAgIGlmIChwYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU1fTUFTSyAmJiBwYXJ0aWFsX3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2hhciAqcGRlbCA9IHN0cnJjaHIocGFydGlhbF92YWx1ZSwgQkNNQ0xJX0VOVU1fTUFTS19ERUxfQ0hBUik7CisgICAgICAgIGlmIChwZGVsKQorICAgICAgICAgICAgcGFydGlhbF92YWx1ZSA9IHBkZWwgKyAxOworICAgIH0KKworICAgIHdoaWxlICh2YWxzLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFwYXJ0aWFsX3ZhbHVlIHx8ICFzdHJuY21wKHZhbHMtPm5hbWUsIHBhcnRpYWxfdmFsdWUsIHN0cmxlbihwYXJ0aWFsX3ZhbHVlKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbm1hdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGxvbmdlc3RfbWF0Y2gsIHZhbHMtPm5hbWUsIHNpemVvZihsb25nZXN0X21hdGNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2JjbWNsaV91cGRhdGVfbG9uZ2VzdF9tYXRjaChsb25nZXN0X21hdGNoLCB2YWxzLT5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbm1hdGNoOworICAgICAgICB9CisgICAgICAgICsrdmFsczsKKyAgICB9CisgICAgaWYgKCFubWF0Y2gpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAobm1hdGNoID09IDEpCisgICAgeworICAgICAgICBfYmNtY2xpX2luc2VydChwYXJ0aWFsX3ZhbHVlLCBsb25nZXN0X21hdGNoLCAiICIsIGluc2VydF9zdHIsIGluc2VydF9zaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBkaXNwbGF5IGFsbCBtYXRjaGluZyB2YWx1ZXMgKi8KKyAgICBfYmNtY2xpX2luc2VydChwYXJ0aWFsX3ZhbHVlLCBsb25nZXN0X21hdGNoLCAiIiwgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiXG4iKTsKKyAgICB2YWxzID0gcGFybS0+ZW51bV90YWJsZTsKKyAgICB3aGlsZSAodmFscy0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICghcGFydGlhbF92YWx1ZSB8fCAhc3RybmNtcCh2YWxzLT5uYW1lLCBwYXJ0aWFsX3ZhbHVlLCBzdHJsZW4ocGFydGlhbF92YWx1ZSkpKQorICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICIgJXMiLCB2YWxzLT5uYW1lKTsKKyAgICAgICAgKyt2YWxzOworICAgIH0KKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlxuIik7Cit9CisKKy8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbWF0Y2hpbmcgcGFyYW1ldGVyIG5hbWVzICovCitzdGF0aWMgaW50IF9iY21jbGlfbnVtX21hdGNoaW5nX25hbWVzKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNvbnN0IGNoYXIgKnBhcnRpYWxfdmFsdWUsIGludCAqZmlyc3RfbWF0Y2gpCit7CisgICAgaW50IGk7CisgICAgaW50IG5tYXRjaCA9IDA7CisKKyAgICAqZmlyc3RfbWF0Y2ggPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW9uX3Nlc3Npb24tPm51bV9wYXJtczsgaSsrKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldLmZsYWdzOworICAgICAgICBpZiAoKGZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHBhcnRpYWxfdmFsdWUgJiYgc3RybmNtcChtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldLm5hbWUsIHBhcnRpYWxfdmFsdWUsIHN0cmxlbihwYXJ0aWFsX3ZhbHVlKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCpmaXJzdF9tYXRjaCA9PSAtMSkKKyAgICAgICAgICAgICpmaXJzdF9tYXRjaCA9IGk7CisgICAgICAgICsrbm1hdGNoOworICAgIH0KKyAgICByZXR1cm4gbm1hdGNoOworfQorCisvKiBjYWxjdWxhdGUgbG9uZ2VzdCBtYXRjaGluZyBzdHJpbmcuCisgKiByZXR1cm5zIG51bWJlciBvZiBtYXRjaGluZyBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9sb25nZXN0X21hdGNoKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNvbnN0IGNoYXIgKnBhcnRpYWxfdmFsdWUsCisgICAgY2hhciAqbG9uZ2VzdF9tYXRjaCwgdWludDMyX3QgbG9uZ2VzdF9tYXRjaF9zaXplLCBpbnQgKmZpcnN0X21hdGNoKQoreworICAgIGludCBubWF0Y2gwID0gX2JjbWNsaV9udW1fbWF0Y2hpbmdfbmFtZXMobW9uX3Nlc3Npb24sIHBhcnRpYWxfdmFsdWUsIGZpcnN0X21hdGNoKTsKKyAgICBpbnQgbm1hdGNoOworICAgIGNvbnN0IGNoYXIgKm1hdGNoX25hbWU7CisKKyAgICBpZiAoIW5tYXRjaDApCisgICAgICAgIHJldHVybiBubWF0Y2gwOworICAgIG1hdGNoX25hbWUgPSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zWypmaXJzdF9tYXRjaF0ubmFtZTsKKyAgICBpZiAobm1hdGNoMCA9PSAxKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3N0cm5jcHkobG9uZ2VzdF9tYXRjaCwgbWF0Y2hfbmFtZSwgbG9uZ2VzdF9tYXRjaF9zaXplKTsKKyAgICAgICAgcmV0dXJuIG5tYXRjaDA7CisgICAgfQorICAgIGJjbWNsaV9zdHJuY3B5KGxvbmdlc3RfbWF0Y2gsIG1hdGNoX25hbWUsIGxvbmdlc3RfbWF0Y2hfc2l6ZSk7CisgICAgbm1hdGNoID0gX2JjbWNsaV9udW1fbWF0Y2hpbmdfbmFtZXMobW9uX3Nlc3Npb24sIGxvbmdlc3RfbWF0Y2gsIGZpcnN0X21hdGNoKTsKKyAgICB3aGlsZSAobm1hdGNoICE9IG5tYXRjaDApCisgICAgeworICAgICAgICBsb25nZXN0X21hdGNoW3N0cmxlbihsb25nZXN0X21hdGNoKS0xXSA9IDA7CisgICAgICAgIG5tYXRjaCA9IF9iY21jbGlfbnVtX21hdGNoaW5nX25hbWVzKG1vbl9zZXNzaW9uLCBsb25nZXN0X21hdGNoLCBmaXJzdF9tYXRjaCk7CisgICAgfQorICAgIHJldHVybiBubWF0Y2gwOworfQorCisvKiBkaXNwbGF5L2luc2VydCB1bnNldCBtYXRjaGluZyBuYW1lcworICogSWYgbW9yZSB0aGFuIDEgbWF0Y2hpbmcgdmFsdWUgLSBkaXNwbGF5IHRoZW0KKyAqIElmIG5vIG1hdGNoaW5nIHZhbHVlIC0gZG8gbm90aGluZworICogSWYgMSBtYXRjaGluZyB2YWx1ZSAtIGluc2VydAorICovCitzdGF0aWMgdm9pZCBfYmNtY2xpX2V4dGVuZF9uYW1lKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNvbnN0IGNoYXIgKnBhcnRpYWxfdmFsdWUsCisgICAgY2hhciAqaW5zZXJ0X3N0ciwgdWludDMyX3QgaW5zZXJ0X3NpemUpCit7CisgICAgY2hhciBsb25nZXN0X21hdGNoW0JDTUNMSV9NQVhfU0VBUkNIX1NVQlNUUl9MRU5HVEhdPSIiOworICAgIGludCBmaXJzdF9tYXRjaDsKKyAgICBpbnQgbm1hdGNoID0gX2JjbWNsaV9sb25nZXN0X21hdGNoKG1vbl9zZXNzaW9uLCBwYXJ0aWFsX3ZhbHVlLCBsb25nZXN0X21hdGNoLAorICAgICAgICBzaXplb2YobG9uZ2VzdF9tYXRjaCksICZmaXJzdF9tYXRjaCk7CisKKyAgICBpZiAoIW5tYXRjaCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghcGFydGlhbF92YWx1ZSB8fCBzdHJjbXAocGFydGlhbF92YWx1ZSwgbG9uZ2VzdF9tYXRjaCkpCisgICAgICAgIF9iY21jbGlfaW5zZXJ0KHBhcnRpYWxfdmFsdWUsIGxvbmdlc3RfbWF0Y2gsIChubWF0Y2ggPT0gMSkgPyAiPSIgOiAiIiwgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgIGVsc2UKKyAgICAgICAgX2JjbWNsaV9oZWxwX3BvcHVsYXRlZF9jbWQobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJjbWQsIHBhcnRpYWxfdmFsdWUsIEJDTU9TX1RSVUUpOworfQorCitzdGF0aWMgaW50IF9iY21jbGlfZXh0ZW5kX3Bhcm1zKCBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsCisgICAgaW50IG5wYWlycywgYmNtb3NfYm9vbCBsYXN0X2lzX3NwYWNlLCBjaGFyICppbnNlcnRfc3RyLCB1aW50MzJfdCBpbnNlcnRfc2l6ZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBpbnQgbGFzdCA9IDA7CisgICAgYmNtY2xpX2NtZF9wYXJtICpoZWxwX3Bhcm0gPSBOVUxMOworICAgIGludCBpOworCisgICAgcmMgPSBfYmNtY2xpX3BvcHVsYXRlX3Bhcm1zKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyY21kLCBwYWlycywgbnBhaXJzLCBCQ01PU19UUlVFLCAmbGFzdCk7CisgICAgaWYgKCFyYykKKyAgICB7CisgICAgICAgIC8qIFNvIGZhciBzbyBnb29kICovCisgICAgICAgIC8qIElmIHRoZXJlIGlzIHVuc2V0IG1hbmRhdG9yeSBwYXJhbWV0ZXIgLSBpbnNlcnQgaXRzIG5hbWUuCisgICAgICAgICAqIE90aGVyd2lzZSwgZGlzcGxheSBsaXN0IG9mIHVuc2V0IHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIC8qIEZpbmQgbWFuZGF0b3J5IHBhcmFtZXRlciB0aGF0IGlzIHN0aWxsIHVuYXNzaWduZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbl9zZXNzaW9uLT5udW1fcGFybXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldLmZsYWdzOworICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiAoQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCB8IEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMIHwgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlbHBfcGFybSA9ICZtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChoZWxwX3Bhcm0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbGFzdF9pc19zcGFjZSkKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShpbnNlcnRfc3RyLCAiICIsIGluc2VydF9zaXplKTsKKyAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGluc2VydF9zdHIsIGhlbHBfcGFybS0+bmFtZSwgaW5zZXJ0X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoaW5zZXJ0X3N0ciwgIj0iLCBpbnNlcnRfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGFzdCA8IG1vbl9zZXNzaW9uLT5udW1fcGFybXMpCisgICAgICAgICAgICBfYmNtY2xpX2hlbHBfcG9wdWxhdGVkX2NtZChtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmNtZCwgTlVMTCwgQkNNT1NfVFJVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFBhcnNpbmcgZmFpbGVkLiBTZWUgd2hhdCBzdG9wcGVkIGF0ICovCisgICAgICAgIGlmIChsYXN0IDwgbW9uX3Nlc3Npb24tPm51bV9wYXJtcykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX25hbWVfdmFsdWUgKmxhc3RfcGFpcjsKKworICAgICAgICAgICAgbGFzdF9wYWlyID0gJnBhaXJzW2xhc3RdOworICAgICAgICAgICAgaWYgKGxhc3RfcGFpci0+bmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gaWRlbnRpZnkgYnkgbmFtZSAqLworICAgICAgICAgICAgICAgIGhlbHBfcGFybSA9IF9iY21jbGlfZmluZF9uYW1lZF9wYXJtKG1vbl9zZXNzaW9uLCBsYXN0X3BhaXItPm5hbWUgPyBsYXN0X3BhaXItPm5hbWUgOiBsYXN0X3BhaXItPnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZWxwX3Bhcm0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTG9va2luZyBmb3IgdmFsdWVzICovCisgICAgICAgICAgICAgICAgX2JjbWNsaV9leHRlbmRfdmFsdWUobW9uX3Nlc3Npb24sIGhlbHBfcGFybSwgbGFzdF9wYWlyLT52YWx1ZSwgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExvb2tpbmcgZm9yIHBhcnRpYWwgbmFtZSAqLworICAgICAgICAgICAgICAgIF9iY21jbGlfZXh0ZW5kX25hbWUobW9uX3Nlc3Npb24sIGxhc3RfcGFpci0+bmFtZSA/IGxhc3RfcGFpci0+bmFtZSA6IGxhc3RfcGFpci0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGluc2VydF9zdHIsIGluc2VydF9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfYmNtY2xpX2ZyZWVfc2Vzc2lvbl92YWx1ZV9zdGF0dXMobW9uX3Nlc3Npb24pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIElkZW50aWZ5IHRva2VuIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkgKi8KK3N0YXRpYyBiY21jbGlfZW50cnkgKl9iY21jbGlfc2VhcmNoX3Rva2VuMSggYmNtY2xpX2VudHJ5ICpwX2RpciwgY29uc3QgY2hhciAqKnBfbmFtZSwgaW50IG5hbWVfbGVuICkKK3sKKyAgICBiY21jbGlfZW50cnkgKnBfdG9rZW4gPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSAqcF9uYW1lOworICAgIGJjbWNsaV90b2tlbl90eXBlIHR5cGU9X2JjbWNsaV9hbmFseXplX3Rva2VuKG5hbWUpOworCisgICAgLyogTmFtZSBjYW4gYmUgcXVhbGlmaWVkICovCisgICAgaWYgKHR5cGUgPT0gQkNNQ0xJX1RPS0VOX1ZBTFVFICYmICFzdHJuY21wKG5hbWUsIEJDTUNMSV9VUF9TVFIsIG5hbWVfbGVuKSkKKyAgICAgICAgdHlwZSA9IEJDTUNMSV9UT0tFTl9VUDsKKworICAgIHN3aXRjaCh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fUk9PVDoKKyAgICAgICAgICAgIHBfdG9rZW4gPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgICAgICAgICAgKnBfbmFtZSA9IG5hbWUgKyBzdHJsZW4oQkNNQ0xJX1JPT1RfU1RSKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9UT0tFTl9VUDoKKyAgICAgICAgICAgIGlmIChwX2Rpci0+cGFyZW50KQorICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX2Rpci0+cGFyZW50OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX2RpcjsKKyAgICAgICAgICAgICpwX25hbWUgPSBuYW1lICsgc3RybGVuKEJDTUNMSV9VUF9TVFIpICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9UT0tFTl9OQU1FOgorICAgICAgICBjYXNlIEJDTUNMSV9UT0tFTl9WQUxVRToKKyAgICAgICAgICAgIC8qIENoZWNrIGFsaWFzICovCisgICAgICAgICAgICBwX3Rva2VuID0gcF9kaXItPnUuZGlyLmZpcnN0OworICAgICAgICAgICAgd2hpbGUgKCBwX3Rva2VuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocF90b2tlbi0+YWxpYXMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lX2xlbiA9PSBwX3Rva2VuLT5hbGlhc19sZW4pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhX2JjbWNsaV9zdHJpY21wKHBfdG9rZW4tPmFsaWFzLCBuYW1lLCBwX3Rva2VuLT5hbGlhc19sZW4pKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwX3Rva2VuID0gcF90b2tlbi0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcF90b2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfZW50cnkgKnBhcnRpYWxfbWF0Y2ggPSBOVUxMOworICAgICAgICAgICAgICAgIC8qIENoZWNrIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBwX3Rva2VuID0gcF9kaXItPnUuZGlyLmZpcnN0OworICAgICAgICAgICAgICAgIHdoaWxlKCBwX3Rva2VuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghX2JjbWNsaV9zdHJpY21wKHBfdG9rZW4tPm5hbWUsIG5hbWUsIG5hbWVfbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVfbGVuID09IHN0cmxlbihwX3Rva2VuLT5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFydGlhbF9tYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsX21hdGNoID0gcF90b2tlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwX3Rva2VuID0gcF90b2tlbi0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFwX3Rva2VuKQorICAgICAgICAgICAgICAgICAgICBwX3Rva2VuID0gcGFydGlhbF9tYXRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwX25hbWUgPSBuYW1lICsgbmFtZV9sZW4gKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcF90b2tlbjsKK30KKworCisvKiBTZWFyY2ggYSB0b2tlbiBieSBuYW1lIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqIFRoZSBuYW1lIGNhbiBiZSBxdWFsaWZpZWQgKGNvbnRhaW4gcGF0aCkKKyAqLworc3RhdGljIGJjbWNsaV9lbnRyeSAqX2JjbWNsaV9zZWFyY2hfdG9rZW4oIGJjbWNsaV9lbnRyeSAqcF9kaXIsIGNvbnN0IGNoYXIgKm5hbWUgKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbjsKKyAgICBjb25zdCBjaGFyICpuYW1lMCA9IG5hbWU7CisgICAgY29uc3QgY2hhciAqcF9zbGFzaDsKKworICAgIGlmICghbmFtZVswXSkKKyAgICAgICAgcmV0dXJuIHBfZGlyOworCisgICAgLyogQ2hlY2sgaWYgbmFtZSBpcyBxdWFsaWZpZWQgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgcF9zbGFzaCA9IHN0cmNocihuYW1lLCAnLycpOworICAgICAgICBpZiAocF9zbGFzaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfc2xhc2ggPT0gbmFtZTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9kaXIgPSBwX3Rva2VuID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICAgICAgICAgICAgICBuYW1lID0gcF9zbGFzaCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF90b2tlbiA9IF9iY21jbGlfc2VhcmNoX3Rva2VuMShwX2RpciwgJm5hbWUsIHBfc2xhc2ggLSBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocF90b2tlbiAmJiAocF90b2tlbi0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIpKQorICAgICAgICAgICAgICAgICAgICBwX2RpciA9IHBfdG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwX3Rva2VuID0gX2JjbWNsaV9zZWFyY2hfdG9rZW4xKHBfZGlyLCAmbmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHBfc2xhc2ggJiYgcF90b2tlbiAmJiAqbmFtZSk7CisKKyAgICByZXR1cm4gcF90b2tlbjsKK30KKworCisKKy8qIERpc3BsYXkgaGVscCBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KK3N0YXRpYyB2b2lkICBfYmNtY2xpX2hlbHBfZGlyKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF9kaXIpCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKmhlbHBfc2Vzc2lvbiA9IF9iY21jbGlfaGVscF9zZXNzaW9uX29wZW4obW9uX3Nlc3Npb24tPnNlc3Npb24pOworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbjsKKyAgICBjaGFyIGJ1ZmZlcltCQ01DTElfTUFYX1FVQUxfTkFNRV9MRU5HVEhdOworCisgICAgX2JjbWNsaV9xdWFsaWZpZWRfbmFtZShwX2RpciwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiRGlyZWN0b3J5ICVzLyAtICVzXG4iLCBidWZmZXIsIHBfZGlyLT5oZWxwKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICJDb21tYW5kczpcbiIpOworCisgICAgcF90b2tlbiA9IHBfZGlyLT51LmRpci5maXJzdDsKKyAgICB3aGlsZSAoIHBfdG9rZW4gKQorICAgIHsKKyAgICAgICAgaWYgKGJjbWNsaV9zZXNzaW9uX2FjY2Vzc19yaWdodChoZWxwX3Nlc3Npb24pID49IHBfdG9rZW4tPmFjY2Vzc19yaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfdG9rZW4tPnNlbCA9PSBCQ01DTElfRU5UUllfRElSKQorICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIlx0JXMvOiAgJXMgZGlyZWN0b3J5XG4iLCBwX3Rva2VuLT5uYW1lLCBwX3Rva2VuLT5oZWxwICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqcGVvbCA9IHN0cmNocihwX3Rva2VuLT5oZWxwLCAnXG4nKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVscF9sZW4gPSBwZW9sID8gcGVvbCAtIHBfdG9rZW4tPmhlbHAgOiAoaW50KXN0cmxlbihwX3Rva2VuLT5oZWxwKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICJcdCVzKCVkIHBhcm1zKTogJS4qc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Rva2VuLT5uYW1lLCBwX3Rva2VuLT51LmNtZC5udW1fcGFybXMsIGhlbHBfbGVuLCBwX3Rva2VuLT5oZWxwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcF90b2tlbiA9IHBfdG9rZW4tPm5leHQ7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIlR5cGUgPyA8bmFtZT4gZm9yIGNvbW1hbmQgaGVscCwgXCIvXCItcm9vdCwgXCIuLlwiLXVwcGVyXG4iICk7CisgICAgX2JjbWNsaV9oZWxwX3Nlc3Npb25fcHJpbnRfYW5kX2Nsb3NlKG1vbl9zZXNzaW9uLT5zZXNzaW9uLCBoZWxwX3Nlc3Npb24pOworfQorCisKKy8qIERpc3BsYXkgaGVscCBhIHRva2VuICovCitzdGF0aWMgdm9pZCBfYmNtY2xpX2hlbHBfcG9wdWxhdGVkX2NtZChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKnBfdG9rZW4sCisgICAgY29uc3QgY2hhciAqcGFydGlhbF9tYXRjaCwgYmNtb3NfYm9vbCBzdXBwcmVzc19hc3NpZ25lZCkKK3sKKyAgICBjaGFyIHRtcFs4MF07CisgICAgY2hhciBicmEsIGtldDsKKyAgICB1aW50MTZfdCBpOworCisgICAgaWYgKHN1cHByZXNzX2Fzc2lnbmVkKQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlxuIik7CisgICAgZm9yICggaT0wOyBpPG1vbl9zZXNzaW9uLT5udW1fcGFybXM7IGkrKyApCisgICAgeworICAgICAgICBiY21jbGlfY21kX3Bhcm0gKmN1cl9wYXJtID0gJm1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV07CisgICAgICAgIGlmIChzdXBwcmVzc19hc3NpZ25lZCAmJiAoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHBhcnRpYWxfbWF0Y2ggJiYgbWVtY21wKHBhcnRpYWxfbWF0Y2gsIGN1cl9wYXJtLT5uYW1lLCBzdHJsZW4ocGFydGlhbF9tYXRjaCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJhID0gJ1snOworICAgICAgICAgICAga2V0PSddJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyYSA9ICc8JzsKKyAgICAgICAgICAgIGtldD0nPic7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJcdCVjJXMoJXMpIiwgYnJhLCBjdXJfcGFybS0+bmFtZSwgX2JjbWNsaV9nZXRfdHlwZV9uYW1lKGN1cl9wYXJtKSApOworICAgICAgICBpZiAoY3VyX3Bhcm0tPm1heF9hcnJheV9zaXplIHx8IGN1cl9wYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0JVRkZFUikKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbnVtX2VudHJpZXMgPSAoY3VyX3Bhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fQlVGRkVSKSA/IGN1cl9wYXJtLT52YWx1ZS5idWZmZXIubGVuIDogY3VyX3Bhcm0tPm1heF9hcnJheV9zaXplOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJbJXVdIiwgbnVtX2VudHJpZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9FTlVNIHx8IGN1cl9wYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU1fTUFTSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM9Y3VyX3Bhcm0tPmVudW1fdGFibGU7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiB7Iik7CisgICAgICAgICAgICB3aGlsZSAodmFsdWVzLT5uYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMhPWN1cl9wYXJtLT5lbnVtX3RhYmxlKQorICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiwgIik7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICIlcyIsIHZhbHVlcy0+bmFtZSk7CisgICAgICAgICAgICAgICAgKyt2YWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIn0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICI9Iik7CisgICAgICAgICAgICBjdXJfcGFybS0+Zm9ybWF0X2NiKGN1cl9wYXJtLCBjdXJfcGFybS0+dmFsdWUsIHRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICIlcyIsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX1JBTkdFKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Bhcm1fdmFsdWUgbG93X3ZhbCA9IHsgLm51bWJlciA9IGN1cl9wYXJtLT5sb3dfdmFsIH07CisgICAgICAgICAgICBiY21jbGlfcGFybV92YWx1ZSBoaV92YWwgPSB7IC5udW1iZXIgPSBjdXJfcGFybS0+aGlfdmFsIH07CisKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiICgiKTsKKyAgICAgICAgICAgIGN1cl9wYXJtLT5mb3JtYXRfY2IoY3VyX3Bhcm0sIGxvd192YWwsIHRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICIlcy4uIiwgdG1wKTsKKyAgICAgICAgICAgIGN1cl9wYXJtLT5mb3JtYXRfY2IoY3VyX3Bhcm0sIGhpX3ZhbCwgdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzKSIsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICIlYyAiLCBrZXQpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIi0gJXNcbiIsIGN1cl9wYXJtLT5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgLyogUHJpbnQgZXh0cmEgaGVscCBpZiBjb21tYW5kIGhhcyB1bnJlc29sdmVkIHNlbGVjdG9yICovCisgICAgaWYgKG1vbl9zZXNzaW9uLT5udW1fcGFybXMgJiYKKyAgICAgICAgKG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbbW9uX3Nlc3Npb24tPm51bV9wYXJtcy0xXS5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpICYmCisgICAgICAgICEobW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdLmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpzZWxfbmFtZSA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbbW9uX3Nlc3Npb24tPm51bV9wYXJtcy0xXS5uYW1lOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIkFkZCAlcz0lc192YWx1ZSB0byBzZWUgJXMtc3BlY2lmaWMgcGFyYW1ldGVyc1xuIiwKKyAgICAgICAgICAgIHNlbF9uYW1lLCBzZWxfbmFtZSwgc2VsX25hbWUpOworICAgIH0KKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlxuIik7Cit9CisKKworLyogRGlzcGxheSBoZWxwIGEgdG9rZW4gKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfaGVscF9lbnRyeShiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKnBfdG9rZW4sCisgICAgYmNtY2xpX25hbWVfdmFsdWUgKnBhaXJzLCBpbnQgbnBhaXJzLCBiY21vc19ib29sIHN1cHByZXNzX2Vycl9wcmludCkKK3sKKyAgICBjaGFyIGJ1ZmZlcltCQ01DTElfTUFYX1FVQUxfTkFNRV9MRU5HVEhdOworCisgICAgaWYgKHBfdG9rZW4tPnNlbCA9PSBCQ01DTElfRU5UUllfRElSKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9oZWxwX2Rpcihtb25fc2Vzc2lvbiwgcF90b2tlbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBQb3B1bGF0ZSBwYXJhbWV0ZXIgdGFibGUgKi8KKyAgICBfYmNtY2xpX3BvcHVsYXRlX3Bhcm1zKG1vbl9zZXNzaW9uLCBwX3Rva2VuLCBwYWlycywgbnBhaXJzLCBzdXBwcmVzc19lcnJfcHJpbnQsIE5VTEwpOworCisgICAgX2JjbWNsaV9xdWFsaWZpZWRfbmFtZShwX3Rva2VuLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzOiBcdCVzXG4iLCBidWZmZXIsIHBfdG9rZW4tPmhlbHAgKTsKKyAgICBpZiAocF90b2tlbi0+dS5jbWQubnVtX3Bhcm1zKQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlBhcmFtZXRlcnM6XG4iKTsKKyAgICBfYmNtY2xpX2hlbHBfcG9wdWxhdGVkX2NtZChtb25fc2Vzc2lvbiwgcF90b2tlbiwgTlVMTCwgQkNNT1NfRkFMU0UpOworICAgIF9iY21jbGlfZnJlZV9zZXNzaW9uX3ZhbHVlX3N0YXR1cyhtb25fc2Vzc2lvbik7Cit9CisKKworLyogQ2hvb3NlIHVuaXF1ZSBhbGlhcyBmb3IgPG5hbWU+IGluIDxwX2Rpcj4gKi8KKy8qIEN1cnJlbnRseSBvbmx5IHNpbmdsZS1jaGFyYWN0ZXIgYWxpYXNlcyBhcmUgc3VwcG9ydGVkICovCitzdGF0aWMgdm9pZCBfX2JjbWNsaV9jaG9vc2VBbGlhcyhiY21jbGlfZW50cnkgKnBfZGlyLCBiY21jbGlfZW50cnkgKnBfbmV3X3Rva2VuLCBpbnQgZnJvbSkKK3sKKyAgICBiY21jbGlfZW50cnkgKnBfdG9rZW47CisgICAgaW50ICAgICAgICAgaTsKKyAgICBjaGFyICAgICAgICBjOworCisgICAgX2JjbWNsaV9zdHJsd3IoIHBfbmV3X3Rva2VuLT5uYW1lICk7CisgICAgaSA9IGZyb207CisgICAgd2hpbGUgKCBwX25ld190b2tlbi0+bmFtZVtpXSApCisgICAgeworICAgICAgICBjID0gcF9uZXdfdG9rZW4tPm5hbWVbaV07CisgICAgICAgIHBfdG9rZW4gPSBwX2Rpci0+dS5kaXIuZmlyc3Q7CisKKyAgICAgICAgd2hpbGUgKCBwX3Rva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfdG9rZW4tPmFsaWFzICYmCisgICAgICAgICAgICAgICAgICAgICh0b2xvd2VyKCAqcF90b2tlbi0+YWxpYXMgKSA9PSBjKSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoc3RybGVuKHBfdG9rZW4tPm5hbWUpPD0yICYmIHRvbG93ZXIocF90b2tlbi0+bmFtZVswXSk9PWMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwX3Rva2VuID0gcF90b2tlbi0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAocF90b2tlbikKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwX25ld190b2tlbi0+bmFtZVtpXSA9IHRvdXBwZXIoIGMgKTsKKyAgICAgICAgICAgIHBfbmV3X3Rva2VuLT5hbGlhcyAgID0gJnBfbmV3X3Rva2VuLT5uYW1lW2ldOworICAgICAgICAgICAgcF9uZXdfdG9rZW4tPmFsaWFzX2xlbiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogaXN1cHBlciB3cmFwcGVyICovCitzdGF0aWMgaW5saW5lIGludCBfYmNtY2xpX2lzdXBwZXIoY2hhciBjKQoreworICAgIHJldHVybiBpc3VwcGVyKChpbnQpYyk7Cit9CisKK3N0YXRpYyB2b2lkIF9iY21jbGlfY2hvb3NlX2FsaWFzKGJjbWNsaV9lbnRyeSAqcF9kaXIsIGJjbWNsaV9lbnRyeSAqcF9uZXdfdG9rZW4pCit7CisgICAgaW50IGk9MDsKKyAgICBwX25ld190b2tlbi0+YWxpYXNfbGVuID0gMDsKKyAgICBwX25ld190b2tlbi0+YWxpYXMgPSBOVUxMOworICAgIC8qIERvbid0IHRyeSB0byBhbGlhcyBzb21ldGhpbmcgc2hvcnQgKi8KKyAgICBpZiAoc3RybGVuKHBfbmV3X3Rva2VuLT5uYW1lKSA8IEJDTUNMSV9NSU5fTkFNRV9MRU5HVEhfRk9SX0FMSUFTKQorICAgICAgICByZXR1cm47CisgICAgLyogVHJ5IHByZS1zZXQgYWxpYXMgMXN0ICovCisgICAgd2hpbGUgKCBwX25ld190b2tlbi0+bmFtZVtpXSApCisgICAgeworICAgICAgICBpZiAoX2JjbWNsaV9pc3VwcGVyKHBfbmV3X3Rva2VuLT5uYW1lW2ldKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpKys7CisgICAgfQorICAgIGlmIChwX25ld190b2tlbi0+bmFtZVtpXSkKKyAgICAgICAgX19iY21jbGlfY2hvb3NlQWxpYXMocF9kaXIsIHBfbmV3X3Rva2VuLCBpKTsKKyAgICBpZiAocF9uZXdfdG9rZW4tPmFsaWFzICE9ICZwX25ld190b2tlbi0+bmFtZVtpXSkKKyAgICAgICAgX19iY21jbGlfY2hvb3NlQWxpYXMocF9kaXIsIHBfbmV3X3Rva2VuLCAwKTsKK30KKworCisvKiBDb252ZXJ0IHN0cmluZyBzIHRvIGxvd2VyIGNhc2UuIFJldHVybiBwb2ludGVyIHRvIHMgKi8KK3N0YXRpYyBjaGFyICAqIF9iY21jbGlfc3RybHdyKCBjaGFyICpzICkKK3sKKyAgICBjaGFyICAqczA9czsKKworICAgIHdoaWxlICggKnMgKQorICAgIHsKKyAgICAgICAgKnMgPSB0b2xvd2VyKCAqcyApOworICAgICAgICArK3M7CisgICAgfQorCisgICAgcmV0dXJuIHMwOworfQorCisKKy8qIENvbXBhcmUgc3RyaW5ncyBjYXNlIGluY2Vuc2l0aXZlICovCitzdGF0aWMgaW50IF9iY21jbGlfc3RyaWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBsZW4pCit7CisgICAgaW50ICBpOworCisgICAgZm9yICggaT0wOyAoaTxsZW4gfHwgbGVuPDApOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKHRvbG93ZXIoIHMxW2ldKSAgIT0gdG9sb3dlciggczJbaV0gKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBpZiAoIXMxW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfYmNtY2xpX2dldF90eXBlX25hbWUoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtKQoreworICAgIGJjbWNsaV9wYXJtX3R5cGUgdHlwZSA9IHBhcm0tPnR5cGU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZVtdID0geworICAgICAgICBbQkNNQ0xJX1BBUk1fREVDSU1BTF0gICAgPSAiZGVjaW1hbCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9ERUNJTUFMNjRdICA9ICJkZWNpbWFsNjQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fVURFQ0lNQUxdICAgPSAidWRlY2ltYWwiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fVURFQ0lNQUw2NF0gPSAidWRlY2ltYWw2NCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9IRVhdICAgICAgICA9ICJoZXgiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fSEVYNjRdICAgICAgPSAiaGV4NjQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fTlVNQkVSXSAgICAgPSAibnVtYmVyIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX05VTUJFUjY0XSAgID0gIm51bWJlcjY0IiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX1VOVU1CRVJdICAgID0gInVudW1iZXIiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fVU5VTUJFUjY0XSAgPSAidW51bWJlcjY0IiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0ZMT0FUXSAgICAgID0gImZsb2F0IiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0RPVUJMRV0gICAgID0gImRvdWJsZSIsCisgICAgICAgIFtCQ01DTElfUEFSTV9FTlVNXSAgICAgICA9ICJlbnVtIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0VOVU1fTUFTS10gID0gImVudW1fbWFzayIsCisgICAgICAgIFtCQ01DTElfUEFSTV9TVFJJTkddICAgICA9ICJzdHJpbmciLAorICAgICAgICBbQkNNQ0xJX1BBUk1fSVBdICAgICAgICAgPSAiSVAiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fSVBWNl0gICAgICAgPSAiSVB2NiIsCisgICAgICAgIFtCQ01DTElfUEFSTV9NQUNdICAgICAgICA9ICJNQUMiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fQlVGRkVSXSAgICAgPSAiYnVmZmVyIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX1VTRVJERUZdICAgID0gInVzZXJkZWYiLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnVuZGVmaW5lZCA9ICJ1bmRlZmluZWQiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzZWxlY3RvciA9ICJzZWxlY3RvciI7CisgICAgaWYgKHR5cGUgPiBCQ01DTElfUEFSTV9VU0VSREVGIHx8ICF0eXBlX25hbWVbdHlwZV0pCisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgaWYgKHR5cGUgPT0gQkNNQ0xJX1BBUk1fRU5VTSAmJiAocGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SKSkKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yOworICAgIHJldHVybiB0eXBlX25hbWVbdHlwZV07Cit9CisKKy8qIEFzc2lnbiBkZWZhdWx0IGNhbGxiYWNrcyAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9hc3NpZ25fY2FsbGJhY2tzKGJjbWNsaV9jbWRfcGFybSAqcGFybSkKK3sKKyAgICBpZiAocGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9FTlVNKQorICAgIHsKKyAgICAgICAgcGFybS0+c2Nhbl9jYiA9IF9iY21jbGlfZW51bV9zY2FuX2NiOworICAgICAgICBwYXJtLT5mb3JtYXRfY2IgPSBfYmNtY2xpX2VudW1fZm9ybWF0X2NiOworICAgIH0KKyAgICBlbHNlIGlmIChwYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU1fTUFTSykKKyAgICB7CisgICAgICAgIHBhcm0tPnNjYW5fY2IgPSBfYmNtY2xpX2VudW1fbWFza19zY2FuX2NiOworICAgICAgICBwYXJtLT5mb3JtYXRfY2IgPSBfYmNtY2xpX2VudW1fbWFza19mb3JtYXRfY2I7CisgICAgfQorICAgIGVsc2UgaWYgKHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fQlVGRkVSKQorICAgIHsKKyAgICAgICAgaWYgKCFwYXJtLT5zY2FuX2NiKQorICAgICAgICAgICAgcGFybS0+c2Nhbl9jYiA9IF9iY21jbGlfYnVmZmVyX3NjYW5fY2I7CisgICAgICAgIGlmICghcGFybS0+Zm9ybWF0X2NiKQorICAgICAgICAgICAgcGFybS0+Zm9ybWF0X2NiID0gX2JjbWNsaV9kZnRfZm9ybWF0X2NiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIXBhcm0tPnNjYW5fY2IpCisgICAgICAgICAgICBwYXJtLT5zY2FuX2NiID0gX2JjbWNsaV9kZnRfc2Nhbl9jYjsKKyAgICAgICAgaWYgKCFwYXJtLT5mb3JtYXRfY2IpCisgICAgICAgICAgICBwYXJtLT5mb3JtYXRfY2IgPSBfYmNtY2xpX2RmdF9mb3JtYXRfY2I7CisgICAgfQorfQorCisKKy8qIENvbnZlcnQgaGV4LXN0cmluZyB0byBiaW5hcnkgZGF0YS4KKyAqIFJldHVybnM6IGNvbnZlcnRlZCBsZW5ndGggPj0wIG9yIGVycm9yIDwgMAorICovCitzdGF0aWMgaW50IF9iY21jbGlfc3RyaGV4KGNvbnN0IGNoYXIgKnNyYywgdWludDhfdCAqZHN0LCB1aW50MTZfdCBkc3RfbGVuKQoreworICAgIHVpbnQxNl90IHNyY19sZW4gPSAodWludDE2X3Qpc3RybGVuKCBzcmMgKTsKKyAgICB1aW50MTZfdCBpID0gc3JjX2xlbiwgaiwgc2hpZnQgPSAwOworCisgICAgaWYgKCAhZHN0IHx8ICFkc3RfbGVuIHx8IChzcmNfbGVuID4gMipkc3RfbGVuKSB8fCAoc3JjX2xlbiUyKSApCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBoZXggYnVmZmVyIGxlbmd0aCBhbmQgZmlsbCBpdCB1cCBmcm9tIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBpbiBvcmRlciB0byBzdGFydCB0aGUgcHJvY2VzcyBmcm9tIExTIG5pYmJsZQorICAgICAqLworICAgIGRzdF9sZW4gPSBzcmNfbGVuIC8gMjsKKyAgICBtZW1zZXQoZHN0LCAwLCBkc3RfbGVuKTsKKyAgICBqID0gZHN0X2xlbi0xOworICAgIGRvCisgICAgeworICAgICAgICBpbnQgYyA9IHNyY1stLWldOworCisgICAgICAgIGlmICggKGM+PScwJykgJiYgKGM8PSc5JykgKQorICAgICAgICB7CisgICAgICAgICAgICBjID0gYyAtICcwJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKGM+PSdhJykgJiYgKGM8PSdmJykgKQorICAgICAgICB7CisgICAgICAgICAgICBjID0gMHhBICsgYyAtICdhJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKGM+PSdBJykgJiYgKGM8PSdGJykgKQorICAgICAgICB7CisgICAgICAgICAgICBjID0gMHhBICsgYyAtICdBJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBkc3Rbal0gfD0gKHVpbnQ4X3QpKGM8PHNoaWZ0KTsgLyogc2hpZnQgY2FuIGhhdmUgMSBvZiAyIHZhbHVlczogMCBhbmQgNCAqLworCisgICAgICAgIGogICAgIC09IHNoaWZ0Pj4yOyAgICAgICAgICAgICAgLyogbW92ZSB0byB0aGUgbmV4dCBieXRlIGlmIHdlJ3ZlIGp1c3QgZmlsbGVkIHRoZSBtcyBuaWJibGUgKi8KKyAgICAgICAgc2hpZnQgXj0gNDsgICAgICAgICAgICAgICAgICAgICAvKiBhbHRlcm5hdGUgbmliYmxlcyAqLworCisgICAgfSB3aGlsZSAoIGkgKTsKKworICAgIHJldHVybiBkc3RfbGVuOworfQorCisvKiBEZWZhdWx0IGZ1bmN0aW9uIGZvciBzdHJpbmctPnZhbHVlIGNvbnZlcnNpb24uCisgKiBSZXR1cm5zIDAgaWYgT0sKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZGZ0X3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpCit7CisgICAgY2hhciAqcF9lbmQgPSBOVUxMOworICAgIGludCBuOworCisgICAgaWYgKHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fVURFQ0lNQUwgfHwKKyAgICAgICAgcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9VREVDSU1BTDY0IHx8CisgICAgICAgIHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fVU5VTUJFUiB8fAorICAgICAgICBwYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX1VOVU1CRVI2NCkKKyAgICB7CisgICAgICAgIC8qIHN0cnRvdWwgcmV0dXJucyBPSyBldmVuIHdoZW4gcGFyc2luZyBhIG5lZ2F0aXZlIG51bWJlciAqLworICAgICAgICBpZiAoc3RyaW5nX3ZhbFswXSA9PSAnLScpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2gocGFybS0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fREVDSU1BTDoKKyAgICAgICAgICAgIHZhbHVlLT5udW1iZXIgPSBzdHJ0b2woc3RyaW5nX3ZhbCwgJnBfZW5kLCAxMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9VREVDSU1BTDoKKyAgICAgICAgICAgIHZhbHVlLT51bnVtYmVyID0gc3RydG91bChzdHJpbmdfdmFsLCAmcF9lbmQsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0RFQ0lNQUw2NDoKKyAgICAgICAgICAgIHZhbHVlLT5udW1iZXI2NCA9IHN0cnRvbGwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAxMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9VREVDSU1BTDY0OgorICAgICAgICAgICAgdmFsdWUtPnVudW1iZXI2NCA9IHN0cnRvdWxsKHN0cmluZ192YWwsICZwX2VuZCwgMTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSEVYOgorICAgICAgICAgICAgdmFsdWUtPnVudW1iZXIgPSBzdHJ0b3VsKHN0cmluZ192YWwsICZwX2VuZCwgMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSEVYNjQ6CisgICAgICAgICAgICB2YWx1ZS0+dW51bWJlcjY0ID0gc3RydG91bGwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9OVU1CRVI6CisgICAgICAgICAgICB2YWx1ZS0+bnVtYmVyID0gc3RydG9sKHN0cmluZ192YWwsICZwX2VuZCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9VTlVNQkVSOgorICAgICAgICAgICAgdmFsdWUtPnVudW1iZXIgPSBzdHJ0b3VsKHN0cmluZ192YWwsICZwX2VuZCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9OVU1CRVI2NDoKKyAgICAgICAgICAgIHZhbHVlLT5udW1iZXI2NCA9IHN0cnRvbGwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VOVU1CRVI2NDoKKyAgICAgICAgICAgIHZhbHVlLT51bnVtYmVyNjQgPSBzdHJ0b3VsbChzdHJpbmdfdmFsLCAmcF9lbmQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fRkxPQVQ6CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fRE9VQkxFOgorICAgICAgICAgICAgdmFsdWUtPmQgPSBzdHJ0b2Qoc3RyaW5nX3ZhbCwgJnBfZW5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX01BQzoKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgbTAsIG0xLCBtMiwgbTMsIG00LCBtNTsKKyAgICAgICAgICAgIG4gPSBzc2NhbmYoc3RyaW5nX3ZhbCwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICAmbTAsICZtMSwgJm0yLCAmbTMsICZtNCwgJm01KTsKKyAgICAgICAgICAgIGlmIChuICE9IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbiA9IHNzY2FuZihzdHJpbmdfdmFsLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgJm0wLCAmbTEsICZtMiwgJm0zLCAmbTQsICZtNSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiAhPSA2KQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICBpZiAobTAgPiAyNTUgfHwgbTEgPiAyNTUgfHwgbTIgPiAyNTUgfHwgbTMgPiAyNTUgfHwgbTQgPiAyNTUgfHwgbTUgPiAyNTUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIHZhbHVlLT5tYWMudThbMF0gPSBtMDsKKyAgICAgICAgICAgIHZhbHVlLT5tYWMudThbMV0gPSBtMTsKKyAgICAgICAgICAgIHZhbHVlLT5tYWMudThbMl0gPSBtMjsKKyAgICAgICAgICAgIHZhbHVlLT5tYWMudThbM10gPSBtMzsKKyAgICAgICAgICAgIHZhbHVlLT5tYWMudThbNF0gPSBtNDsKKyAgICAgICAgICAgIHZhbHVlLT5tYWMudThbNV0gPSBtNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuMSwgbjIsIG4zLCBuNDsKKyAgICAgICAgICAgIG4gPSBzc2NhbmYoc3RyaW5nX3ZhbCwgIiVkLiVkLiVkLiVkIiwgJm4xLCAmbjIsICZuMywgJm40KTsKKyAgICAgICAgICAgIGlmIChuICE9IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpbjEgPiAyNTUgfHwgKHVuc2lnbmVkKW4yID4gMjU1IHx8ICh1bnNpZ25lZCluMyA+IDI1NSB8fCAodW5zaWduZWQpbjQgPiAyNTUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIHZhbHVlLT51bnVtYmVyID0gKG4xIDw8IDI0KSB8IChuMiA8PCAxNikgfCAobjMgPDwgOCkgfCBuNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlmIChwX2VuZCAmJiAqcF9lbmQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIF9iY21jbGlfZGZ0X2Zvcm1hdF9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlLCBjaGFyICpidWZmZXIsIGludCBzaXplKQoreworICAgIHN3aXRjaChwYXJtLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9ERUNJTUFMOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWxkIiwgdmFsdWUubnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VERUNJTUFMOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWx1IiwgdmFsdWUudW51bWJlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9ERUNJTUFMNjQ6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbGxkIiwgdmFsdWUubnVtYmVyNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fVURFQ0lNQUw2NDoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVsbHUiLCB2YWx1ZS51bnVtYmVyNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSEVYOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiMHglbHgiLCB2YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0hFWDY0OgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiMHglbGx4IiwgdmFsdWUudW51bWJlcjY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX05VTUJFUjoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVsZCIsIHZhbHVlLm51bWJlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9OVU1CRVI2NDoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVsbGQiLCB2YWx1ZS5udW1iZXI2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9VTlVNQkVSOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWx1IiwgdmFsdWUudW51bWJlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9VTlVNQkVSNjQ6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbGx1IiwgdmFsdWUudW51bWJlcjY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0ZMT0FUOgorICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0RPVUJMRToKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVmIiwgdmFsdWUuZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9TVFJJTkc6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlcyIsIHZhbHVlLnN0cmluZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9NQUM6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisgICAgICAgICAgICAgICAgcGFybS0+dmFsdWUubWFjLnU4WzBdLCBwYXJtLT52YWx1ZS5tYWMudThbMV0sIHBhcm0tPnZhbHVlLm1hYy51OFsyXSwKKyAgICAgICAgICAgICAgICBwYXJtLT52YWx1ZS5tYWMudThbM10sIHBhcm0tPnZhbHVlLm1hYy51OFs0XSwgcGFybS0+dmFsdWUubWFjLnU4WzVdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0lQOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWQuJWQuJWQuJWQiLAorICAgICAgICAgICAgICAgIChpbnQpKChwYXJtLT52YWx1ZS51bnVtYmVyID4+IDI0KSAmIDB4ZmYpLCAoaW50KSgocGFybS0+dmFsdWUudW51bWJlciA+PiAxNikgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAoaW50KSgocGFybS0+dmFsdWUudW51bWJlciA+PiA4KSAmIDB4ZmYpLCAoaW50KShwYXJtLT52YWx1ZS51bnVtYmVyICYgMHhmZikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGJ1ZmZlciwgIip1bmtub3duKiIsIHNpemUpOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZW51bV9zY2FuX2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsKQoreworICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFsdWVzPXBhcm0tPmVudW1fdGFibGU7CisgICAgd2hpbGUgKHZhbHVlcy0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICghX2JjbWNsaV9zdHJpY21wKHZhbHVlcy0+bmFtZSwgc3RyaW5nX3ZhbCwgLTEpKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZS0+ZW51bV92YWwgPSB2YWx1ZXMtPnZhbDsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisgICAgICAgICsrdmFsdWVzOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworfQorCitzdGF0aWMgdm9pZCBfYmNtY2xpX2VudW1fZm9ybWF0X2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsdWUsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpCit7CisgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM9cGFybS0+ZW51bV90YWJsZTsKKyAgICB3aGlsZSAodmFsdWVzLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlcy0+dmFsID09IHZhbHVlLmVudW1fdmFsKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrdmFsdWVzOworICAgIH0KKyAgICBpZiAodmFsdWVzLT5uYW1lKQorICAgICAgICBzdHJuY3B5KGJ1ZmZlciwgdmFsdWVzLT5uYW1lLCBzaXplKTsKKyAgICBlbHNlCisgICAgICAgIHN0cm5jcHkoYnVmZmVyLCAiKmludmFsaWQqIiwgc2l6ZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2VudW1fbWFza19zY2FuX2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsKQoreworICAgIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbDE7CisgICAgY2hhciAqZGVsOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIHZhbHVlLT5udW1iZXIgPSAwOworCisgICAgLyogc3RyaW5nX3ZhbCBpcyBhIGNvbWJpbmF0aW9uIG9mIGVudW0gdmFsdWVzIHNlcGFyYXRlZCBieSBCQ01DTElfRU5VTV9NQVNLX0RFTF9TVFIgKi8KKyAgICBkZWwgPSBzdHJjaHIoc3RyaW5nX3ZhbCwgQkNNQ0xJX0VOVU1fTUFTS19ERUxfQ0hBUik7CisgICAgd2hpbGUgKGRlbCkKKyAgICB7CisgICAgICAgIGNoYXIgc2luZ2xlX3ZhbFs2NF07CisgICAgICAgIGlmIChkZWwgLSBzdHJpbmdfdmFsID49IHNpemVvZihzaW5nbGVfdmFsKSkKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICBtZW1jcHkoc2luZ2xlX3ZhbCwgc3RyaW5nX3ZhbCwgZGVsIC0gc3RyaW5nX3ZhbCk7CisgICAgICAgIHNpbmdsZV92YWxbZGVsIC0gc3RyaW5nX3ZhbF0gPSAwOworICAgICAgICBlcnIgPSBfYmNtY2xpX2VudW1fc2Nhbl9jYihwYXJtLCAmdmFsMSwgc2luZ2xlX3ZhbCk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB2YWx1ZS0+ZW51bV92YWwgfD0gdmFsMS5lbnVtX3ZhbDsKKyAgICAgICAgc3RyaW5nX3ZhbCA9IGRlbCsxOworICAgICAgICBkZWwgPSBzdHJjaHIoc3RyaW5nX3ZhbCwgQkNNQ0xJX0VOVU1fTUFTS19ERUxfQ0hBUik7CisgICAgfQorICAgIGVyciA9IF9iY21jbGlfZW51bV9zY2FuX2NiKHBhcm0sICZ2YWwxLCBzdHJpbmdfdmFsKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIHZhbHVlLT5udW1iZXIgfD0gdmFsMS5lbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV9lbnVtX21hc2tfZm9ybWF0X2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsdWUsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpCit7CisgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM9cGFybS0+ZW51bV90YWJsZTsKKyAgICBjb25zdCBjaGFyICpub25lID0gTlVMTDsKKyAgICAqYnVmZmVyID0gMDsKKyAgICB3aGlsZSAodmFsdWVzLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlcy0+dmFsID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vbmUgPSB2YWx1ZXMtPm5hbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh2YWx1ZXMtPnZhbCAmIHZhbHVlLmVudW1fdmFsKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKmJ1ZmZlcikKKyAgICAgICAgICAgICAgICBzdHJuY2F0KGJ1ZmZlciwgQkNNQ0xJX0VOVU1fTUFTS19ERUxfU1RSLCBzaXplIC0gc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgc3RybmNhdChidWZmZXIsIHZhbHVlcy0+bmFtZSwgc2l6ZSAtIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgfQorICAgICAgICArK3ZhbHVlczsKKyAgICB9CisgICAgaWYgKCEgKmJ1ZmZlcikKKyAgICAgICAgc3RybmNweShidWZmZXIsIE5VTEwgIT0gbm9uZSA/IG5vbmUgOiAiMCIsIHNpemUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9idWZmZXJfc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCkKK3sKKyAgICBpbnQgbjsKKworICAgIGlmICghdmFsdWUtPmJ1ZmZlci5zdGFydCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB2YWx1ZS0+YnVmZmVyLmN1cnIgPSB2YWx1ZS0+YnVmZmVyLnN0YXJ0OworICAgIGlmIChzdHJjbXAoc3RyaW5nX3ZhbCwgIi0iKSA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIG4gPSBfYmNtY2xpX3N0cmhleChzdHJpbmdfdmFsLCB2YWx1ZS0+YnVmZmVyLnN0YXJ0LCB2YWx1ZS0+YnVmZmVyLmxlbik7CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gbjsKKyAgICBiY21vbHRfYnVmX3NraXAoJnZhbHVlLT5idWZmZXIsIG4pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfYmNtY2xpX3F1YWxpZmllZF9uYW1lKGJjbWNsaV9lbnRyeSAqdG9rZW4sIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUgKQoreworICAgIGJjbWNsaV9lbnRyeSAqcGFyZW50ID0gdG9rZW4tPnBhcmVudDsKKyAgICBjaGFyIHF1YWxfbmFtZVtCQ01DTElfTUFYX1FVQUxfTkFNRV9MRU5HVEhdOworICAgICpidWZmZXI9MDsKKyAgICB3aGlsZSAocGFyZW50KQorICAgIHsKKyAgICAgICAgYmNtY2xpX3N0cm5jcHkocXVhbF9uYW1lLCBwYXJlbnQtPm5hbWUsIHNpemVvZihxdWFsX25hbWUpKTsKKyAgICAgICAgaWYgKHBhcmVudC0+cGFyZW50KQorICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQocXVhbF9uYW1lLCAiLyIsIHNpemVvZihxdWFsX25hbWUpKTsKKyAgICAgICAgYmNtY2xpX3N0cm5jYXQocXVhbF9uYW1lLCBidWZmZXIsIHNpemVvZihxdWFsX25hbWUpKTsKKyAgICAgICAgYmNtY2xpX3N0cm5jcHkoYnVmZmVyLCBxdWFsX25hbWUsIHNpemUpOworICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKyAgICB9CisgICAgc2l6ZSAtPSBzdHJsZW4oYnVmZmVyKTsKKyAgICBiY21jbGlfc3RybmNhdChidWZmZXIsIHRva2VuLT5uYW1lLCBzaXplKTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCisvKgorICogRXhwb3J0cworICovCitFWFBPUlRfU1lNQk9MKGJjbWNsaV9kaXJfYWRkKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX2Rpcl9maW5kKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Rva2VuX25hbWUpOworRVhQT1JUX1NZTUJPTChiY21jbGlfY21kX2FkZCk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX29wZW4pOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9wYXJzZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zdG9wKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX2lzX3N0b3BwZWQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfZGlyX2dldCk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9kaXJfc2V0KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Bhcm1fbnVtYmVyKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Bhcm1faXNfc2V0KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX2VudW1fcGFybV9zdHJpbmd2YWwpOworRVhQT1JUX1NZTUJPTChiY21jbGlfdG9rZW5fZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUpOwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0ZTI3YwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpLmgKQEAgLTAsMCArMSw2NzcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJjbWNsaS5oCisgKgorICogQ0xJIGVuZ2luZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJDTUNMSV9ICisKKyNkZWZpbmUgQkNNQ0xJX0gKKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtb2x0X2J1Zi5oPgorCisvKiogXGRlZmdyb3VwIGJjbV9jbGkgQnJvYWRjb20gQ0xJIEVuZ2luZQorICogQnJvYWRjb20gQ0xJIGVuZ2luZSBpcyB1c2VkIGZvciBhbGwgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzIG1vbml0b3JpbmcuXG4KKyAqIEl0IGRvZXNuJ3QgaGF2ZSBidWlsdC1pbiBzY3JpcHRpbmcgY2FwYWJpbGl0aWVzIChsb2dpY2FsIGV4cHJlc3Npb25zLCBsb29wcyksCisgKiBidXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhbnkgYXZhaWxhYmxlIHNjcmlwdGluZyBsYW5ndWFnZS5cbgorICogQnJvYWRjb20gQ0xJIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6XG4KKyAqIC0gcGFyYW1ldGVyIG51bWJlciBhbmQgdHlwZSB2YWxpZGF0aW9uIChzaW1wbGlmaWVzIGNvbW1hbmQgaGFuZGxlcnMgZGV2ZWxvcG1lbnQpCisgKiAtIHBhcmFtZXRlciB2YWx1ZSByYW5nZSBjaGVja2luZworICogLSBtYW5kYXRvcnkgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMKKyAqIC0gcG9zaXRpb25hbCBhbmQgbmFtZWQgcGFyYW1ldGVycworICogLSBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAqIC0gZW51bSBwYXJhbWV0ZXJzIGNhbiBoYXZlIGFyYml0cmFyeSB2YWx1ZXMKKyAqIC0gYXV0b21hdGljIGNvbW1hbmQgaGVscCBnZW5lcmF0aW9uCisgKiAtIGF1dG9tYXRpYyBvciB1c2VyLWRlZmluZWQgY29tbWFuZCBzaG9ydGN1dHMKKyAqIC0gY29tbWFuZCBoYW5kbGVycyByZXR1cm4gY29tcGxldGlvbiBzdGF0dXMgdG8gZW5hYmxlIHNjcmlwdGluZworICogLSBtdWx0aXBsZSBzZXNzaW9ucworICogLSBzZXNzaW9uIGFjY2VzcyByaWdodHMKKyAqIC0gZXh0ZW5kaWJsZS4gU3VwcG9ydHMgdXNlci1kZWZpbmVkIHBhcmFtZXRlciB0eXBlcworICogLSByZWxhdGl2ZWx5IGxvdyBzdGFjayB1c2FnZQorICogQHsKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNkZWZpbmUgQkNNQ0xJX01BWF9TRUFSQ0hfU1VCU1RSX0xFTkdUSCA4MAorCisjZGVmaW5lIEJDTUNMSV9BUlJBWV9FTVBUWSAgICAgICAgIi0iCisjZGVmaW5lIEJDTUNMSV9QQVJNX05PX1ZBTFVFICAgICAgIl8iCisjZGVmaW5lIEJDTUNMSV9FTlVNX01BU0tfREVMX1NUUiAgIisiCisKKy8qKiBNb25pdG9yIGVudHJ5IGhhbmRsZQorICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfZW50cnkgYmNtY2xpX2VudHJ5OworCisvKiBpZiBCQ01DTElfUEFSTV9VU0VSSU8gZmxhZyBpcyBzZXQ6CisgICBsb3dfdmFsOiB0X3VzZXJzY2FuZl9mIGZ1bmN0aW9uCisgICBoaWdoX3ZhbDogdF91c2VycHJpbnRmX2YgZnVuY3Rpb24KKyovCisKKy8qKiBGdW5jdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfY21kX3Bhcm0gYmNtY2xpX2NtZF9wYXJtOworCisvKiogUGFyYW1ldGVyIHR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTUNMSV9QQVJNX05PTkUsCisgICAgQkNNQ0xJX1BBUk1fREVDSU1BTCwgICAgICAgICAvKio8IERlY2ltYWwgbnVtYmVyICovCisgICAgQkNNQ0xJX1BBUk1fREVDSU1BTDY0LCAgICAgICAvKio8IFNpZ25lZCA2NC1iaXQgZGVjaW1hbCAqLworICAgIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAgICAgICAgLyoqPCBVbnNpZ25lZCBkZWNpbWFsIG51bWJlciAqLworICAgIEJDTUNMSV9QQVJNX1VERUNJTUFMNjQsICAgICAgLyoqPCBVbnNpZ25lZCA2NC1iaXQgZGVjaW1hbCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9IRVgsICAgICAgICAgICAgIC8qKjwgSGV4YWRlY2ltYWwgbnVtYmVyICovCisgICAgQkNNQ0xJX1BBUk1fSEVYNjQsICAgICAgICAgICAvKio8IDY0LWJpdCBoZXhhZGVjaW1hbCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9OVU1CRVIsICAgICAgICAgIC8qKjwgRGVjaW1hbCBudW1iZXIgb3IgaGV4IG51bWJlciBwcmVmaXhlZCBieSAweCAqLworICAgIEJDTUNMSV9QQVJNX05VTUJFUjY0LCAgICAgICAgLyoqPCA2NGJpdCBkZWNpbWFsIG51bWJlciBvciBoZXggbnVtYmVyIHByZWZpeGVkIGJ5IDB4ICovCisgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgICAgICAgICAvKio8IFVuc2lnbmVkIGRlY2ltYWwgbnVtYmVyIG9yIGhleCBudW1iZXIgcHJlZml4ZWQgYnkgMHggKi8KKyAgICBCQ01DTElfUEFSTV9VTlVNQkVSNjQsICAgICAgIC8qKjwgVW5zaWduZWQgNjRiaXQgZGVjaW1hbCBudW1iZXIgb3IgaGV4IG51bWJlciBwcmVmaXhlZCBieSAweCAqLworICAgIEJDTUNMSV9QQVJNX0ZMT0FULCAgICAgICAgICAgLyoqPCBJRUVFIDMyLWJpdCBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9ET1VCTEUsICAgICAgICAgIC8qKjwgSUVFRSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICovCisgICAgQkNNQ0xJX1BBUk1fU1RSSU5HLCAgICAgICAgICAvKio8IFN0cmluZyAqLworICAgIEJDTUNMSV9QQVJNX0VOVU0sICAgICAgICAgICAgLyoqPCBFbnVtZXJhdGlvbiAqLworICAgIEJDTUNMSV9QQVJNX0VOVU1fTUFTSywgICAgICAgLyoqPCBCaXRtYXNrIGNyZWF0ZWQgZnJvbSBlbnVtZXJhdGlvbiB2YWx1ZXMgKi8KKyAgICBCQ01DTElfUEFSTV9JUCwgICAgICAgICAgICAgIC8qKjwgSVAgYWRkcmVzcyBuLm4ubi5uICovCisgICAgQkNNQ0xJX1BBUk1fSVBWNiwgICAgICAgICAgICAvKio8IElQdjYgYWRkcmVzcyAqLworICAgIEJDTUNMSV9QQVJNX01BQywgICAgICAgICAgICAgLyoqPCBNQUMgYWRkcmVzcyB4eDp4eDp4eDp4eDp4eDp4eCAqLworICAgIEJDTUNMSV9QQVJNX0JVRkZFUiwgICAgICAgICAgLyoqPCBCeXRlIGFycmF5ICovCisKKyAgICBCQ01DTElfUEFSTV9VU0VSREVGICAgICAgICAgIC8qKjwgVXNlci1kZWZpbmVkIHBhcmFtZXRlci4gVXNlciBtdXN0IHByb3ZpZGUgc2Nhbl9jYiAqLworfSBiY21jbGlfcGFybV90eXBlOworCisvKiogTnVtZXJpYyB0eXBlIHVzZWQgZm9yIHN0b3JpbmcgZW51bSB2YWx1ZXMuICovCit0eXBlZGVmIGxvbmcgYmNtY2xpX2VudW1fbnVtYmVyOworCisvKiogRW51bSBhdHRyaWJ1dGUgdmFsdWUuCisgKgorICogIEVudW0gdmFsdWVzIGlzIGFuIGFycmF5IG9mIGJjbWNsaV9lbnVtX3ZhbCB0ZXJtaW5hdGVkIGJ5IGVsZW1lbnQgd2l0aCBuYW1lPT1OVUxMCisgKgorICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfZW51bV92YWwKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgLyoqPCBFbnVtIHN5bWJvbGljIG5hbWUgKi8KKyAgICBiY21jbGlfZW51bV9udW1iZXIgdmFsOyAgICAgLyoqPCBFbnVtIGludGVybmFsIHZhbHVlICovCisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtczsgICAgIC8qKjwgRXh0ZW5zaW9uIHBhcmFtZXRlciB0YWJsZSBmb3IgZW51bS1zZWxlY3RvciAqLworfSBiY21jbGlfZW51bV92YWw7CisjZGVmaW5lIEJDTUNMSV9NQVhfRU5VTV9WQUxVRVMgICAxMjggICAgIC8qKjwgTWF4IG51bWJlciBvZiBlbnVtIHZhbHVlcyAqLworI2RlZmluZSBCQ01DTElfRU5VTV9MQVNUICAgICB7IE5VTEwsIDB9ICAvKio8IExhc3QgZW50cnkgaW4gZW51bSB0YWJsZSAqLworCisvKiogQm9vbGVhbiB2YWx1ZXMgKHRydWUvZmFsc2UsIHllcy9ubywgb24vb2ZmKQorICoKKyAqLworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21jbGlfZW51bV9ib29sX3RhYmxlW107CisKKy8qIE1vbml0b3IgZGF0YSB0eXBlcyAqLwordHlwZWRlZiBsb25nIGJjbWNsaV9udW1iZXI7ICAgICAgLyoqPCBUeXBlIHVuZGVybHlpbmcgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9ERUNJTUFMICovCit0eXBlZGVmIGxvbmcgYmNtY2xpX3VudW1iZXI7ICAgICAvKio8IFR5cGUgdW5kZXJseWluZyBCQ01DTElfUEFSTV9IRVgsIEJDTUNMSV9QQVJNX1VERUNJTUFMICovCit0eXBlZGVmIGxvbmcgYmNtY2xpX251bWJlcjY0OyAgICAvKio8IFR5cGUgdW5kZXJseWluZyBCQ01DTElfUEFSTV9OVU1CRVI2NCwgQkNNQ0xJX1BBUk1fREVDSU1BTDY0ICovCit0eXBlZGVmIGxvbmcgYmNtY2xpX3VudW1iZXI2NDsgICAvKio8IFR5cGUgdW5kZXJseWluZyBCQ01DTElfUEFSTV9IRVg2NCwgQkNNQ0xJX1BBUk1fVURFQ0lNQUw2NCAqLworCisvKiogUGFyYW1ldGVyIHZhbHVlICovCit0eXBlZGVmIHVuaW9uIGJjbWNsaV9wYXJtX3ZhbHVlCit7CisgICAgbG9uZyBudW1iZXI7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpZ25lZCBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIHVudW1iZXI7ICAgICAgICAgIC8qKjwgVW5zaWduZWQgbnVtYmVyICovCisgICAgbG9uZyBsb25nIG51bWJlcjY0OyAgICAgICAgICAgICAvKio8IFNpZ25lZCA2NC1iaXQgbnVtYmVyICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIHVudW1iZXI2NDsgICAvKio8IFVuc2lnbmVkIDY0LWJpdCBudW1iZXIgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmc7ICAgICAgICAgICAgIC8qKjwgMC10ZXJtaW5hdGVkIHN0cmluZyAqLworICAgIGRvdWJsZSBkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlciAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsgICAgICAgICAgLyoqPCBNQUMgYWRkcmVzcyAqLworICAgIGJjbW9sdF9idWYgYnVmZmVyOyAgICAgICAgICAgICAgLyoqPCBCdWZmZXI6IHVzZWQgZm9yIEJDTUNMSV9QQVJNX0JVRkZFUiAqLworICAgIGJjbWNsaV9lbnVtX251bWJlciBlbnVtX3ZhbDsgICAgLyoqPCBFbnVtIHZhbHVlIChudW1iZXIpICovCit9ICBiY21jbGlfcGFybV92YWx1ZTsKKworLyoqIFVzZXItZGVmaW5lZCBzY2FuIGZ1bmN0aW9uLgorICogVGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHBhcnNpbmcgdXNlci1kZWZpbmVkIHBhcmFtZXRlciB0eXBlcworICogUmV0dXJuczogMC1vaywgPD1lcnJvcgorICoKKyAqLwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbWNsaV9zY2FuX2NiKShjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwKKyAgICBjb25zdCBjaGFyICpzdHJpbmdfdmFsKTsKKworLyoqIFVzZXItZGVmaW5lZCBwcmludCBmdW5jdGlvbi4KKyAqIFRoZSBmdW5jdGlvbiBpcyB1c2VkIGZvciBwcmludGluZyB1c2VyLWRlZmluZWQgcGFyYW1ldGVyIHR5cGVzCisgKgorICovCit0eXBlZGVmIHZvaWQgKCpiY21jbGlfZm9ybWF0X2NiKShjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlLAorICAgIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworCisKKy8qKiBGdW5jdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlICovCitzdHJ1Y3QgYmNtY2xpX2NtZF9wYXJtCit7CisgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgIC8qKjwgUGFyYW1ldGVyIG5hbWUuIFNob3VsZG4ndCBiZSBhbGxvY2F0ZWQgb24gc3RhY2shICovCisgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsgICAgIC8qKjwgUGFyYW1ldGVyIGRlc2NyaXB0aW9uLiBTaG91bGRuJ3QgYmUgYWxsb2NhdGVkIG9uIHN0YWNrISAqLworICAgYmNtY2xpX3Bhcm1fdHlwZSB0eXBlOyAgICAgICAvKio8IFBhcmFtZXRlciB0eXBlICovCisgICB1aW50OF90IGZsYWdzOyAgICAgICAgICAgICAgIC8qKjwgQ29tYmluYXRpb24gb2YgQkNNQ0xJX1BBUk1feHggZmxhZ3MgKi8KKyNkZWZpbmUgQkNNQ0xJX1BBUk1fRkxBR19OT05FICAgICAgIDB4MDAgLyoqPCBGb3IgdXNlIGluc3RlYWQgb2YgbWFnaWMgbnVtYmVyIDAgd2hlbiBubyBmbGFncyBhcHBseSAqLworI2RlZmluZSBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMICAgMHgwMSAvKio8IFBhcmFtZXRlciBpcyBvcHRpb25hbCAqLworI2RlZmluZSBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCAgICAgMHgwMiAvKio8IERlZmF1bHQgdmFsdWUgaXMgc2V0ICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfUkFOR0UgICAgICAweDA0IC8qKjwgUmFuZ2UgaXMgc2V0ICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfRU9MICAgICAgICAweDIwIC8qKjwgU3RyaW5nIGZyb20gdGhlIGN1cnJlbnQgcGFyc2VyIHBvc2l0aW9uIHRpbGwgRU9MICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IgICAweDQwIC8qKjwgUGFyYW1ldGVyIHNlbGVjdHMgb3RoZXIgcGFyYW1ldGVycyAqLworI2RlZmluZSBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEICAgMHg4MCAvKio8IEludGVybmFsIGZsYWc6IHBhcmFtZXRlciBpcyBhc3NpZ25lZCAqLworCisgICBiY21jbGlfbnVtYmVyIGxvd192YWw7ICAgICAgIC8qKjwgTG93IHZhbCBmb3IgcmFuZ2UgY2hlY2tpbmcgKi8KKyAgIGJjbWNsaV9udW1iZXIgaGlfdmFsOyAgICAgICAgLyoqPCBIaSB2YWwgZm9yIHJhbmdlIGNoZWNraW5nICovCisgICBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUgKi8KKyAgIGJjbWNsaV9lbnVtX3ZhbCAqZW51bV90YWJsZTsgLyoqPCBUYWJsZSBjb250YWluaW5nIHsgZW51bV9uYW1lLCBlbnVtX3ZhbHVlIH0gcGFpcnMgKi8KKyAgIGJjbWNsaV9zY2FuX2NiIHNjYW5fY2I7ICAgICAgLyoqPCBVc2VyLWRlZmluZWQgc2NhbiBmdW5jdGlvbiBmb3IgQkNNQ0xJX1BBUk1fVVNFUkRFRiBwYXJhbWV0ZXIgdHlwZSAqLworICAgYmNtY2xpX2Zvcm1hdF9jYiBmb3JtYXRfY2I7ICAvKio8IFVzZXItZGVmaW5lZCBmb3JtYXQgZnVuY3Rpb24gZm9yIEJDTUNMSV9QQVJNX1VTRVJERUYgcGFyYW1ldGVyIHR5cGUgKi8KKyAgIHVpbnQzMl90IG1heF9hcnJheV9zaXplOyAgICAgLyoqPCBNYXggYXJyYXkgc2l6ZSBmb3IgYXJyYXktcGFyYW1ldGVyICovCisgICB1aW50MzJfdCBhcnJheV9zaXplOyAgICAgICAgIC8qKjwgQWN0dWFsIGFycmF5IHNpemUgZm9yIGFycmF5LXBhcmFtZXRlciAqLworICAgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlczsgICAvKio8IEFycmF5IHZhbHVlcyAqLworICAgdm9pZCAqdXNlcl9kYXRhOyAgICAgICAgICAgICAvKio8IFVzZXIgZGF0YSAtIHBhc3NlZCB0cmFuc3BhcmVudGx5IHRvIGNvbW1hbmQgaGFuZGxlciAqLworfTsKKworLyoqIENvbW1hbmQgcGFyYW1ldGVyIGxpc3QgdGVybWluYXRvciAqLworI2RlZmluZSBCQ01DTElfUEFSTV9MSVNUX1RFUk1JTkFUT1IgIHsgLm5hbWU9TlVMTCwgLnR5cGU9QkNNQ0xJX1BBUk1fTk9ORSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2Ugc2ltcGxlIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdHlwZSAgICAgUGFyYW1ldGVyIHR5cGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk0oX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncykgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT0oX3R5cGUpLCAuZmxhZ3M9KF9mbGFncykgfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHNpbXBsZSBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF90eXBlICAgICAgIFBhcmFtZXRlciB0eXBlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfc2l6ZSAgICAgICBNYXggYXJyYXkgc2l6ZQorICogXHBhcmFtW2luXSBfdmFsdWVzICAgICBBcnJheSB2YWx1ZXMgYnVmZmVyCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9BUlJBWShfbmFtZSwgX2Rlc2NyLCBfdHlwZSwgX2ZsYWdzLCBfc2l6ZSwgX3ZhbHVlcykgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT0oX3R5cGUpLCAuZmxhZ3M9KF9mbGFncyksXAorICAgICAgICAubWF4X2FycmF5X3NpemU9KF9zaXplKSwgLnZhbHVlcz0oX3ZhbHVlcykgfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHNpbXBsZSBwYXJhbWV0ZXIgZm9yIGFycmF5cyBvZiBlbnVtcworICogXHBhcmFtW2luXSBfbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgICAgUGFyYW1ldGVyIHR5cGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9zaXplICAgICAgIE1heCBhcnJheSBzaXplCisgKiBccGFyYW1baW5dIF92YWx1ZXMgICAgIEFycmF5IHZhbHVlcyBidWZmZXIKKyAqIFxwYXJhbVtpbl0gX2VudW1fdGFibGUgQW4gYXJyYXkgb2YgZW51bXMgdGhhdCBtYXkgYmUgaW4gdGhlIGFycmF5CisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9FTlVNX0FSUkFZKF9uYW1lLCBfZGVzY3IsIF90eXBlLCBfZmxhZ3MsIF9zaXplLCBfdmFsdWVzLCBfZW51bV90YWJsZSkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT0oX3R5cGUpLCAuZmxhZ3M9KF9mbGFncyksXAorICAgICAgICAubWF4X2FycmF5X3NpemU9KF9zaXplKSwgLnZhbHVlcz0oX3ZhbHVlcyksIC5lbnVtX3RhYmxlPShfZW51bV90YWJsZSkgfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHJhbmdlIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdHlwZSAgICAgUGFyYW1ldGVyIHR5cGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfbWluICAgICAgTWluIHZhbHVlCisgKiBccGFyYW1baW5dIF9tYXggICAgICBNYXggdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKF9uYW1lLCBfZGVzY3IsIF90eXBlLCBfZmxhZ3MsIF9taW4sIF9tYXgpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9KF90eXBlKSwgLmZsYWdzPShfZmxhZ3MpIHwgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSwgXAorICAgICAgICAubG93X3ZhbD0oX21pbiksIC5oaV92YWw9KF9tYXgpIH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSByYW5nZSBwYXJhbWV0ZXIgZm9yIGFycmF5cyB3aXRoIHJhbmdlCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF90eXBlICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9zaXplICAgICBNYXggYXJyYXkgc2l6ZQorICogXHBhcmFtW2luXSBfdmFsdWVzICAgQXJyYXkgdmFsdWVzIGJ1ZmZlcgorICogXHBhcmFtW2luXSBfbWluICAgICAgTWluIHZhbHVlCisgKiBccGFyYW1baW5dIF9tYXggICAgICBNYXggdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0FSUkFZX1JBTkdFKF9uYW1lLCBfZGVzY3IsIF90eXBlLCBfZmxhZ3MsIF9zaXplLCBfdmFsdWVzLCBfbWluLCBfbWF4KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSB8IEJDTUNMSV9QQVJNX0ZMQUdfUkFOR0UsXAorICAgICAgICAgLm1heF9hcnJheV9zaXplPShfc2l6ZSksIC52YWx1ZXM9KF92YWx1ZXMpLCAubG93X3ZhbD0oX21pbiksIC5oaV92YWw9KF9tYXgpIH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBwYXJhbWV0ZXIgd2l0aCBkZWZhdWx0IHZhbHVlCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF90eXBlICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9kZnQgICAgICBEZWZhdWx0IHZhbHVlCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX2RmdCkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT0oX3R5cGUpLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCwgXAorICAgICAgICAudmFsdWUgPSB7X2RmdH0gfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHJhbmdlIHBhcmFtZXRlciB3aXRoIGRlZmF1bHQgdmFsdWUKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgIFBhcmFtZXRlciB0eXBlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX21pbiAgICAgIE1pbiB2YWx1ZQorICogXHBhcmFtW2luXSBfbWF4ICAgICAgTWF4IHZhbHVlCisgKiBccGFyYW1baW5dIF9kZnQgICAgICBEZWZhdWx0IHZhbHVlCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRV9ERUZWQUwoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX21pbiwgX21heCwgX2RmdCkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT0oX3R5cGUpLCBcCisgICAgICAgIC5mbGFncz0oX2ZsYWdzKSB8IEJDTUNMSV9QQVJNX0ZMQUdfUkFOR0UgfCBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCwgXAorICAgICAgICAubG93X3ZhbD0oX21pbiksIC5oaV92YWw9KF9tYXgpLCAudmFsdWUgPSB7X2RmdH0gfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIGVudW0gcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF92YWx1ZXMgICBFbnVtIHZhbHVlcyB0YWJsZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKF9uYW1lLCBfZGVzY3IsIF92YWx1ZXMsIF9mbGFncykgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT1CQ01DTElfUEFSTV9FTlVNLCAuZmxhZ3M9KF9mbGFncyksIC5lbnVtX3RhYmxlPShfdmFsdWVzKX0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBlbnVtIHBhcmFtZXRlciB3aXRoIGRlZmF1bHQgdmFsdWUKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgIEVudW0gdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX2RmdCAgICAgIERlZmF1bHQgdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU1fREVGVkFMKF9uYW1lLCBfZGVzY3IsIF92YWx1ZXMsIF9mbGFncywgX2RmdCkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT1CQ01DTElfUEFSTV9FTlVNLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCxcCisgICAgICAgIC5lbnVtX3RhYmxlPShfdmFsdWVzKSwgLnZhbHVlPXsuc3RyaW5nPV9kZnR9IH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBlbnVtIG1hc2sgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF92YWx1ZXMgICBFbnVtIHZhbHVlcyB0YWJsZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9FTlVNX01BU0soX25hbWUsIF9kZXNjciwgX3ZhbHVlcywgX2ZsYWdzKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPUJDTUNMSV9QQVJNX0VOVU1fTUFTSywgLmZsYWdzPShfZmxhZ3MpLCAuZW51bV90YWJsZT0oX3ZhbHVlcyl9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgZW51bV9tYXNrIHBhcmFtZXRlciB3aXRoIGRlZmF1bHQgdmFsdWUKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgIEVudW0gdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX2RmdCAgICAgIERlZmF1bHQgdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU1fTUFTS19ERUZWQUwoX25hbWUsIF9kZXNjciwgX3ZhbHVlcywgX2ZsYWdzLCBfZGZ0KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPUJDTUNMSV9QQVJNX0VOVU1fTUFTSywgLmZsYWdzPShfZmxhZ3MpIHwgQkNNQ0xJX1BBUk1fRkxBR19ERUZWQUwsXAorICAgICAgICAuZW51bV90YWJsZT0oX3ZhbHVlcyksIC52YWx1ZT17LnN0cmluZz1fZGZ0fSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgZW51bS1zZWxlY3RvciBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgIFNlbGVjdG9yIHZhbHVlcyB0YWJsZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9TRUxFQ1RPUihfbmFtZSwgX2Rlc2NyLCBfdmFsdWVzLCBfZmxhZ3MpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9QkNNQ0xJX1BBUk1fRU5VTSwgLmZsYWdzPShfZmxhZ3MpIHwgQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUixcCisgICAgICAgIC5lbnVtX3RhYmxlPShfdmFsdWVzKSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgYnVmZmVyIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9idWYgICAgICBNZW1vcnkgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9zaXplICAgICBCdWZmZXIgc2l6ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fQlVGRkVSKF9uYW1lLCBfZGVzY3IsIF9mbGFncywgX2J1ZiwgX3NpemUpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9QkNNQ0xJX1BBUk1fQlVGRkVSLCBcCisgICAgICAgIC5mbGFncz0oX2ZsYWdzKSwgLnZhbHVlLmJ1ZmZlciA9IHsuc3RhcnQgPSBfYnVmLCAuY3VyciA9IF9idWYsIC5sZW4gPSBfc2l6ZX0gfQorCisvKiogUmVnaXN0ZXIgY29tbWFuZCB3aXRob3V0IHBhcmFtZXRlcnMgaGVscGVyICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCBjbWQsIGhlbHAsIGNiKSBcCit7XAorICAgIGJjbW9zX2Vycm5vIGJjbWNsaV9jbWRfYWRkX2VyciA9IGJjbWNsaV9jbWRfYWRkKGRpciwgY21kLCBjYiwgaGVscCwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCwgTlVMTCk7XAorICAgIEJVR19PTihCQ01fRVJSX09LICE9IGJjbWNsaV9jbWRfYWRkX2Vycik7XAorfQorCisvKiogUmVnaXN0ZXIgY29tbWFuZCBoZWxwZXIgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfQ01EKGRpciwgY21kLCBoZWxwLCBjYiwgcGFybXMuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGJjbWNsaV9jbWRfcGFybSBjbWRfcGFybXNbXT17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGFybXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCQ01DTElfUEFSTV9MSVNUX1RFUk1JTkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vc19lcnJubyBiY21jbGlfY21kX2FkZF9lcnIgPSBiY21jbGlfY21kX2FkZChkaXIsIGNtZCwgY2IsIGhlbHAsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwsIGNtZF9wYXJtcyk7ICAgXAorICAgIEJVR19PTihCQ01fRVJSX09LICE9IGJjbWNsaV9jbWRfYWRkX2Vycik7XAorfQorCisvKiogT3B0aW9uYWwgY3VzdG9tIGRpcmVjdG9yeSBoYW5kbGVycyAqLwordHlwZWRlZiB2b2lkICgqYmNtY2xpX2Rpcl9lbnRlcl9sZWF2ZV9jYikoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWNsaV9lbnRyeSAqZGlyLCBpbnQgaXNfZW50ZXIpOworCisvKiogT3B0aW9uYWwgY29tbWFuZCBvciBkaXJlY3RvcnkgaGVscCBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgaCAgICAgICAgICAgQ29tbWFuZCBvciBkaXJlY3RvcnkgaGFuZGxlCisgKiBccGFyYW1baW5dICAgcGFybXMgICAgICAgUGFyYW1ldGVyKHMpIC0gdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgc3RyaW5nLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIGdldCBoZWxwIG9uIGluZGl2aWR1YWwgcGFyYW1ldGVycworICovCit0eXBlZGVmIHZvaWQgKCpiY21jbGlfaGVscF9jYikoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWNsaV9lbnRyeSAqaCwgY29uc3QgY2hhciAqcGFybXMpOworCisKKy8qKiBFeHRyYSBwYXJhbWV0ZXJzIG9mIG1vbml0b3IgZGlyZWN0b3J5LgorICogU2VlIFxyZWYgYmNtY2xpX2Rpcl9hZGQKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9kaXJfZXh0cmFfcGFybQoreworICAgIHZvaWQgKnVzZXJfcHJpdjsgICAgICAgICAgICAvKio8IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gZW50ZXJfbGVhdmVfY2IgKi8KKyAgICBiY21jbGlfZGlyX2VudGVyX2xlYXZlX2NiIGVudGVyX2xlYXZlX2NiOyAvKio8IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHNlc3Npb24gZW50ZXJzL2xlYXZzIHRoZSBkaXJlY3RvcnkgKi8KKyAgICBiY21jbGlfaGVscF9jYiBoZWxwX2NiOyAgICAgLyoqPCBIZWxwIGZ1bmN0aW9uIGNhbGxlZCB0byBwcmludCBkaXJlY3RvcnkgaGVscCBpbnN0ZWFkIG9mIHRoZSBhdXRvbWF0aWMgaGVscCAqLworfSBiY21jbGlfZGlyX2V4dHJhX3Bhcm07CisKKworLyoqIEV4dHJhIHBhcmFtZXRlcnMgb2YgbW9uaXRvciBjb21tYW5kLgorICogU2VlIFxyZWYgYmNtY2xpX2NtZF9hZGQKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9jbWRfZXh0cmFfcGFybQoreworICAgIGJjbWNsaV9oZWxwX2NiIGhlbHBfY2I7ICAgICAvKio8IE9wdGlvbmFsIGhlbHAgY2FsbGJhY2suIENhbiBiZSB1c2VkIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgaGVscCwgZS5nLiwgaGVscCBmb3Igc3BlY2lmaWMgcGFyYW1ldGVycyAqLworICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgICAgICAvKio8IENvbW1hbmQgZmxhZ3MgKi8KKyNkZWZpbmUgQkNNQ0xJX0NNRF9GTEFHX05PX05BTUVfUEFSTVMgICAweDAwMDAwMDAxIC8qKjwgTm8gbmFtZWQgcGFybXMuIFBvc2l0aW9uYWwgb25seS4gQ2FuIGJlIHVzZWZ1bCBpZiBwYXJhbWV0ZXIgdmFsdWUgY2FuIGNvbnRhaW4gJywnICovCisgICAgdm9pZCAoKmZyZWVfcGFybXMpKGJjbWNsaV9jbWRfcGFybSAqcGFybXMpOyAgICAvKiBPcHRpb25hbCB1c2VyLWRlZmluZWQgZnJlZSAqLworfSBiY21jbGlfY21kX2V4dHJhX3Bhcm07CisKKworLyoqIE1vbml0b3IgY29tbWFuZCBoYW5kbGVyIHByb3RvdHlwZSAqLwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbWNsaV9jbWRfY2IpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKTsKKworLyoqIENMSSBjb21tYW5kIGxvZ2dpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNQ0xJX0xPR19OT05FLCAgICAgICAgICAgICAgICAvKio8IERpc2FibGUgbG9nZ2luZyAqLworICAgIEJDTUNMSV9MT0dfQ0xJLCAgICAgICAgICAgICAgICAgLyoqPCBMb2cgY29tbWFuZHMgYXMgaXMgYW5kIHJjIGFzIENMSSBjb21tZW50Ki8KKyAgICBCQ01DTElfTE9HX0NfQ09NTUVOVCAgICAgICAgICAgIC8qKjwgTG9nIGFzIEMgY29tbWVudHMgKi8KK30gYmNtY2xpX2xvZ19tb2RlOworCisvKiogQWRkIHN1YmRpcmVjdG9yeSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeQorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJlbnQgICAgICAgICAgUGFyZW50IGRpcmVjdG9yeSBoYW5kbGUuIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBEaXJlY3RvcnkgbmFtZQorICogXHBhcmFtW2luXSAgIGhlbHAgICAgICAgICAgICBIZWxwIHN0cmluZworICogXHBhcmFtW2luXSAgIGFjY2Vzc19yaWdodCAgICBBY2Nlc3MgcmlnaHRzCisgKiBccGFyYW1baW5dICAgZXh0cmFzICAgICAgICAgIE9wdGlvbmFsIGRpcmVjdG9yeSBkZXNjcmlwdG9yLiBNdXN0bid0IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKiBccmV0dXJuICAgICAgbmV3IGRpcmVjdG9yeSBoYW5kbGUgb3IgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2FkZChiY21jbGlfZW50cnkgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVscCwgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3NfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9kaXJfZXh0cmFfcGFybSAqZXh0cmFzKTsKKworCisvKiogU2NhbiBkaXJlY3RvcnkgdHJlZSBhbmQgbG9vayBmb3IgZGlyZWN0b3J5IG5hbWVkICJuYW1lIi4KKyAqCisgKiBccGFyYW1baW5dICAgcGFyZW50ICAgICAgICAgIERpcmVjdG9yeSBzdWItdHJlZSByb290LiBOVUxMPXJvb3QKKyAqIFxwYXJhbVtpbl0gICBuYW1lICAgICAgICAgICAgTmFtZSBvZiBkaXJlY3RvcnkgdG8gYmUgZm91bmQKKyAqIFxyZXR1cm4gICAgICBkaXJlY3RvcnkgaGFuZGxlIGlmIGZvdW5kIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2Rpcl9maW5kKGJjbWNsaV9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lICk7CisKKworLyoqIFNjYW4gZGlyZWN0b3J5IHRyZWUgYW5kIGxvb2sgZm9yIGNvbW1hbmQgbmFtZWQgIm5hbWUiLgorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJlbnQgICAgICAgICAgRGlyZWN0b3J5IHN1Yi10cmVlIHJvb3QuIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBOYW1lIG9mIGNvbW1hbmQgdG8gYmUgZm91bmQKKyAqIFxyZXR1cm4gICAgICBjb21tYW5kIGhhbmRsZSBpZiBmb3VuZCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitiY21jbGlfZW50cnkgKmJjbWNsaV9jbWRfZmluZChiY21jbGlfZW50cnkgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSApOworCisKKy8qKiBHZXQgdG9rZW4gbmFtZQorICogXHBhcmFtW2luXSAgIHRva2VuICAgICAgICAgICBEaXJlY3Rvcnkgb3IgY29tbWFuZCB0b2tlbgorICogXHJldHVybiAgICAgIGRpcmVjdG9yeSB0b2tlbiBuYW1lCisgKi8KK2NvbnN0IGNoYXIgKmJjbWNsaV90b2tlbl9uYW1lKGJjbWNsaV9lbnRyeSAqdG9rZW4pOworCisvKiogRmluZCB0aGUgQ0xJIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSAoY2FzZSBpbnNlbnNpdGl2ZSkuCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgQ0xJIHNlc3Npb24KKyAqIFxwYXJhbVtpbl0gICBuYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHJldHVybiAgICAgIFRoZSBDTEkgcGFyYW1ldGVyIHRoYXQgd2FzIGZvdW5kLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitiY21jbGlfY21kX3Bhcm0gKmJjbWNsaV9maW5kX25hbWVkX3Bhcm0oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiogRmluZCB0aGUgZmlyc3QgQ0xJIHBhcmFtZXRlciB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nIChjYXNlIGluc2Vuc2l0aXZlKS4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICBDTEkgc2Vzc2lvbgorICogXHBhcmFtW2luXSAgIHByZWZpeCAgIFBhcmFtZXRlciBuYW1lIHByZWZpeAorICogXHJldHVybiAgICAgIFRoZSBDTEkgcGFyYW1ldGVyIHRoYXQgd2FzIGZvdW5kLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitiY21jbGlfY21kX3Bhcm0gKmJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcmVmaXgpOworCisvKiogUXVlcnkgcGFyYW1ldGVyIHZhbHVlIHN0YXR1cy4KKyAqIFRoZSBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3Igc2NhbGFyIGFuZCBhcnJheSBwYXJhbWV0ZXJzCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIENMSSBzZXNzaW9uCisgKiBccGFyYW1baW5dICAgcGFybSAgICAgICAgICAgIFBhcmFtZXRlciBmcm9tIHRoZSBhcnJheSBwYXNzZWQgdG8gdGhlIENMSSBjb21tYW5kIGhhbmRsZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcmV0dXJuZWQgYnkgYmNtY2xpX2ZpbmRfbmFtZWRfcGFybSgpCisgKiBccGFyYW1baW5dICAgdmFsdWVfaW5kZXggICAgIHZhbHVlX2luZGV4IC0gZm9yIGFycmF5IHBhcmFtZXRlcnMKKyAqIFxyZXR1cm4gICAgICBCQ01PU19UUlVFIGlmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgc2V0LCBCQ01PU19GQUxTRSBvdGhlcndpc2UKKyAqLworYmNtb3NfYm9vbCBiY21jbGlfcGFybV92YWx1ZV9pc19zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWNsaV9jbWRfcGFybSAqcGFybSwgdWludDMyX3QgdmFsdWVfaW5kZXgpOworCisvKiogQWRkIENMSSBjb21tYW5kCisgKgorICogXHBhcmFtW2luXSAgIGRpciAgICAgICAgICAgICBIYW5kbGUgb2YgZGlyZWN0b3J5IHRvIGFkZCBjb21tYW5kIHRvLiBOVUxMPXJvb3QKKyAqIFxwYXJhbVtpbl0gICBuYW1lICAgICAgICAgICAgQ29tbWFuZCBuYW1lCisgKiBccGFyYW1baW5dICAgY21kX2NiICAgICAgICAgIENvbW1hbmQgaGFuZGxlcgorICogXHBhcmFtW2luXSAgIGhlbHAgICAgICAgICAgICBIZWxwIHN0cmluZworICogXHBhcmFtW2luXSAgIGFjY2Vzc19yaWdodCAgICBBY2Nlc3MgcmlnaHRzCisgKiBccGFyYW1baW5dICAgZXh0cmFzICAgICAgICAgIE9wdGlvbmFsIGV4dHJhcworICogXHBhcmFtW2luXSAgIHBhcm1zICAgICAgICAgICBPcHRpb25hbCBwYXJhbWV0ZXJzIGFycmF5LiBNdXN0IG5vdCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwYXJtcyE9TlVMTCwgdGhlIGxhc3QgcGFyYW1ldGVyIGluIHRoZSBhcnJheSBtdXN0IGhhdmUgbmFtZT09TlVMTC4KKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgID1PS1xuCisgKiAgICAgIDwwICA9ZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlfY21kX2FkZChiY21jbGlfZW50cnkgKmRpciwgY29uc3QgY2hhciAqbmFtZSwgYmNtY2xpX2NtZF9jYiBjbWRfY2IsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoZWxwLCBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfZXh0cmFfcGFybSAqZXh0cmFzLCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSk7CisKKworLyoqIERlc3Ryb3kgdG9rZW4gKGNvbW1hbmQgb3IgZGlyZWN0b3J5KQorICogXHBhcmFtW2luXSAgIHRva2VuICAgICAgICAgICBEaXJlY3Rvcnkgb3IgY29tbWFuZCB0b2tlbi4gTlVMTD1yb290CisgKi8KK3ZvaWQgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koYmNtY2xpX2VudHJ5ICp0b2tlbik7CisKKy8qKiBQYXJzZSBhbmQgZXhlY3V0ZSBpbnB1dCBzdHJpbmcuCisgKiBpbnB1dF9zdHJpbmcgY2FuIGNvbnRhaW4gbXVsdGlwbGUgY29tbWFuZHMgZGVsaW1pdGVkIGJ5ICc7JworICoKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBpbnB1dF9zdHJpbmcgICAgU3RyaW5nIHRvIGJlIHBhcnNlZAorICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICogICAgICAtRUlOVkFMIC0gcGFyc2luZyBlcnJvclxuCisgKiAgICAgIG90aGVyIC0gcmV0dXJuIGNvZGUgLSBhcyByZXR1cm5lZCBmcm9tIGNvbW1hbmQgaGFuZGxlci4KKyAqICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gcmV0dXJuIC1FSU5UUiB0byBpbnRlcnJ1cHQgbW9uaXRvciBsb29wLgorICovCitiY21vc19lcnJubyBiY21jbGlfcGFyc2UoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIgKmlucHV0X3N0cmluZyk7CisKKy8qKiBSZWFkIGlucHV0IGFuZCBwYXJzZSBpdGVyYXRpdmVseSB1bnRpbCBFT0Ygb3IgYmNtY2xpX2lzX3N0b3BwZWQoKQorICoKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxyZXR1cm4KKyAqICAgICAgPTAgIC0gT0sgXG4KKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX2RyaXZlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKy8qKiBTdG9wIG1vbml0b3IgZHJpdmVyLgorICogVGhlIGZ1bmN0aW9uIHN0b3BzIFxyZWYgYmNtY2xpX2RyaXZlcgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICovCit2b2lkIGJjbWNsaV9zdG9wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworLyoqIFJldHVybnMgMSBpZiBtb25pdG9yIHNlc3Npb24gaXMgc3RvcHBlZAorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybnMgMSBpZiBtb25pdG9yIHNlc3Npb24gc3RvcHBlZCBieSBiY21jbGlfc3RvcCgpXG4KKyAqIDAgb3RoZXJ3aXNlCisgKi8KK2JjbW9zX2Jvb2wgYmNtY2xpX2lzX3N0b3BwZWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisvKiogR2V0IGN1cnJlbnQgZGlyZWN0b3J5IGZvciB0aGUgc2Vzc2lvbiwKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxyZXR1cm4gICAgICBUaGUgY3VycmVudCBkaXJlY3RvcnkgaGFuZGxlCisgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2Rpcl9nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gKTsKKworLyoqIFNldCBjdXJyZW50IGRpcmVjdG9yeSBmb3IgdGhlIHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgZGlyICAgICAgICAgICAgIERpcmVjdG9yeSB0aGF0IHNob3VsZCBiZWNvbWUgY3VycmVudAorICogXHJldHVybgorICogICAgICA9MCAgLSBPSworICogICAgICA8MCAgLSBlcnJvcgorICovCitiY21vc19lcnJubyBiY21jbGlfZGlyX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpkaXIpOworCisvKiogR2V0IHBhcmFtZXRlciBudW1iZXIgZ2l2ZW4gaXRzIG5hbWUuCisgKiBUaGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBjb21tYW5kIGhhbmRsZXJzCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX25hbWUgICAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxyZXR1cm4KKyAqICA+PTAgLSBwYXJhbWV0ZXIgbnVtYmVyXG4KKyAqICA8MCAgLSBwYXJhbWV0ZXIgd2l0aCB0aGlzIG5hbWUgZG9lc24ndCBleGlzdAorICovCitpbnQgYmNtY2xpX3Bhcm1fbnVtYmVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwYXJtX25hbWUpOworCisvKiogR2V0IHBhcmFtZXRlciBieSBuYW1lCisgKiBUaGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBjb21tYW5kIGhhbmRsZXJzCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX25hbWUgICAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxyZXR1cm4KKyAqIHBhcmFtZXRlciBwb2ludGVyIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX3Bhcm1fZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwYXJtX25hbWUpOworCisvKiogQ2hlY2sgaWYgcGFyYW1ldGVyIGlzIHNldAorICogVGhlIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgY29tbWFuZCBoYW5kbGVycworICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybSAgICAgICAgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccmV0dXJuCisgKiBUUlVFIGlmIHBhcmFtZXRlciBpcyBzZXQsIEZBTFNFIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtY2xpX3Bhcm1faXNfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pCit7CisgICAgcmV0dXJuIChwYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpID8gQkNNT1NfVFJVRSA6IEJDTU9TX0ZBTFNFOworfQorCisvKiogQ2hlY2sgaWYgcGFyYW1ldGVyIGlzIHNldAorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybV9udW1iZXIgICAgIFBhcmFtZXRlciBudW1iZXIKKyAqIFxyZXR1cm4KKyAqICAwIGlmIHBhcmFtZXRlciBpcyBzZXRcbgorICogIEJDTV9FUlJfTk9FTlQgaWYgcGFyYW1ldGVyIGlzIG5vdCBzZXQKKyAqICBCQ01fRVJSX1BBUk0gaWYgcGFybV9udW1iZXIgaXMgaW52YWxpZAorICovCitiY21vc19lcnJubyBiY21jbGlfcGFybV9jaGVjayhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgaW50IHBhcm1fbnVtYmVyKTsKKworCisvKiogR2V0IGVudW0ncyBzdHJpbmcgdmFsdWUgZ2l2ZW4gaXRzIGludGVybmFsIHZhbHVlCisgKiBccGFyYW1baW5dICAgICAgIHRhYmxlICAgICAgICAgICBFbnVtIHRhYmxlCisgKiBccGFyYW1baW5dICAgICAgIHZhbHVlICAgICAgICAgICBJbnRlcm5hbCB2YWx1ZQorICogXHJldHVybgorICogICAgICBlbnVtIHN0cmluZyB2YWx1ZSBvciBOVUxMIGlmIGludGVybmFsIHZhbHVlIGlzIGludmFsaWQKKyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpiY21jbGlfZW51bV9zdHJpbmd2YWwoY29uc3QgYmNtY2xpX2VudW1fdmFsIHRhYmxlW10sIGxvbmcgdmFsdWUpCit7CisgICAgd2hpbGUodGFibGUtPm5hbWUpCisgICAgeworICAgICAgICBpZiAodGFibGUtPnZhbD09dmFsdWUpCisgICAgICAgICAgICByZXR1cm4gdGFibGUtPm5hbWU7CisgICAgICAgICsrdGFibGU7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKKy8qKiBHZXQgZW51bSdzIHBhcmFtZXRlciBzdHJpbmcgdmFsdWUgZ2l2ZW4gaXRzIGludGVybmFsIHZhbHVlCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX251bWJlciAgICAgUGFyYW1ldGVyIG51bWJlcgorICogXHBhcmFtW2luXSAgICAgICB2YWx1ZSAgICAgICAgICAgSW50ZXJuYWwgdmFsdWUKKyAqIFxyZXR1cm4KKyAqICAgICAgZW51bSBzdHJpbmcgdmFsdWUgb3IgTlVMTCBpZiBwYXJhbWV0ZXIgaXMgbm90IGVudW0gb3IKKyAqICAgICAgaW50ZXJuYWwgdmFsdWUgaXMgaW52YWxpZAorICovCitjb25zdCBjaGFyICpiY21jbGlfZW51bV9wYXJtX3N0cmluZ3ZhbChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgaW50IHBhcm1fbnVtYmVyLCBsb25nIHZhbHVlKTsKKworCisvKiogUHJpbnQgQ0xJIHBhcmFtZXRlciB2YWx1ZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybSAgICAgICAgICAgIFBhcmFtZXRlcgorICovCit2b2lkIGJjbWNsaV9wYXJtX3ByaW50KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pOworCisKKy8qKiBzdHJuY3B5IGZsYXZvdXIgdGhhdCBhbHdheXMgYWRkIDAgdGVybWluYXRvcgorICogXHBhcmFtW2luXSAgICAgICBkc3QgICAgICAgICAgICAgRGVzdGluYXRpb24gc3RyaW5nCisgKiBccGFyYW1baW5dICAgICAgIHNyYyAgICAgICAgICAgICBTb3VyY2Ugc3RyaW5nCisgKiBccGFyYW1baW5dICAgICAgIGRzdF9zaXplICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIgc2l6ZQorICogXHJldHVybiBkc3QKKyAqLworc3RhdGljIGlubGluZSBjaGFyICpiY21jbGlfc3RybmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgdWludDMyX3QgZHN0X3NpemUpCit7CisgICAgc3RybmNweShkc3QsIHNyYywgZHN0X3NpemUtMSk7CisgICAgZHN0W2RzdF9zaXplLTFdID0gMDsKKyAgICByZXR1cm4gZHN0OworfQorCisKKy8qKiBzdHJuY2F0IGZsYXZvdXIgdGhhdCBsaW1pdHMgc2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgZHN0ICAgICAgICAgICAgIERlc3RpbmF0aW9uIHN0cmluZworICogXHBhcmFtW2luXSAgICAgICBzcmMgICAgICAgICAgICAgU291cmNlIHN0cmluZworICogXHBhcmFtW2luXSAgICAgICBkc3Rfc2l6ZSAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyIHNpemUKKyAqIFxyZXR1cm4gZHN0CisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqYmNtY2xpX3N0cm5jYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHVpbnQzMl90IGRzdF9zaXplKQoreworICAgIHVpbnQzMl90IGRzdF9sZW4gPSBzdHJsZW4oZHN0KTsKKyAgICByZXR1cm4gc3RybmNhdChkc3QsIHNyYywgZHN0X3NpemUtZHN0X2xlbi0xKTsKK30KKworLyogUmVkZWZpbmUgYmNtY2xpX3Nlc3Npb25fcHJpbnQgLS0+IGJjbWNsaV9wcmludCAqLworI2RlZmluZSBiY21jbGlfcHJpbnQgYmNtY2xpX3Nlc3Npb25fcHJpbnQKKworLyoqIEVuYWJsZSAvIGRpc2FibGUgQ0xJIGNvbW1hbmQgbG9nZ2luZworICogXHBhcmFtW2luXSAgIG1vZGUgICAgTG9nZ2luZyBmbGFncworICogXHBhcmFtW2luXSAgIGxvZyAgICAgTG9nIHNlc3Npb24uIE11c3QgYmUgc2V0IGlmIG1vZGUgIT0gQkNNQ0xJX0NNRF9MT0dfTk9ORQorICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9sb2dfc2V0KGJjbWNsaV9sb2dfbW9kZSBtb2RlLCBiY21jbGlfc2Vzc2lvbiAqbG9nKTsKKworLyoqIFdyaXRlIHN0cmluZyB0byBDTEkgbG9nLgorICogVGhlIGZ1bmN0aW9uIGlzIGlnbm9yZWQgaWYgQ0xJIGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQgdXNpbmcgYmNtY2xpX2xvZ19zZXQoKQorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgcHJpbnRmLWxpa2UgZm9ybWF0IGZvbGxvd2VkIGJ5IGFyZ3VtZW50cworICovCit2b2lkIGJjbWNsaV9sb2coY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiogQH0gZW5kIGJjbV9jbGkgZ3JvdXAgKi8KKworI2VuZGlmIC8qICNpZm5kZWYgQkNNX0NMSV9IICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXJ2ZXIuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXJ2ZXIuYwpAQCAtMCwwICsxLDU0NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYmNtY2xpX3NlcnZlci5jCisgKgorICogQ0xJIGVuZ2luZSAtIHJlbW90ZSBzaGVsbCBzdXBwb3J0CisgKgorICogVGhpcyBtb2R1bGUgaXMgYSBiYWNrLWVuZCBvZiByZW1vdGUgc2hlbGwgc3VwcG9ydC4KKyAqIC0gbXVsdGlwbGUgc2VydmVycworICogLSBkb21haW4gYW5kIFRDUC1iYXNlZCBjb25uZWN0aW9ucworICogLSBzZXNzaW9uIGFjY2VzcyBsZXZlbCAtIHBlciBzZXJ2ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YmNtY2xpX3NlcnZlci5oPgorCit0eXBlZGVmIHN0cnVjdCBiY21jbGlzX3NlcnZlciBiY21jbGlzX3NlcnZlcl90OworCisvKiBTZXJ2ZXIgY29ubmVjdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlzX2Nvbm4KK3sKKyAgICBzdHJ1Y3QgYmNtY2xpc19jb25uICpuZXh0OworICAgIGJjbWNsaXNfc2VydmVyX3QgKnNlcnZlcjsKKyAgICBjb25zdCBjaGFyICphZGRyZXNzOyAvKiBjbGllbnQgYWRkcmVzcyAqLworICAgIGludCBzb2NrOyAgICAgICAgICAgICAvKiB0cmFuc3BvcnQgc29ja2V0ICovCisgICAgYmRtZl90YXNrIHJ4X3RocmVhZDsKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbjsKKyAgICB1aW50MzJfdCBieXRlc19zZW50OworICAgIHVpbnQzMl90IGJ5dGVzX3JlY2VpdmVkOworICAgIGJkbWZfdGFzayBjb25uX3RocmVhZDsKK30gYmNtY2xpc19jb25uX3Q7CisKKy8qIFNlcnZlciBjb250cm9sIGJkbWZvY2sKKyAqLworc3RydWN0IGJjbWNsaXNfc2VydmVyCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqbmV4dDsKKyAgICBiY21jbGlzX2Nvbm5fdCAqY29ubl9saXN0OworICAgIGludCBzb2NrOyAgICAgICAgICAgICAvKiBsaXN0ZW5pbmcgc29ja2V0ICovCisgICAgYmNtY2xpc19wYXJtX3QgcGFybXM7CisgICAgaW50IGlkOworICAgIGludCBuY29ubnM7CisgICAgYmNtb3NfZmFzdGxvY2sgbG9jazsKKyAgICBiZG1mX3Rhc2sgbGlzdGVuX3RocmVhZDsKK307CisKKy8qIHNvY2FkZHIgdmFyaWFudHMgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIGRvbWFpbl9zYTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gdGNwX3NhOworfSBzb2NrYWRkcl9hbnk7CisKK3N0YXRpYyBiY21jbGlzX3NlcnZlcl90ICpiY21jbGlzX3NlcnZlcnM7CitzdGF0aWMgaW50IGJjbWNsaXNfc2VydmVyX2lkOworCitzdGF0aWMgYmNtY2xpc19zZXJ2ZXJfdCAqYmNtY2xpc19pZF90b19zZXJ2ZXIoaW50IGhzLCBiY21jbGlzX3NlcnZlcl90ICoqcHJldikKK3sKKyAgICBiY21jbGlzX3NlcnZlcl90ICpzPWJjbWNsaXNfc2VydmVyczsKKyAgICBpZiAocHJldikKKyAgICAgICAgKnByZXYgPSBOVUxMOworICAgIHdoaWxlKHMpCisgICAgeworICAgICAgICBpZiAocy0+aWQgPT0gaHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICAqcHJldiA9IHM7CisgICAgICAgIHMgPSBzLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyogUGFyc2UgYWRkcmVzcyBoZWxwZXIgKi8KK3N0YXRpYyBpbnQgYmNtY2xpc19wYXJzZV9hZGRyZXNzKGNvbnN0IGJjbWNsaXNfcGFybV90ICpwYXJtcywgaW50ICpwcm90b2NvbCwgc29ja2FkZHJfYW55ICpzYSwgaW50ICpsZW4pCit7CisgICAgc3dpdGNoKHBhcm1zLT50cmFuc3BvcnQpCisgICAgeworICAgIGNhc2UgQkNNQ0xJX1RSQU5TUE9SVF9ET01BSU5fU09DS0VUOgorICAgIHsKKyAgICAgICAgKnByb3RvY29sID0gQUZfVU5JWDsKKyAgICAgICAgc2EtPmRvbWFpbl9zYS5zdW5fZmFtaWx5ID0gQUZfVU5JWDsgIC8qIGxvY2FsIGlzIGRlY2xhcmVkIGJlZm9yZSBzb2NrZXQoKSBeICovCisgICAgICAgIHN0cmNweShzYS0+ZG9tYWluX3NhLnN1bl9wYXRoLCBwYXJtcy0+YWRkcmVzcyk7CisgICAgICAgICpsZW4gPSBzdHJsZW4oc2EtPmRvbWFpbl9zYS5zdW5fcGF0aCkgKyBzaXplb2Yoc2EtPmRvbWFpbl9zYS5zdW5fZmFtaWx5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQkNNQ0xJX1RSQU5TUE9SVF9UQ1BfU09DS0VUOgorICAgIHsKKyAgICAgICAgKnByb3RvY29sID0gQUZfSU5FVDsKKyAgICAgICAgc2EtPnRjcF9zYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgc2EtPnRjcF9zYS5zaW5fcG9ydCA9IGh0b25zKGF0b2kocGFybXMtPmFkZHJlc3MpKTsKKyAgICAgICAgc2EtPnRjcF9zYS5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgICAgICAqbGVuID0gc2l6ZW9mKHNhLT50Y3Bfc2EpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyogZGlzY29ubmVjdCBjbGllbnQgYW5kIGNsZWFyIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgYmNtY2xpc19kaXNjb25uZWN0KGJjbWNsaXNfY29ubl90ICpjb25uKQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnM9Y29ubi0+c2VydmVyOworICAgIGJjbWNsaXNfY29ubl90ICpjPXMtPmNvbm5fbGlzdCwgKnByZXY9TlVMTDsKKworICAgIGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnMtPmxvY2spOworICAgIHdoaWxlKGMgJiYgYyE9Y29ubikKKyAgICB7CisgICAgICAgIHByZXYgPSBjOworICAgICAgICBjID0gYy0+bmV4dDsKKyAgICB9CisgICAgQlVHX09OKCFjKTsKKyAgICBpZiAocHJldikKKyAgICAgICAgcHJldi0+bmV4dCA9IGMtPm5leHQ7CisgICAgZWxzZQorICAgICAgICBzLT5jb25uX2xpc3QgPSBjLT5uZXh0OworICAgIC0tcy0+bmNvbm5zOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcy0+bG9jayk7CisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoYy0+c2Vzc2lvbik7CisgICAgY2xvc2UoYy0+c29jayk7CisgICAgYmRtZl90YXNrX2Rlc3Ryb3koYy0+cnhfdGhyZWFkKTsKKyAgICBiY21vc19mcmVlKGMpOworfQorCisvKgorICogU2Vzc2lvbiBjYWxsYmFja3MKKyAqLworCisvKiogU2Vzc2lvbidzIG91dHB1dCBmdW5jdGlvbi4KKyAqIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIDwwIGlmIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYmNtY2xpc19jYl9zZXNzX3dyaXRlKHZvaWQgKnVzZXJfcHJpdiwgY29uc3Qgdm9pZCAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbWNsaXNfY29ubl90ICpjPXVzZXJfcHJpdjsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IHNlbmQoYy0+c29jaywgYnVmLCBzaXplLCAwKTsKKyAgICAvKiBkaXNjb25uZWN0IGlmIElPIGVycm9yICovCisgICAgaWYgKHJjIDwgc2l6ZSkKKyAgICAgICAgYmNtY2xpc19kaXNjb25uZWN0KGMpOworICAgIGVsc2UKKyAgICAgICAgYy0+Ynl0ZXNfc2VudCArPSByYzsKKyAgICByZXR1cm4gcmM7Cit9CisKKyNkZWZpbmUgQ0hBUl9FT1QgMHgwNAorCisvKiogU2Vzc2lvbidzIGlucHV0IGZ1bmN0aW9uLgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgPDAgaWYgZXJyb3IKKyAqLworc3RhdGljIGNoYXIgKmJjbWNsaXNfcmVhZF9saW5lKGJjbWNsaXNfY29ubl90ICpjLCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgaW50IGk7CisgICAgaW50IHJjOworICAgIGludCBsZW49MDsKKworICAgIGZvcihpPTA7IGk8c2l6ZS0xOyBpKyspCisgICAgeworICAgICAgICBjaGFyIGNoOworICAgICAgICByYyA9IHJlY3YoYy0+c29jaywgJmNoLCAxLCBNU0dfV0FJVEFMTCk7CisgICAgICAgIGlmIChyYyA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjaCA9PSAnXHInKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjaCA9PSBDSEFSX0VPVCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBidWZbbGVuKytdID0gY2g7CisgICAgICAgIGlmIChjaCA9PSAnXG4nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGMtPmJ5dGVzX3JlY2VpdmVkICs9IGk7CisgICAgYnVmW2xlbl0gPSAwOworICAgIHJldHVybiAobGVuID8gYnVmIDogTlVMTCk7Cit9CisKKy8qIFJlY2VpdmUgaGFuZGxlciAqLworc3RhdGljIGludCBiY21jbGlzX3J4X3RocmVhZF9oYW5kbGVyKHZvaWQgKmFyZykKK3sKKyAgICBjaGFyIGJ1Zls1MTJdOworICAgIGJjbWNsaXNfY29ubl90ICpjPWFyZzsKKworICAgIHdoaWxlKCFiY21jbGlfaXNfc3RvcHBlZChjLT5zZXNzaW9uKSAmJgorICAgICAgICAgIGJjbWNsaXNfcmVhZF9saW5lKGMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3BhcnNlKGMtPnNlc3Npb24sIGJ1Zik7CisgICAgfQorICAgIGJjbWNsaXNfZGlzY29ubmVjdChjKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogTmV3IGNsaWVudCBjb25uZWN0aW9uIGluZGljYXRpb24gKi8KK3N0YXRpYyB2b2lkIGJjbWNsaXNfY29ubmVjdChiY21jbGlzX3NlcnZlcl90ICpzLCBjaGFyICphZGRyLCBpbnQgc29jaykKK3sKKyAgICBiY21jbGlzX2Nvbm5fdCAqYzsKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3NfcGFybTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAocy0+cGFybXMubWF4X2NsaWVudHMgJiYgcy0+bmNvbm5zID49IHMtPnBhcm1zLm1heF9jbGllbnRzKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJiZG1mbW9uczogc2VydmVyICVzOiByZWZ1c2VkIGNvbm5lY3Rpb24gYmVjYXVzZSBtYXggbnVtYmVyIGhhcyBiZWVuIHJlYWNoZWRcbiIsIHMtPnBhcm1zLmFkZHJlc3MpOworICAgICAgICBjbG9zZShzb2NrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpjKSArIHN0cmxlbihhZGRyKSArIDEpOworICAgIGlmICghYykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGMtPmFkZHJlc3MgPSAoY2hhciAqKWMgKyBzaXplb2YoKmMpOworICAgIHN0cmNweSgoY2hhciAqKWMtPmFkZHJlc3MsIGFkZHIpOworICAgIGMtPnNlcnZlciA9IHM7CisgICAgYy0+c29jayA9IHNvY2s7CisKKyAgICAvKiBjcmVhdGUgbmV3IG1hbmFnZW1lbnQgc2Vzc2lvbiAqLworICAgIG1lbXNldCgmc2Vzc19wYXJtLCAwLCBzaXplb2Yoc2Vzc19wYXJtKSk7CisgICAgc2Vzc19wYXJtLmFjY2Vzc19yaWdodCA9IHMtPnBhcm1zLmFjY2VzczsKKyAgICBzZXNzX3Bhcm0ud3JpdGUgPSBiY21jbGlzX2NiX3Nlc3Nfd3JpdGU7CisgICAgc2Vzc19wYXJtLnVzZXJfcHJpdiA9IGM7CisgICAgcmMgPSBiY21jbGlfc2Vzc2lvbl9vcGVuKCZzZXNzX3Bhcm0sICZjLT5zZXNzaW9uKTsKKyAgICBpZiAocmMpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIC8qIHdhaXQgZm9yIHJlY2VpdmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgKi8KKyAgICByYyA9IGJkbWZfdGFza19jcmVhdGUoImJjbWNsaXNfcngiLAorICAgICAgICAgICAgICAgICAgICBCRE1GU1lTX0RFRkFVTFRfVEFTS19QUklPUklUWSwKKyAgICAgICAgICAgICAgICAgICAgQkRNRlNZU19ERUZBVUxUX1RBU0tfU1RBQ0ssCisgICAgICAgICAgICAgICAgICAgIGJjbWNsaXNfcnhfdGhyZWFkX2hhbmRsZXIsIGMsCisgICAgICAgICAgICAgICAgICAgICZjLT5yeF90aHJlYWQpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgYmNtb3NfZmFzdGxvY2tfbG9jaygmcy0+bG9jayk7CisgICAgYy0+bmV4dCA9IHMtPmNvbm5fbGlzdDsKKyAgICBzLT5jb25uX2xpc3QgPSBjOworICAgICsrcy0+bmNvbm5zOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcy0+bG9jayk7CisKKyAgICByZXR1cm47CisKK2NsZWFudXA6CisgICAgY2xvc2Uoc29jayk7CisgICAgaWYgKGMtPnNlc3Npb24pCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKGMtPnNlc3Npb24pOworICAgIGlmIChjKQorICAgICAgICBiY21vc19mcmVlKGMpOworfQorCisvKiBSZWNlaXZlIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYmNtY2xpc19saXN0ZW5fdGhyZWFkX2hhbmRsZXIodm9pZCAqYXJnKQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnM9YXJnOworICAgIHNvY2thZGRyX2FueSBhZGRyOworICAgIHNvY2tsZW5fdCBsZW47CisgICAgaW50IHNvY2s7CisKKyAgICB3aGlsZSgxKQorICAgIHsKKyAgICAgICAgY2hhciBjYWRkcls2NF07CisgICAgICAgIGxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgICAgc29jayA9IGFjY2VwdChzLT5zb2NrLCAmYWRkci5zYSwgJmxlbik7CisgICAgICAgIGlmIChzb2NrIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcGVycm9yKCJhY2NlcHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5wYXJtcy50cmFuc3BvcnQ9PUJDTUNMSV9UUkFOU1BPUlRfRE9NQUlOX1NPQ0tFVCkKKyAgICAgICAgICAgIHN0cm5jcHkoY2FkZHIsIHMtPnBhcm1zLmFkZHJlc3MsIHNpemVvZihjYWRkciktMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoY2FkZHIsIHNpemVvZihjYWRkciktMSwgIiVzOiVkIiwKKyAgICAgICAgICAgICAgICBpbmV0X250b2EoYWRkci50Y3Bfc2Euc2luX2FkZHIpLCBudG9ocyhhZGRyLnRjcF9zYS5zaW5fcG9ydCkpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaXNfY29ubmVjdChzLCBjYWRkciwgc29jayk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogRXh0ZXJuYWwgQVBJCisgKi8KKworLyoqIENyZWF0ZSBzaGVsbCBzZXJ2ZXIuCisgKiBJbW1lZGlhdGVseSBhZnRlciBjcmVhdGlvbiBzZXJ2ZXIgaXMgcmVhZHkgdG8gYWNjZXB0IGNsaWVudCBjb25uZWN0aW9ucworICogXHBhcmFtW2luXSAgIHBhcm1zICAgU2VydmVyIHBhcmFtZXRlcnMKKyAqIFxwYXJhbVtvdXRdICBocyAgICAgIFNlcnZlciBoYW5kbGUKKyAqIFxyZXR1cm4gIDAgLSBPS1xuCisgKiAgICAgICAgIDwwIC0gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlzX3NlcnZlcl9jcmVhdGUoY29uc3QgYmNtY2xpc19wYXJtX3QgKnBhcm1zLCBpbnQgKmhzKQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnM7CisgICAgaW50IHByb3RvY29sOworICAgIHNvY2thZGRyX2FueSBzYTsKKyAgICBpbnQgbGVuOworICAgIGludCByYzsKKworICAgIGlmICghcGFybXMgfHwgIWhzIHx8ICFwYXJtcy0+YWRkcmVzcykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIC8qIHBhcnNlIGFkZHJlc3MgKi8KKyAgICBpZiAoYmNtY2xpc19wYXJzZV9hZGRyZXNzKHBhcm1zLCAmcHJvdG9jb2wsICZzYSwgJmxlbikpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICAvKiBhbGxvY2F0ZSBzZXJ2ZXIgc3RydWN0dXJlICovCisgICAgcyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpc19zZXJ2ZXJfdCkrc3RybGVuKHBhcm1zLT5hZGRyZXNzKSsxKTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIHMtPnBhcm1zID0gKnBhcm1zOworICAgIHMtPnBhcm1zLmFkZHJlc3MgPSAoY2hhciAqKXMgKyBzaXplb2YoKnMpOworICAgIHN0cmNweShzLT5wYXJtcy5hZGRyZXNzLCBwYXJtcy0+YWRkcmVzcyk7CisgICAgcy0+aWQgPSArK2JjbWNsaXNfc2VydmVyX2lkOworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnMtPmxvY2spOworCisgICAgLyogY3JlYXRlIHNvY2tldCBhbmQgc3RhcnQgbGlzdGVuaW5nICovCisgICAgcy0+c29jayA9IHNvY2tldChwcm90b2NvbCwgU09DS19TVFJFQU0sIDApOworICAgIGlmICgocy0+c29jayA8IDApIHx8CisgICAgICAgIChiaW5kKHMtPnNvY2ssICZzYS5zYSwgbGVuKSA8IDApIHx8CisgICAgICAgIChsaXN0ZW4ocy0+c29jaywgMSkgPCAwKSkKKyAgICB7CisgICAgICAgIHBlcnJvcigic29ja2V0L2JpbmQvbGlzdGVuIik7CisgICAgICAgIGNsb3NlKHMtPnNvY2spOworICAgICAgICBiY21vc19mcmVlKHMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIHdhaXQgZm9yIGNvbm5lY3Rpb24ocykgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgKi8KKyAgICByYyA9IGJkbWZfdGFza19jcmVhdGUoImJjbWNsaXNfbGlzdGVuIiwKKyAgICAgICAgICAgICAgICAgICAgQkRNRlNZU19ERUZBVUxUX1RBU0tfUFJJT1JJVFksCisgICAgICAgICAgICAgICAgICAgIEJETUZTWVNfREVGQVVMVF9UQVNLX1NUQUNLLAorICAgICAgICAgICAgICAgICAgICBiY21jbGlzX2xpc3Rlbl90aHJlYWRfaGFuZGxlciwgcywKKyAgICAgICAgICAgICAgICAgICAgJnMtPmxpc3Rlbl90aHJlYWQpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGNsb3NlKHMtPnNvY2spOworICAgICAgICBiY21vc19mcmVlKHMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogYWxsIGdvb2QgKi8KKyAgICBzLT5uZXh0ID0gYmNtY2xpc19zZXJ2ZXJzOworICAgIGJjbWNsaXNfc2VydmVycyA9IHM7CisgICAgKmhzID0gcy0+aWQ7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqIERlc3Ryb3kgc2hlbGwgc2VydmVyLgorICogQWxsIGNsaWVudCBjb25uZWN0aW9ucyBpZiBhbnkgYXJlIGNsb3NlZAorICogXHBhcmFtW2luXSAgIGhzICAgICAgU2VydmVyIGhhbmRsZQorICogXHJldHVybiAgMCAtIE9LXG4KKyAqICAgICAgICAgPDAgLSBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaXNfc2VydmVyX2Rlc3Ryb3koaW50IGhzKQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnByZXY7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqcyA9IGJjbWNsaXNfaWRfdG9fc2VydmVyKGhzLCAmcHJldik7CisgICAgYmNtY2xpc19jb25uX3QgKmM7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIGJkbWZfdGFza19kZXN0cm95KHMtPmxpc3Rlbl90aHJlYWQpOworICAgIGNsb3NlKHMtPnNvY2spOworCisgICAgLyogZGlzY29ubmVjdCBhbGwgY2xpZW50cyAqLworICAgIHdoaWxlKChjID0gcy0+Y29ubl9saXN0KSkKKyAgICAgICAgYmNtY2xpc19kaXNjb25uZWN0KGMpOworCisgICAgLyogZGVzdHJveSBzZXJ2ZXIgKi8KKyAgICBiY21vc19mYXN0bG9ja19sb2NrKCZzLT5sb2NrKTsKKyAgICBpZiAocHJldikKKyAgICAgICAgcHJldi0+bmV4dCA9IHMtPm5leHQ7CisgICAgZWxzZQorICAgICAgICBiY21jbGlzX3NlcnZlcnMgPSBzLT5uZXh0OworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcy0+bG9jayk7CisKKyAgICBiY21vc19mcmVlKHMpOworICAgIHJldHVybiAwOworfQorCisvKgorICogU2hlbGwgY29tbWFuZCBoYW5kbGVycworICovCisKK3N0YXRpYyBiY21jbGlfZW51bV92YWwgdHJhbnNwb3J0X3R5cGVfZW51bV90YWJkbWZlW10gPSB7CisgICAgeyAubmFtZT0iZG9tYWluX3NvY2tldCIsIC52YWw9QkNNQ0xJX1RSQU5TUE9SVF9ET01BSU5fU09DS0VUfSwKKyAgICB7IC5uYW1lPSJ0Y3Bfc29ja2V0IiwgLnZhbD1CQ01DTElfVFJBTlNQT1JUX1RDUF9TT0NLRVR9LAorICAgIEJDTUNMSV9FTlVNX0xBU1QKK307CisKK3N0YXRpYyBiY21jbGlfZW51bV92YWwgYWNjZXNzX3R5cGVfZW51bV90YWJkbWZlW10gPSB7CisgICAgeyAubmFtZT0iZ3Vlc3QiLCAudmFsPUJDTUNMSV9BQ0NFU1NfR1VFU1R9LAorICAgIHsgLm5hbWU9ImFkbWluIiwgLnZhbD1CQ01DTElfQUNDRVNTX0FETUlOfSwKKyAgICB7IC5uYW1lPSJkZWJ1ZyIsIC52YWw9QkNNQ0xJX0FDQ0VTU19ERUJVR30sCisgICAgQkNNQ0xJX0VOVU1fTEFTVAorfTsKKworLyogQ3JlYXRlIHJlbW90ZSBzaGVsbCBzZXJ2ZXIKKyAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInRyYW5zcG9ydCIsICJUcmFuc3BvcnQgdHlwZSIsIHRyYW5zcG9ydF90eXBlX2VudW1fdGFiZG1mZSwgMCksCisgICAgQkNNQ0xJX01BS0VfUEFSTSgiYWRkcmVzcyIsICJCaW5kIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApLAorICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiYWNjZXNzIiwgIkFjY2VzcyBsZXZlbCIsIGFjY2Vzc190eXBlX2VudW1fdGFiZG1mZSwgMCksCisgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoIm1heF9jbGllbnRzIiwgIk1heCBjbGllbnRzLiAwPWRlZmF1bHQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDAsIDApLAorKi8KK3N0YXRpYyBpbnQgYmNtY2xpc19tb25fY3JlYXRlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21jbGlzX3RyYW5zcG9ydF90eXBlX3QgdHJhbnNwb3J0ID0gKGJjbWNsaXNfdHJhbnNwb3J0X3R5cGVfdClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICBjaGFyICphZGRyZXNzID0gKGNoYXIgKilwYXJtWzFdLnZhbHVlLm51bWJlcjsKKyAgICBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2VzcyA9IChiY21jbGlfYWNjZXNzX3JpZ2h0KXBhcm1bMl0udmFsdWUubnVtYmVyOworICAgIGludCBtYXhfY2xpZW50cyA9IChpbnQpcGFybVszXS52YWx1ZS5udW1iZXI7CisgICAgYmNtY2xpc19wYXJtX3QgcGFybXM7CisgICAgaW50IGhzOworICAgIGludCByYzsKKworICAgIG1lbXNldCgmcGFybXMsIDAsIHNpemVvZihwYXJtcykpOworICAgIHBhcm1zLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICBwYXJtcy5hY2Nlc3MgPSBhY2Nlc3M7CisgICAgcGFybXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgcGFybXMubWF4X2NsaWVudHMgPSBtYXhfY2xpZW50czsKKyAgICByYyA9IGJjbWNsaXNfc2VydmVyX2NyZWF0ZSgmcGFybXMsICZocyk7CisgICAgaWYgKHJjKQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiYmNtY2xpc19zZXJ2ZXJfY3JlYXRlKCkgZmFpbGVkIHdpdGggcmM9JWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIGVsc2UKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlbW90ZSBzaGVsbCBzZXJ2ZXIgY3JlYXRlZC4gU2VydmVyIGlkICVkXG4iLCBocyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBEZXN0cm95IHJlbW90ZSBzaGVsbCBzZXJ2ZXIKKyAgICBCQ01DTElfTUFLRV9QQVJNKCJzZXJ2ZXJfaWQiLCAiU2VydmVyIGlkIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyovCitzdGF0aWMgaW50IGJjbWNsaXNfbW9uX2Rlc3Ryb3koYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGludCBocyA9IChpbnQpcGFybVswXS52YWx1ZS5udW1iZXI7CisgICAgaW50IHJjOworICAgIHJjID0gYmNtY2xpc19zZXJ2ZXJfZGVzdHJveShocyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlbW90ZSBzaGVsbCBzZXJ2ZXIgJWQgZGVzdHJveWVkLiByYz0lZCAtICVzXG4iLAorICAgICAgICBocywgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBTaG93IHJlbW90ZSBzaGVsbCBzZXJ2ZXJzCisqLworc3RhdGljIGludCBiY21jbGlzX21vbl9zaG93KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21jbGlzX3NlcnZlcl90ICpzPWJjbWNsaXNfc2VydmVyczsKKyAgICBiY21jbGlzX2Nvbm5fdCAqYzsKKyAgICB3aGlsZShzKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlbW90ZSBzZXJ2ZXIgJWQgYXQgJXNcbiIsIHMtPmlkLCBzLT5wYXJtcy5hZGRyZXNzKTsKKyAgICAgICAgYyA9IHMtPmNvbm5fbGlzdDsKKyAgICAgICAgd2hpbGUoYykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlx0IC0gJXMuIGJ5dGVzIHNlbnQ6JWQgcmVjZWl2ZWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgYy0+YWRkcmVzcywgYy0+Ynl0ZXNfc2VudCwgYy0+Ynl0ZXNfcmVjZWl2ZWQpOworICAgICAgICAgICAgYyA9IGMtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcyA9IHMtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBDcmVhdGUgc2hlbGxfc2VydmVyIGRpcmVjdG9yeSBpbiByb290X2RpcgorICAgUmV0dXJucyB0aGUgInNoZWxsX3NlcnZlciIgZGlyZWN0b3J5IGhhbmRsZQorKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpc19zZXJ2ZXJfbW9uX2luaXQoYmNtY2xpX2VudHJ5ICpyb290X2RpcikKK3sKKyAgICBiY21jbGlfZW50cnkgKnNoZWxsX2RpcjsKKworICAgIGlmICgoc2hlbGxfZGlyPWJjbWNsaV9kaXJfZmluZChOVUxMLCAic2hlbGxfc2VydmVyIikpIT1OVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNoZWxsX2RpciA9IGJjbWNsaV9kaXJfYWRkKHJvb3RfZGlyLCAic2hlbGxfc2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbW90ZSBTaGVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworCisgICAgeworICAgICAgICBzdGF0aWMgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW109eworICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IHR5cGUiLCB0cmFuc3BvcnRfdHlwZV9lbnVtX3RhYmRtZmUsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYWRkcmVzcyIsICJCaW5kIGFkZHJlc3M6IGRvbWFpbl9zb2NrZXQgYWRkcmVzcyBvciBUQ1AgcG9ydCIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImFjY2VzcyIsICJBY2Nlc3MgbGV2ZWwiLCBhY2Nlc3NfdHlwZV9lbnVtX3RhYmRtZmUsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoIm1heF9jbGllbnRzIiwgIk1heCBjbGllbnRzLiAwPWRlZmF1bHQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDAsIDApLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTElTVF9URVJNSU5BVE9SCisgICAgICAgIH07CisgICAgICAgIGJjbWNsaV9jbWRfYWRkKHNoZWxsX2RpciwgImNyZWF0ZSIsIGJjbWNsaXNfbW9uX2NyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlIHJlbW90ZSBzaGVsbCBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwsIHBhcm1zKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfY21kX3Bhcm0gcGFybXNbXT17CisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzZXJ2ZXJfaWQiLCAiU2VydmVyIGlkIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0xJU1RfVEVSTUlOQVRPUgorICAgICAgICB9OworICAgICAgICBiY21jbGlfY21kX2FkZChzaGVsbF9kaXIsICJkZXN0cm95IiwgYmNtY2xpc19tb25fZGVzdHJveSwKKyAgICAgICAgICAgICAgICAgICAgICAiRGVzdHJveSByZW1vdGUgc2hlbGwgc2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMLCBwYXJtcyk7CisgICAgfQorCisgICAgeworICAgICAgICBiY21jbGlfY21kX2FkZChzaGVsbF9kaXIsICJzaG93IiwgYmNtY2xpc19tb25fc2hvdywKKyAgICAgICAgICAgICAgICAgICAgICAiU2hvdyByZW1vdGUgc2hlbGwgc2VydmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIHNoZWxsX2RpcjsKK30KKworLyogRGVzdHJveSBzaGVsbF9zZXJ2ZXIgZGlyZWN0b3J5CisqLwordm9pZCBiY21jbGlzX3NlcnZlcl9tb25fZGVzdHJveSh2b2lkKQoreworICAgIGJjbWNsaV9lbnRyeSAqc2hlbGxfZGlyOworICAgIHNoZWxsX2Rpcj1iY21jbGlfZGlyX2ZpbmQoTlVMTCwgInNoZWxsX3NlcnZlciIpOworICAgIGlmIChzaGVsbF9kaXIpCisgICAgICAgIGJjbWNsaV90b2tlbl9kZXN0cm95KHNoZWxsX2Rpcik7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3NlcnZlci5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlNzRlNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3NlcnZlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIC1tb25fc2VydmVyLmgKKyAqCisgKiBCTCBmcmFtZXdvcmsgLSByZW1vdGUgc2hlbGwgc3VwcG9ydAorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGEgYmFjay1lbmQgb2YgcmVtb3RlIHNoZWxsIHN1cHBvcnQuCisgKiAtIG11bHRpcGxlIHNlcnZlcnMKKyAqIC0gZG9tYWluIGFuZCBUQ1AtYmFzZWQgY29ubmVjdGlvbnMKKyAqIC0gc2Vzc2lvbiBhY2Nlc3MgbGV2ZWwgLSBwZXIgc2VydmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQ01DTElfU0VSVkVSX0hfCisjZGVmaW5lIEJDTUNMSV9TRVJWRVJfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKy8qKiBTaGVsbCBzZXJ2ZXIgdHJhbnNwb3J0IHR5cGUKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBCQ01DTElfVFJBTlNQT1JUX0RPTUFJTl9TT0NLRVQsCisgICAgQkNNQ0xJX1RSQU5TUE9SVF9UQ1BfU09DS0VULAorCisgICAgQkNNQ0xJX1RSQU5TUE9SVF9fTlVNQkVSX09GCit9IGJjbWNsaXNfdHJhbnNwb3J0X3R5cGVfdDsKKworLyoqIFNoZWxsIHNlcnZlciBwYXJhbWV0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaXNfcGFybQoreworICAgIGJjbWNsaV9hY2Nlc3NfcmlnaHQgYWNjZXNzOyAgICAgICAgIC8qKjwgQWNjZXNzIHJpZ2h0cyAqLworICAgIGJjbWNsaXNfdHJhbnNwb3J0X3R5cGVfdCB0cmFuc3BvcnQ7IC8qKjwgVHJhbnNwb3J0IHR5cGUgKi8KKyAgICBjaGFyICphZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IEFkZHJlc3MgaW4gc3RyaW5nIGZvcm06IGRvbWFpbiBzb2NrZXQgZmlsZSBpbiBsb2NhbCBGUzsgcG9ydCBmb3IgVENQIHNvY2tldCAqLworICAgIGludCBtYXhfY2xpZW50czsgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBjbGllbnRzICovCit9IGJjbWNsaXNfcGFybV90OworCisKKy8qKiBDcmVhdGUgc2hlbGwgc2VydmVyLgorICogSW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24gc2VydmVyIGlzIHJlYWR5IHRvIGFjY2VwdCBjbGllbnQgY29ubmVjdGlvbnMKKyAqIFxwYXJhbVtpbl0gICBwYXJtcyAgIFNlcnZlciBwYXJhbWV0ZXJzCisgKiBccGFyYW1bb3V0XSAgaHMgICAgICBTZXJ2ZXIgaGFuZGxlCisgKiBccmV0dXJuICAwIC0gT0tcbgorICogICAgICAgICA8MCAtIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpc19zZXJ2ZXJfY3JlYXRlKGNvbnN0IGJjbWNsaXNfcGFybV90ICpwYXJtcywgaW50ICpocyk7CisKKy8qKiBEZXN0cm95IHNoZWxsIHNlcnZlci4KKyAqIEFsbCBjbGllbnQgY29ubmVjdGlvbnMgaWYgYW55IGFyZSBjbG9zZWQKKyAqIFxwYXJhbVtpbl0gICBocyAgICAgIFNlcnZlciBoYW5kbGUKKyAqIFxyZXR1cm4gIDAgLSBPS1xuCisgKiAgICAgICAgIDwwIC0gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlzX3NlcnZlcl9kZXN0cm95KGludCBocyk7CisKKworLyogQ3JlYXRlIHNoZWxsX3NlcnZlciBkaXJlY3RvcnkgaW4gcm9vdF9kaXIKKyAgIFJldHVybnMgdGhlICJzaGVsbF9zZXJ2ZXIiIGRpcmVjdG9yeSBoYW5kbGUKKyovCitiY21jbGlfZW50cnkgKmJjbWNsaXNfc2VydmVyX21vbl9pbml0KGJjbWNsaV9lbnRyeSAqcm9vdF9kaXIpOworCisKKy8qIERlc3Ryb3kgc2hlbGxfc2VydmVyIGRpcmVjdG9yeQorKi8KK3ZvaWQgYmNtY2xpc19zZXJ2ZXJfbW9uX2Rlc3Ryb3kodm9pZCk7CisKKyNlbmRpZiAvKiBCQ01DTElfU0VSVkVSX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXNzaW9uLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXNzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5ZWFhOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3Nlc3Npb24uYwpAQCAtMCwwICsxLDU4NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYmNtY2xpX3Nlc3Npb24uYworICoKKyAqIENMSSBlbmdpbmUgLSBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF91dGlscy5oPgorCisjZGVmaW5lIEJDTUNMSV9JTlRFUk5BTAorI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisKK3N0YXRpYyBiY21vc19mYXN0bG9jayBzZXNzaW9uX2xvY2s7CitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb25fbGlzdDsKK3N0YXRpYyBpbnQgc2Vzc2lvbl9tb2R1bGVfaW5pdGlhbGl6ZWQ7CisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBfYmNtY2xpX3Nlc3Npb25fdXBkYXRlX3Byb21wdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBpZiAoIXNlc3Npb24pCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzZXNzaW9uLT5wYXJtcy5nZXRfcHJvbXB0KQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi0+cGFybXMuZ2V0X3Byb21wdChzZXNzaW9uLCBzZXNzaW9uLT5wcm9tcHRfYnVmLCBCQ01DTElfTUFYX1BST01QVF9MRU4pOworICAgICAgICBzZXNzaW9uLT5wcm9tcHRfYnVmW0JDTUNMSV9NQVhfUFJPTVBUX0xFTiAtIDFdID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi0+cHJvbXB0X2J1ZlswXSA9ICdcMCc7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqX2JjbWNsaV9zZXNzaW9uX2dldHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyICpsaW5lID0gTlVMTDsKKyAgICBfYmNtY2xpX3Nlc3Npb25fdXBkYXRlX3Byb21wdChzZXNzaW9uKTsKKyNpZmRlZiBDT05GSUdfTElCRURJVAorICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24tPmVsICYmIHNlc3Npb24tPmhpc3RvcnkpCisgICAgeworICAgICAgICBpbnQgbGluZV9sZW47CisgICAgICAgIGxpbmUgPSAoZWxfZ2V0cyhzZXNzaW9uLT5lbCwgJmxpbmVfbGVuKSk7CisgICAgICAgIGlmICghbGluZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAobGluZV9sZW4gPiBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wcmludGYoIiVzOiBidWZmZXIgaXMgdG9vIHNob3J0ICV1IC0gZ290ICVkLiBUcnVuY2F0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpemUsIGxpbmVfbGVuKTsKKyAgICAgICAgfQorICAgICAgICBzdHJuY3B5KGJ1ZmZlciwgbGluZSwgc2l6ZSk7CisgICAgICAgIGlmICgqbGluZSAmJiAqbGluZSAhPSAnXG4nICYmICpsaW5lICE9ICcjJykKKyAgICAgICAgICAgIGhpc3Rvcnkoc2Vzc2lvbi0+aGlzdG9yeSwgJnNlc3Npb24tPmhpc3RldmVudCwgSF9FTlRFUiwgbGluZSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIENPTkZJR19MSU5FTk9JU0UKKyAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLT5sbl9zZXNzaW9uKQorICAgIHsKKyAgICAgICAgY2hhciAqbG5fbGluZSA9IGxpbmVub2lzZShzZXNzaW9uLT5sbl9zZXNzaW9uLCBzZXNzaW9uLT5wcm9tcHRfYnVmLCBidWZmZXIsIHNpemUpOworICAgICAgICBpZiAobG5fbGluZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmxlbihsbl9saW5lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5lbm9pc2VIaXN0b3J5QWRkKHNlc3Npb24tPmxuX3Nlc3Npb24sIGxuX2xpbmUpOyAvKiBBZGQgdG8gdGhlIGhpc3RvcnkuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RybmNweShidWZmZXIsICJcbiIsIHNpemUtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJbc2l6ZS0xXSA9IDA7CisgICAgICAgICAgICBsaW5lID0gYnVmZmVyOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiVzIiwgc2Vzc2lvbi0+cHJvbXB0X2J1Zik7CisgICAgICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24tPnBhcm1zLmdldHMpCisgICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi0+cGFybXMuZ2V0cyhzZXNzaW9uLCBidWZmZXIsIHNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW5lID0gZmdldHMoYnVmZmVyLCBzaXplLCBzdGRpbik7CisgICAgfQorICAgIHJldHVybiBsaW5lID8gYnVmZmVyIDogTlVMTDsKK30KKworI2lmZGVmIENPTkZJR19MSUJFRElUCisKK3N0YXRpYyBjaGFyICpfYmNtY2xpX2VkaXRsaW5lX3Byb21wdChFZGl0TGluZSAqZSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisgICAgZWxfZ2V0KGUsIEVMX0NMSUVOVERBVEEsICZzZXNzaW9uKTsKKyAgICBCVUdfT04oc2Vzc2lvbiA9PSBOVUxMIHx8IHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICBfYmNtY2xpX3Nlc3Npb25fdXBkYXRlX3Byb21wdChzZXNzaW9uKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+cHJvbXB0X2J1ZjsKK30KKworc3RhdGljIGludCBfYmNtY2xpX2VkaXRsaW5lX2NmbihFZGl0TGluZSAqZWwsIGNoYXIgKmMpCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOworICAgIGNoYXIgaW5zZXJ0X2J1Zls4MF07CisgICAgaW50IGMxOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgZWxfZ2V0KGVsLCBFTF9DTElFTlREQVRBLCAmc2Vzc2lvbik7CisgICAgQlVHX09OKHNlc3Npb24gPT0gTlVMTCB8fCBzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgYzEgPSBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhcihzZXNzaW9uKTsKKworICAgIC8qIFRvRG86IGhhbmRsZSBcdCBwYXJhbWV0ZXIgZXh0ZW5zaW9uICovCisgICAgd2hpbGUgKGMxID4gMCAmJiBjMSA9PSAnXHQnKQorICAgIHsKKworICAgICAgICBjb25zdCBMaW5lSW5mbyAqbGkgPSBlbF9saW5lKGVsKTsKKyAgICAgICAgY2hhciAqbGluZSA9IGJjbW9zX2FsbG9jKGxpLT5jdXJzb3IgLSBsaS0+YnVmZmVyICsgMSk7CisgICAgICAgIGlmICghbGluZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBtZW1jcHkobGluZSwgbGktPmJ1ZmZlciwgbGktPmN1cnNvciAtIGxpLT5idWZmZXIpOworICAgICAgICBsaW5lW2xpLT5jdXJzb3IgLSBsaS0+YnVmZmVyXSA9IDA7CisgICAgICAgIHJjID0gYmNtY2xpX2V4dGVuZChzZXNzaW9uLCBsaW5lLCBpbnNlcnRfYnVmLCBzaXplb2YoaW5zZXJ0X2J1ZikpOworICAgICAgICBiY21vc19mcmVlKGxpbmUpOworICAgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGMxID0gc2Vzc2lvbi0+cGFybXMuZ2V0X2NoYXIoc2Vzc2lvbik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbF9pbnNlcnRzdHIoZWwsIGluc2VydF9idWYpOworICAgICAgICBwcmludGYoIlxyIik7CisgICAgICAgIGVsX3NldChlbCwgRUxfUkVGUkVTSCwgTlVMTCk7CisgICAgICAgIGMxID0gc2Vzc2lvbi0+cGFybXMuZ2V0X2NoYXIoc2Vzc2lvbik7CisgICAgfQorICAgIGlmIChjMSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqYyA9IGMxOworICAgIHJldHVybiAxOworfQorI2VuZGlmCisKKy8qIGxpbmVub2lzZSBsaW5lIGVkaXRpbmcgbGlicmFyeTogY29tcGxldGlvbiBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorCitzdGF0aWMgaW50IF9iY21jbGlfbGluZW5vaXNlX3JlYWRfY2hhcihsb25nIGZkX2luLCBjaGFyICpjKQoreworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uID0gKGJjbWNsaV9zZXNzaW9uICopZmRfaW47CisgICAgaW50IGMxOworICAgIGMxID0gc2Vzc2lvbi0+cGFybXMuZ2V0X2NoYXIoc2Vzc2lvbik7CisgICAgaWYgKGMxIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmMgPSBjMTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYmNtY2xpX2xpbmVub2lzZV93cml0ZShsb25nIGZkX291dCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uID0gKGJjbWNsaV9zZXNzaW9uICopZmRfb3V0OworICAgIC8qIFVzZSBhIHNob3J0Y3V0IGZvciBsZW49PTEgLSB3aGljaCBpcyBjaGFyLWJ5LWNoYXIgaW5wdXQuCisgICAgICAgYmNtb3NfcHJpbnRmKCIlKnMiLCBidWYsIDEpIG1pc2JlaGF2ZXMgb24gdnh3IHBsYXRmb3JtLAorICAgICAgIHBvc3NpYmx5IGJlY2F1c2UgaXQgaXMgdG9vIHNsb3cuCisgICAgKi8KKyAgICBpZiAobGVuID09IDEgJiYgIXNlc3Npb24tPnBhcm1zLndyaXRlKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHV0Y2hhcihidWZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIGJjbWNsaV9zZXNzaW9uX3dyaXRlKHNlc3Npb24sIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCBfYmNtY2xpX2xpbmVub2lzZV90YWIobGluZW5vaXNlU2Vzc2lvbiAqbG5fc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCBpbnQgcG9zKQoreworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKyAgICBjaGFyICpsaW5lOworICAgIGNoYXIgaW5zZXJ0X2J1Zls4MF09IiI7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgaW50IGxlbjsKKworICAgIHNlc3Npb24gPSBsaW5lbm9pc2VTZXNzaW9uRGF0YShsbl9zZXNzaW9uKTsKKyAgICBCVUdfT04oc2Vzc2lvbiA9PSBOVUxMIHx8IHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICBsaW5lID0gYmNtb3NfYWxsb2Moc3RybGVuKGJ1ZikrMSk7CisgICAgaWYgKCFsaW5lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJjcHkobGluZSwgYnVmKTsKKyAgICByYyA9IGJjbWNsaV9leHRlbmQoc2Vzc2lvbiwgbGluZSwgaW5zZXJ0X2J1Ziwgc2l6ZW9mKGluc2VydF9idWYpKTsKKyAgICBiY21vc19mcmVlKGxpbmUpOworICAgIGlmIChyYyB8fCAhc3RybGVuKGluc2VydF9idWYpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGxlbiA9IHN0cmxlbihidWYpOworICAgIGxpbmUgPSBiY21vc19hbGxvYyhzdHJsZW4oYnVmKStzdHJsZW4oaW5zZXJ0X2J1ZikrMSk7CisgICAgaWYgKCFsaW5lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocG9zID49MCAmJiBwb3MgPCBsZW4pCisgICAgeworICAgICAgICBzdHJuY3B5KGxpbmUsIGJ1ZiwgcG9zKTsKKyAgICAgICAgbGluZVtwb3NdID0gMDsKKyAgICAgICAgc3RyY2F0KGxpbmUsIGluc2VydF9idWYpOworICAgICAgICBzdHJjYXQobGluZSwgJmJ1Zltwb3NdKTsKKyAgICAgICAgcG9zICs9IHN0cmxlbihpbnNlcnRfYnVmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyY3B5KGxpbmUsIGJ1Zik7CisgICAgICAgIHN0cmNhdChsaW5lLCBpbnNlcnRfYnVmKTsKKyAgICAgICAgcG9zID0gc3RybGVuKGxpbmUpOworICAgIH0KKyAgICBsaW5lbm9pc2VTZXRCdWZmZXIobG5fc2Vzc2lvbiwgbGluZSwgcG9zKTsKKyAgICBiY21vc19mcmVlKGxpbmUpOworICAgIHJldHVybiAxOworfQorCisjZW5kaWYKKworLyogRGVmYXVsdCBnZXRjIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IF9iY21jbGlfc2Vzc2lvbl9nZXRfY2hhcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICByZXR1cm4gYmNtb3NfZ2V0Y2hhcigpOworfQorCisvKiogSW5pdGlhbGl6ZSBzZXNzaW9uIG1hbmFnZW1lbnQgbW9kdWxlCisgKiBccmV0dXJuCisgKiAgICAgIDAgICA9T0tcbgorICogICAgICA8MCAgPWVycm9yIGNvZGUKKyAqLworc3RhdGljIHZvaWQgYmNtY2xpX3Nlc3Npb25fbW9kdWxlX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZzZXNzaW9uX2xvY2ssIDApOworICAgIHNlc3Npb25fbW9kdWxlX2luaXRpYWxpemVkID0gMTsKK30KKworLyoqIE9wZW4gbWFuYWdlbWVudCBzZXNzaW9uICovCitpbnQgYmNtY2xpX3Nlc3Npb25fb3Blbl91c2VyKGNvbnN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0gKnBhcm0sIGJjbWNsaV9zZXNzaW9uICoqcF9zZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIGJjbWNsaV9zZXNzaW9uICoqcF9sYXN0X25leHQ7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjaGFyICpuYW1lX2Nsb25lOworICAgIGxvbmcgZmxhZ3M7CisgICAgaW50IHNpemU7CisKKyAgICBpZiAoIXBfc2Vzc2lvbiB8fCAhcGFybSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyNpZm5kZWYgQ09ORklHX0VESVRMSU5FCisgICAgaWYgKHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfRU5BQkxFKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJMaW5lIGVkaXRpbmcgZmVhdHVyZSBpcyBub3QgY29tcGlsZWQgaW4uIGRlZmluZSBDT05GSUdfRURJVExJTkVcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKyNlbmRpZgorICAgIGlmICghc2Vzc2lvbl9tb2R1bGVfaW5pdGlhbGl6ZWQpCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX21vZHVsZV9pbml0KCk7CisgICAgbmFtZSA9IHBhcm0tPm5hbWU7CisgICAgaWYgKCFuYW1lKQorICAgICAgICBuYW1lID0gIip1bm5hbWVkKiI7CisgICAgc2l6ZSA9IHNpemVvZihiY21jbGlfc2Vzc2lvbikgKyBzdHJsZW4obmFtZSkgKyAxICsgcGFybS0+ZXh0cmFfc2l6ZTsKKyAgICBzZXNzaW9uPWJjbW9zX2NhbGxvYyhzaXplKTsKKyAgICBpZiAoIXNlc3Npb24pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIHNlc3Npb24tPnBhcm1zID0gKnBhcm07CisgICAgbmFtZV9jbG9uZSA9IChjaGFyICopc2Vzc2lvbiArIHNpemVvZihiY21jbGlfc2Vzc2lvbikgKyBwYXJtLT5leHRyYV9zaXplOworICAgIHN0cmNweShuYW1lX2Nsb25lLCBuYW1lKTsKKyAgICBzZXNzaW9uLT5wYXJtcy5uYW1lID0gbmFtZV9jbG9uZTsKKyAgICBpZiAoIXNlc3Npb24tPnBhcm1zLmdldF9jaGFyKQorICAgICAgICBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhciA9IF9iY21jbGlfc2Vzc2lvbl9nZXRfY2hhcjsKKworI2lmZGVmIENPTkZJR19MSUJFRElUCisgICAgaWYgKCFwYXJtLT5nZXRzICYmIChwYXJtLT5saW5lX2VkaXRfbW9kZSA9PSBCQ01DTElfTElORV9FRElUX0VOQUJMRSB8fAorICAgICAgICBwYXJtLT5saW5lX2VkaXRfbW9kZSA9PSBCQ01DTElfTElORV9FRElUX0RFRkFVTFQpKQorICAgIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBlZGl0bGluZSBsaWJyYXJ5ICovCisgICAgICAgIHNlc3Npb24tPmVsID0gZWxfaW5pdChzZXNzaW9uLT5wYXJtcy5uYW1lLCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIpOworICAgICAgICBzZXNzaW9uLT5oaXN0b3J5ID0gaGlzdG9yeV9pbml0KCk7CisgICAgICAgIGlmIChzZXNzaW9uLT5lbCAmJiBzZXNzaW9uLT5oaXN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBlbF9zZXQoc2Vzc2lvbi0+ZWwsIEVMX0VESVRPUiwgImVtYWNzIik7CisgICAgICAgICAgICBlbF9zZXQoc2Vzc2lvbi0+ZWwsIEVMX1BST01QVCwgJl9iY21jbGlfZWRpdGxpbmVfcHJvbXB0KTsKKyAgICAgICAgICAgIGVsX3NldChzZXNzaW9uLT5lbCwgRUxfVEVSTUlOQUwsICJ4dGVybSIpOworICAgICAgICAgICAgZWxfc2V0KHNlc3Npb24tPmVsLCBFTF9HRVRDRk4sIF9iY21jbGlfZWRpdGxpbmVfY2ZuKTsKKyAgICAgICAgICAgIGVsX3NldChzZXNzaW9uLT5lbCwgRUxfQ0xJRU5UREFUQSwgc2Vzc2lvbik7CisgICAgICAgICAgICBoaXN0b3J5KHNlc3Npb24tPmhpc3RvcnksICZzZXNzaW9uLT5oaXN0ZXZlbnQsIEhfU0VUU0laRSwgODAwKTsKKyAgICAgICAgICAgIGVsX3NldChzZXNzaW9uLT5lbCwgRUxfSElTVCwgaGlzdG9yeSwgc2Vzc2lvbi0+aGlzdG9yeSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkNhbid0IGluaXRpYWxpemUgZWRpdGxpbmUgbGlicmFyeVxuIik7CisgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19MSU5FTk9JU0UKKyAgICAvKiBTZXQgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2suIFRoaXMgd2lsbCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUKKyAgICAgKiB1c2VyIHVzZXMgdGhlIDx0YWI+IGtleS4gKi8KKyAgICBpZiAoIXBhcm0tPmdldHMgJiYgKHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfRU5BQkxFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJtLT5saW5lX2VkaXRfbW9kZSA9PSBCQ01DTElfTElORV9FRElUX0RFRkFVTFQpKQorICAgIHsKKyAgICAgICAgbGluZW5vaXNlU2Vzc2lvbklPIGlvPXsuZmRfaW49KGxvbmcpc2Vzc2lvbiwgLmZkX291dD0obG9uZylzZXNzaW9uLAorICAgICAgICAgICAgLnJlYWRfY2hhcj1fYmNtY2xpX2xpbmVub2lzZV9yZWFkX2NoYXIsCisgICAgICAgICAgICAud3JpdGU9X2JjbWNsaV9saW5lbm9pc2Vfd3JpdGUKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGxpbmVub2lzZVNlc3Npb25PcGVuKCZpbywgc2Vzc2lvbiwgJnNlc3Npb24tPmxuX3Nlc3Npb24pKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkNhbid0IGNyZWF0ZSBsaW5lbm9pc2Ugc2Vzc2lvblxuIik7CisgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgbGluZW5vaXNlU2V0Q29tcGxldGlvbkNhbGxiYWNrKHNlc3Npb24tPmxuX3Nlc3Npb24sIF9iY21jbGlfbGluZW5vaXNlX3RhYik7CisgICAgfQorI2VuZGlmCisKKyAgICBzZXNzaW9uLT5tYWdpYyA9IEJDTUNMSV9TRVNTSU9OX01BR0lDOworCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZzZXNzaW9uX2xvY2spOworICAgIHBfbGFzdF9uZXh0ID0gJnNlc3Npb25fbGlzdDsKKyAgICB3aGlsZSgqcF9sYXN0X25leHQpCisgICAgICAgIHBfbGFzdF9uZXh0ID0gJigoKnBfbGFzdF9uZXh0KS0+bmV4dCk7CisgICAgKnBfbGFzdF9uZXh0ID0gc2Vzc2lvbjsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnNlc3Npb25fbG9jaywgZmxhZ3MpOworCisgICAgKnBfc2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21jbGlfc2Vzc2lvbl9zdHJpbmdfd3JpdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBiY21vbHRfc3RyaW5nICpzdHIgPSBiY21jbGlfc2Vzc2lvbl91c2VyX3ByaXYoc2Vzc2lvbik7CisgICAgcmV0dXJuIGJjbW9sdF9zdHJpbmdfY29weShzdHIsIGJ1Ziwgc2l6ZSk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWNsaV9zZXNzaW9uX29wZW5fc3RyaW5nKGJjbWNsaV9zZXNzaW9uICoqc2Vzc2lvbiwgYmNtb2x0X3N0cmluZyAqc3RyKQoreworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc3AgPSB7IC51c2VyX3ByaXYgPSBzdHIsIC53cml0ZSA9IGJjbWNsaV9zZXNzaW9uX3N0cmluZ193cml0ZSB9OworCisgICAgcmV0dXJuIGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcigmc3AsIHNlc3Npb24pOworfQorCisvKiogQ2xvc2UgbWFuYWdlbWVudCBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmc2Vzc2lvbl9sb2NrKTsKKyAgICBpZiAoc2Vzc2lvbj09c2Vzc2lvbl9saXN0KQorICAgICAgICBzZXNzaW9uX2xpc3QgPSBzZXNzaW9uLT5uZXh0OworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uICpwcmV2ID0gc2Vzc2lvbl9saXN0OworICAgICAgICB3aGlsZSAocHJldiAmJiBwcmV2LT5uZXh0ICE9IHNlc3Npb24pCisgICAgICAgICAgICBwcmV2ID0gcHJldi0+bmV4dDsKKyAgICAgICAgaWYgKCFwcmV2KQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnNlc3Npb25fbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogY2FuJ3QgZmluZCBzZXNzaW9uXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByZXYtPm5leHQgPSBzZXNzaW9uLT5uZXh0OworICAgIH0KKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnNlc3Npb25fbG9jaywgZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeSkKKyAgICAgICAgaGlzdG9yeV9lbmQoc2Vzc2lvbi0+aGlzdG9yeSk7CisgICAgaWYgKHNlc3Npb24tPmVsKQorICAgICAgICBlbF9lbmQoc2Vzc2lvbi0+ZWwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGlmIChzZXNzaW9uLT5sbl9zZXNzaW9uKQorICAgICAgICBsaW5lbm9pc2VTZXNzaW9uQ2xvc2Uoc2Vzc2lvbi0+bG5fc2Vzc2lvbik7CisjZW5kaWYKKyAgICBzZXNzaW9uLT5tYWdpYyA9IEJDTUNMSV9TRVNTSU9OX01BR0lDX0RFTDsKKyAgICBiY21vc19mcmVlKHNlc3Npb24pOworCit9CisKKy8qKiBDb25maWd1cmUgUkFXIGlucHV0IG1vZGUKKyAqCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBpc19yYXcgICAgICAgICAgVFJVRT1lbmFibGUgcmF3IG1vZGUsIEZBTFNFPWRpc2FibGUgcmF3IG1vZGUKKyAqIFxyZXR1cm4KKyAqICAgICAgPTAgIC0gT0sgXG4KKyAqICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVEIC0gcmF3IG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9zZXNzaW9uX3Jhd19tb2RlX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb3NfYm9vbCBpc19yYXcpCit7CisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGludCByYzsKKyAgICBpZiAoc2Vzc2lvbi0+cGFybXMuZ2V0cykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICByYyA9IGxpbmVub2lzZVNldFJhdyhzZXNzaW9uLT5sbl9zZXNzaW9uLCBpc19yYXcpOworICAgIHJldHVybiAocmMgPT0gMCkgPyBCQ01fRVJSX09LIDogQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworI2Vsc2UKKyAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCit9CisKKy8qKiBEZWZhdWx0IHdyaXRlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiB3cml0ZSB0byBzdGRvdXQKKyAqLworc3RhdGljIGludCBfYmNtY2xpX3Nlc3Npb25fd3JpdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gYmNtb3NfcHJpbnRmKCIlLipzIiwgc2l6ZSwgYnVmKTsKK30KKworCisvKiogV3JpdGUgZnVuY3Rpb24uCisgKiBXcml0ZSBidWZmZXIgdG8gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgICAgICBvdXRwdXQgYnVmZmVyCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuCisgKiBccmV0dXJuCisgKiAgPj0wIC0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cbgorICogIDwwICAtIG91dHB1dCBlcnJvcgorICovCitpbnQgYmNtY2xpX3Nlc3Npb25fd3JpdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgKCp3cml0ZV9jYikoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSk7CisgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi0+cGFybXMud3JpdGUpCisgICAgeworICAgICAgICBCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgICAgICB3cml0ZV9jYiA9IHNlc3Npb24tPnBhcm1zLndyaXRlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHdyaXRlX2NiID0gX2JjbWNsaV9zZXNzaW9uX3dyaXRlOworICAgIHJldHVybiB3cml0ZV9jYihzZXNzaW9uLCBidWYsIHNpemUpOworfQorCisKKy8qKiBSZWFkIGxpbmUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBkZWZhdWx0CisgKiBccGFyYW1baW4sb3V0XSAgIGJ1ZiAgICAgICAgICAgICBpbnB1dCBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgc2l6ZSAgICAgICAgICAgIGJ1ZiBzaXplCisgKiBccmV0dXJuCisgKiAgICAgIGJ1ZiBpZiBzdWNjZXNzZnVsCisgKiAgICAgIE5VTEwgaWYgRU9GIG9yIGVycm9yCisgKi8KK2NoYXIgKmJjbWNsaV9zZXNzaW9uX2dldHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gX2JjbWNsaV9zZXNzaW9uX2dldHMoc2Vzc2lvbiwgYnVmLCBzaXplKTsKK30KKworCisvKiogUHJpbnQgZnVuY3Rpb24uCisgKiBQcmludHMgaW4gdGhlIGNvbnRleHQgb2YgY3VycmVudCBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgZm9ybWF0ICAgICAgICAgIHByaW50IGZvcm1hdCAtIGFzIGluIHByaW50ZgorICogXHBhcmFtW2luXSAgIGFwICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGxpc3QuIFVuZGVmaW5lZCBhZnRlciB0aGUgY2FsbAorICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX3ZwcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24tPnBhcm1zLndyaXRlKQorICAgIHsKKyAgICAgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICAgICAgdnNucHJpbnRmKHNlc3Npb24tPm91dGJ1Ziwgc2l6ZW9mKHNlc3Npb24tPm91dGJ1ZiksIGZvcm1hdCwgYXApOworICAgICAgICBiY21jbGlfc2Vzc2lvbl93cml0ZShzZXNzaW9uLCBzZXNzaW9uLT5vdXRidWYsIHN0cmxlbihzZXNzaW9uLT5vdXRidWYpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBiY21vc192cHJpbnRmKGZvcm1hdCwgYXApOworfQorCisKKy8qKiBQcmludCBmdW5jdGlvbi4KKyAqIFByaW50cyBpbiB0aGUgY29udGV4dCBvZiBjdXJyZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRvdXQKKyAqIFxwYXJhbVtpbl0gICBmb3JtYXQgICAgICAgICAgcHJpbnQgZm9ybWF0IC0gYXMgaW4gcHJpbnRmCisgKi8KK3ZvaWQgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgYmNtY2xpX3Nlc3Npb25fdnByaW50KHNlc3Npb24sIGZvcm1hdCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKKy8qKiBHZXQgdXNlcl9wcml2IHByb3ZvZGVkIGluIHNlc3Npb24gcGFydGFtZXRlcnMgd2hlbiBpdCB3YXMgcmVnaXN0ZXJlZAorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZGluCisgKiBccmV0dXJuIHVzcl9wcml2IHZhbHVlCisgKi8KK3ZvaWQgKmJjbWNsaV9zZXNzaW9uX3VzZXJfcHJpdihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBpZiAoIXNlc3Npb24pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJVR19PTihzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgcmV0dXJuIHNlc3Npb24tPnBhcm1zLnVzZXJfcHJpdjsKK30KKworCisvKiogR2V0IGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD1kZWZhdWx0IHNlc3Npb24KKyAqIFxyZXR1cm4gZXh0cmFfZGF0YSBwb2ludGVyIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gZXh0cmEgZGF0YQorICovCit2b2lkICpiY21jbGlfc2Vzc2lvbl9kYXRhKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICBpZiAoc2Vzc2lvbi0+cGFybXMuZXh0cmFfc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKGNoYXIgKilzZXNzaW9uICsgc2l6ZW9mKCpzZXNzaW9uKTsKK30KKworCisvKiogR2V0IHNlc3Npb24gbmFtZWRhdGEKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPWRlZmF1bHQgc2Vzc2lvbgorICogXHJldHVybiBzZXNzaW9uIG5hbWUKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX3Nlc3Npb25fbmFtZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBpZiAoIXNlc3Npb24pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJVR19PTihzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgcmV0dXJuIHNlc3Npb24tPnBhcm1zLm5hbWU7Cit9CisKKworLyoqIEdldCBzZXNzaW9uIGFjY2VzcyByaWdodGUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPWRlZmF1bHQgZGVidWcgc2Vzc2lvbgorICogXHJldHVybiBzZXNzaW9uIGFjY2VzcyByaWdodAorICovCitiY21jbGlfYWNjZXNzX3JpZ2h0IGJjbWNsaV9zZXNzaW9uX2FjY2Vzc19yaWdodChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBpZiAoIXNlc3Npb24pCisgICAgICAgIHJldHVybiBCQ01DTElfQUNDRVNTX0RFQlVHOworICAgIEJVR19PTihzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgcmV0dXJuIHNlc3Npb24tPnBhcm1zLmFjY2Vzc19yaWdodDsKK30KKworLyoqIFByaW50IGJ1ZmZlciBpbiBoZXhhZGVjaW1hbCBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgICAgICBCdWZmZXIgYWRkcmVzcworICogXHBhcmFtW2luXSAgIG9mZnNldCAgICAgICAgICBTdGFydCBvZmZzZXQgaW4gdGhlIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIGNvdW50ICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gZHVtcAorICogXHBhcmFtW2luXSAgIGluZGVudCAgICAgICAgICBPcHRpb25hbCBpbmRlbnRhdGlvbiBzdHJpbmcKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9oZXhkdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCB2b2lkICpidWZmZXIsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgY291bnQsIGNvbnN0IGNoYXIgKmluZGVudCkKK3sKKyAgICBiY21vc19oZXhkdW1wKChiY21vc19tc2dfcHJpbnRfY2IpYmNtY2xpX3Nlc3Npb25fcHJpbnQsIHNlc3Npb24sIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCwgaW5kZW50KTsKK30KKworLyoKKyAqIEV4cG9ydHMKKyAqLworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9vcGVuKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fY2xvc2UpOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX3ZwcmludCk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX3ByaW50KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fYWNjZXNzX3JpZ2h0KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fZGF0YSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX25hbWUpOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9oZXhkdW1wKTsKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3Nlc3Npb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3Nlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQ4NzNkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2Vzc2lvbi5oCkBAIC0wLDAgKzEsMzA5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBiY21jbGlfc2Vzc2lvbi5oCisgKgorICogQkNNIENMSSBlbmdpbmUgLSBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQ01DTElfU0VTU0lPTl9ICisKKyNkZWZpbmUgQkNNQ0xJX1NFU1NJT05fSAorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiYmNtb2x0X3N0cmluZy5oIgorCisvKiogXGRlZmdyb3VwIGJjbWNsaV9zZXNzaW9uIE1hbmFnZW1lbnQgU2Vzc2lvbiBDb250cm9sCisgKgorICogQVBJcyBpbiB0aGlzIGhlYWRlciBmaWxlIGFsbG93IHRvIGNyZWF0ZS9kZXN0cm95IG1hbmFnZW1lbnQgc2Vzc2lvbnMuCisgKiBNYW5hZ2VtZW50IHNlc3Npb24gaXMgY2hhcmFjdGVyaXplZCBieSBpdHMgYWNjZXNzIGxldmVsIGFuZCBhbHNvCisgKiBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zLgorICogTWFuYWdlbWVudCBzZXNzaW9ucyBhbGxvdyBtYW5hZ2VkIGVudGl0aWVzIGluIHRoZSBzeXN0ZW0gdG8gY29tbXVuaWNhdGUKKyAqIHdpdGggbG9jYWwgb3IgcmVtb3RlIG1hbmFnZXJzIChlLmcuLCBsb2NhbCBvciByZW1vdGUgc2hlbGwgb3IgTk1TKQorICogQHsKKyAqLworCisvKiogQWNjZXNzIHJpZ2h0cyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgICAgIC8qKjwgR3Vlc3QuIERvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gY29tbWFuZHMgYW5kIGRpcmVjdG9yaWVzIHJlZ2lzdGVyZWQgd2l0aCBBRE1JTiByaWdodHMgKi8KKyAgICBCQ01DTElfQUNDRVNTX0FETUlOLCAgICAgLyoqPCBBZG1pbmlzdHJhdG9yOiBmdWxsIGFjY2VzcyAqLworICAgIEJDTUNMSV9BQ0NFU1NfREVCVUcsICAgICAvKio8IEFkbWluaXN0cmF0b3I6IGZ1bGwgYWNjZXNzICsgZXh0ZW5kZWQgZGVidWcgZmVhdHVyZXMgKi8KK30gYmNtY2xpX2FjY2Vzc19yaWdodDsKKworLyoqIExpbmUgZWRpdCBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01DTElfTElORV9FRElUX0RFRkFVTFQsLyoqPCBFbmFibGUgbGluZSBlZGl0aW5nIGFuZCBoaXN0b3J5IGlmIENPTkZJR19FRElUTElORSBpcyBkZWZpbmVkLCBkaXNhYmxlIG90aGVyd2lzZSAqLworICAgIEJDTUNMSV9MSU5FX0VESVRfRU5BQkxFLCAvKio8IEVuYWJsZSBsaW5lIGVkaXRpbmcuIFJlcXVpcmVzIENPTkZJR19FRElUTElORSBkZWZpbmUgYW5kIGxpYmVkaXQtZGV2IGxpYnJhcnkgKi8KKyAgICBCQ01DTElfTElORV9FRElUX0RJU0FCTEUsLyoqPCBEaXNhYmxlIGxpbmUgZWRpdGluZyBhbmQgaGlzdG9yeSAqLworfSBiY21jbGlfbGluZV9lZGl0X21vZGU7CisKKworLyoqIE1hbmFnZW1lbnQgc2Vzc2lvbiBoYW5kbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX3Nlc3Npb24gYmNtY2xpX3Nlc3Npb247CisKKworLyoqIFNlc3Npb24gcGFyYW1ldGVycyBzdHJ1Y3R1cmUuCisgKiBTZWUgXHJlZiBiY21jbGlfc2Vzc2lvbl9vcGVuCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0KK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAvKio8IFNlc3Npb24gbmFtZSAqLworICAgIHZvaWQgKnVzZXJfcHJpdjsgICAgICAgIC8qKjwgUHJpdmF0ZSB1c2VyJ3MgZGF0YSAqLworCisgICAgLyoqIFNlc3Npb24ncyBvdXRwdXQgZnVuY3Rpb24uIE5VTEw9dXNlIHdyaXRlKHN0ZG91dCkKKyAgICAgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciA8MCBpZiBlcnJvcgorICAgICAqLworICAgIGludCAoKndyaXRlKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKTsKKworICAgIC8qKiBTZXNzaW9uIGxpbmUgaW5wdXQgZnVuY3Rpb24uIE5VTEw9dXNlIGRlZmF1bHQoc3RkaW5bK2xpbmUgZWRpdCkgKi8KKyAgICBjaGFyICooKmdldHMpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpOworCisgICAgLyoqIFNlc3Npb24gY2hhciBpbnB1dCBmdW5jdGlvbi4gTlVMTD11c2UgYmNtb3NfZ2V0Y2hhcigpICovCisgICAgaW50ICgqZ2V0X2NoYXIpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworICAgIC8qKiBGaWxsIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHdpdGggdGhlIHByb21wdCBmb3IgdGhpcyBzZXNzaW9uIChOVUxMLXRlcm1pbmF0ZWQpLiBOVUxMID0gbm8gcHJvbXB0LiAqLworICAgIHZvaWQgKCpnZXRfcHJvbXB0KShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCB1aW50MzJfdCBtYXhfbGVuKTsKKworICAgIC8qKiBBY2Nlc3MgcmlnaHRzICovCisgICAgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3NfcmlnaHQ7CisKKyAgICAvKiogTGluZSBlZGl0aW5nIG1vZGUgKi8KKyAgICBiY21jbGlfbGluZV9lZGl0X21vZGUgbGluZV9lZGl0X21vZGU7CisKKyAgICAvKiogRXh0cmEgZGF0YSBzaXplIHRvIGJlIGFsbG9jYXRlZCBhbG9uZyB3aXRoIHNlc3Npb24gY29udHJvbCBibG9jay4KKyAgICAgKiBUaGUgZXh0cmEgZGF0YSBpcyBhY2Nlc3NpYmxlIHVzaW5nIGJjbWNsaV9zZXNzaW9uX2RhdGEoKS4KKyAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IGlmIHNlc3Npb24gaXMgY3JlYXRlZCB1c2luZyBiY21jbGlfc2Vzc2lvbl9vcGVuKCksCisgICAgICogZXh0cmFfc2l6ZSBpcyByZXNlcnZlZC4KKyAgICAgKiBJdCBjYW4gb25seSBiZSB1c2VkIGZvciB1c2VyIGNvbnRleHQgYWxsb2NhdGlvbiBpZiBzZXNzaW9uIGlzIGNyZWF0ZWQKKyAgICAgKiB1c2luZyBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoKQorICAgICAqLworICAgIHVpbnQzMl90IGV4dHJhX3NpemU7Cit9IGJjbWNsaV9zZXNzaW9uX3Bhcm07CisKKworLyoqIE9wZW4gbW9uaXRvciBzZXNzaW9uCisgKgorICogTW9uaXRvciBzdXBwb3J0cyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgc2Vzc2lvbnMgd2l0aCBkaWZmZXJlbnQKKyAqIGFjY2VzcyByaWdodHMuCisgKiBOb3RlIHRoYXQgdGhlcmUgYWxyZWFkeSBpcyBhIGRlZmF1bHQgc2Vzc2lvbiB3aXRoIGZ1bGwgYWRtaW5pc3RyYXRpdmUgcmlnaHRzLAorICogdGhhdCB0YWtlcyBpbnB1dCBmcm9tIHN0ZGluIGFuZCBvdXRwdXRzIHRvIHN0ZG91dC4KKyAqCisgKiBQbGVhc2UgZG9uJ3QgdXNlIHBhcm0uZXh0cmFfc2l6ZS4gVGhpcyBmaWVsZCBpcyByZXNlcnZlZC4KKyAqCisgKiBccGFyYW1baW5dICAgcGFybSAgICAgICAgU2Vzc2lvbiBwYXJhbWV0ZXJzLiBNdXN0IG5vdCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorICogXHBhcmFtW291dF0gIHBfc2Vzc2lvbiAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJuCisgKiAgICAgIDAgICA9T0tcbgorICogICAgICA8MCAgPWVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX3Nlc3Npb25fb3Blbihjb25zdCBiY21jbGlfc2Vzc2lvbl9wYXJtICpwYXJtLCBiY21jbGlfc2Vzc2lvbiAqKnBfc2Vzc2lvbik7CisKKworLyoqIENsb3NlIG1vbml0b3Igc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9jbG9zZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiApOworCisKKy8qKiBXcml0ZSBmdW5jdGlvbi4KKyAqIFdyaXRlIGJ1ZmZlciB0byB0aGUgY3VycmVudCBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgYnVmICAgICAgICAgICAgIG91dHB1dCBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAqIFxyZXR1cm4KKyAqICA+PTAgLSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlblxuCisgKiAgPDAgIC0gb3V0cHV0IGVycm9yCisgKi8KK2ludCBiY21jbGlfc2Vzc2lvbl93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKTsKKworCisvKiogUmVhZCBsaW5lCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2UgZGVmYXVsdAorICogXHBhcmFtW2luLG91dF0gICBidWYgICAgICAgICAgICAgaW5wdXQgYnVmZmVyCisgKiBccGFyYW1baW5dICAgICAgIHNpemUgICAgICAgICAgICBidWYgc2l6ZQorICogXHJldHVybgorICogICAgICBidWYgaWYgc3VjY2Vzc2Z1bAorICogICAgICBOVUxMIGlmIEVPRiBvciBlcnJvcgorICovCitjaGFyICpiY21jbGlfc2Vzc2lvbl9nZXRzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpOworCisKKy8qKiBQcmludCBmdW5jdGlvbi4KKyAqIFByaW50cyBpbiB0aGUgY29udGV4dCBvZiBjdXJyZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRvdXQKKyAqIFxwYXJhbVtpbl0gICBmb3JtYXQgICAgICAgICAgcHJpbnQgZm9ybWF0IC0gYXMgaW4gcHJpbnRmCisgKi8KK3ZvaWQgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2lmbmRlZiBCQ01DTElfU0VTU0lPTl9ESVNBQkxFX0ZPUk1BVF9DSEVDSworX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorI2VuZGlmCis7CisKKworLyoqIFByaW50IGZ1bmN0aW9uLgorICogUHJpbnRzIGluIHRoZSBjb250ZXh0IG9mIGN1cnJlbnQgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgICAgICAgICBwcmludCBmb3JtYXQgLSBhcyBpbiBwcmludGYKKyAqIFxwYXJhbVtpbl0gICBhcCAgICAgICAgICAgICAgcGFyYW1ldGVycyBsaXN0LiBVbmRlZmluZWQgYWZ0ZXIgdGhlIGNhbGwKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl92cHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisKKy8qKiBQcmludCBidWZmZXIgaW4gaGV4YWRlY2ltYWwgZm9ybWF0CisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRvdXQKKyAqIFxwYXJhbVtpbl0gICBidWZmZXIgICAgICAgICAgQnVmZmVyIGFkZHJlc3MKKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgICAgICAgICAgU3RhcnQgb2Zmc2V0IGluIHRoZSBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBjb3VudCAgICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGR1bXAKKyAqIFxwYXJhbVtpbl0gICBpbmRlbnQgICAgICAgICAgT3B0aW9uYWwgaW5kZW50YXRpb24gc3RyaW5nCisgKi8KK3ZvaWQgYmNtY2xpX3Nlc3Npb25faGV4ZHVtcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICppbmRlbnQpOworCisvKiogR2V0IGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD1kZWZhdWx0IHNlc3Npb24KKyAqIFxyZXR1cm4gZXh0cmFfZGF0YSBwb2ludGVyIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gZXh0cmEgZGF0YQorICovCit2b2lkICpiY21jbGlfc2Vzc2lvbl9kYXRhKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworCisvKiogR2V0IHVzZXJfcHJpdiBwcm92aWRlZCBpbiBzZXNzaW9uIHBhcmFtZXRlcnMgd2hlbiBpdCB3YXMgcmVnaXN0ZXJlZAorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9ZGVmYXVsdCBzZXNzaW9uCisgKiBccmV0dXJuIHVzcl9wcml2IHZhbHVlCisgKi8KK3ZvaWQgKmJjbWNsaV9zZXNzaW9uX3VzZXJfcHJpdihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKworLyoqIEdldCBzZXNzaW9uIG5hbWUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRpbgorICogXHJldHVybiBzZXNzaW9uIG5hbWUKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX3Nlc3Npb25fbmFtZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKworLyoqIEdldCBzZXNzaW9uIGFjY2VzcyByaWdodHMKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPWRlZmF1bHQgZGVidWcgc2Vzc2lvbgorICogXHJldHVybiBzZXNzaW9uIGFjY2VzcyByaWdodAorICovCitiY21jbGlfYWNjZXNzX3JpZ2h0IGJjbWNsaV9zZXNzaW9uX2FjY2Vzc19yaWdodChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKy8qKiBAfSBlbmQgb2YgYmNtY2xpX3Nlc3Npb24gZ3JvdXAgKi8KKworLyoqIExvdy1sZXZlbCBpbnRlcmZhY2UgZm9yIHdoZW4gc2Vzc2lvbiBpcyB1c2VkIG91dHNpZGUgQ0xJCisgKgorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgIFNlc3Npb24gcGFyYW1ldGVycy4gTXVzdCBub3QgYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAqIFxwYXJhbVtvdXRdICBwX3Nlc3Npb24gICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybgorICogICAgICAwICAgPU9LXG4KKyAqICAgICAgPDAgID1lcnJvciBjb2RlCisgKi8KK2ludCBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoY29uc3QgYmNtY2xpX3Nlc3Npb25fcGFybSAqcGFybSwgYmNtY2xpX3Nlc3Npb24gKipwX3Nlc3Npb24pOworCisvKiogT3BlbiBhIHNlc3Npb24gdGhhdCBwcmludHMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX3Nlc3Npb25fb3Blbl9zdHJpbmcoYmNtY2xpX3Nlc3Npb24gKipzZXNzaW9uLCBiY21vbHRfc3RyaW5nICpzdHIpOworCisvKiogQ29uZmlndXJlIFJBVyBpbnB1dCBtb2RlCisgKgorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgaXNfcmF3ICAgICAgICAgIFRSVUU9ZW5hYmxlIHJhdyBtb2RlLCBGQUxTRT1kaXNhYmxlIHJhdyBtb2RlCisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LIFxuCisgKiAgICAgIEJDTV9FUlJfTk9UX1NVUFBPUlRFRCAtIHJhdyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWRcbgorICovCitiY21vc19lcnJubyBiY21jbGlfc2Vzc2lvbl9yYXdfbW9kZV9zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9zX2Jvb2wgaXNfcmF3KTsKKworLyoqIENvbnRleHQgZXh0ZW5zaW9uCisgKgorICogLSBpZiBubyBjb21tYW5kIC0gZGlzcGxheSBsaXN0IG9mIGNvbW1hbmQgb3IgZXh0ZW5kIGNvbW1hbmQKKyAqIC0gaWYgcHJldiBjaGFyIGlzICIgIgorICogICAgICAtIGlmIHBvc2l0aW9uYWwgYW5kIG5leHQgcGFybSBpcyBlbnVtIC0gc2hvdy9leHRlbmRzIGxpc3Qgb2YgbWF0Y2hpbmcgdmFsdWVzCisgKiAgICAgIC0gZWxzZSAtIHNob3cvZXh0ZW5kIGxpc3Qgb2YgdW51c2VkIHBhcmFtZXRlcnMKKyAqICAgZWxzZQorICogICAgICAtIGlmIGVudGVyaW5nIHZhbHVlIGFuZCBlbnVtIC0gc2hvdy9leHRlbmRzIGxpc3Qgb2YgbWF0Y2hpbmcgdmFsdWVzCisgKiAgICAgIC0gZWxzZSAtIHNob3cvZXh0ZW5kIGxpc3Qgb2YgbWF0Y2hpbmcgdW51c2VkIHBhcmFtZXRlcnMKKyAqCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBpbnB1dF9zdHJpbmcgICAgU3RyaW5nIHRvIGJlIHBhcnNlZAorICogXHBhcmFtW291dF0gICAgICBpbnNlcnRfc3RyICAgICAgU3RyaW5nIHRvIGluc2VydCBhdCBjdXJzb3IgcG9zaXRpb24KKyAqIFxwYXJhbVtpbl0gICAgICAgaW5zZXJ0X3NpemUgICAgIEluc2VydCBidWZmZXIgc2l6ZQorICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICogICAgICBCQ01fRVJSX1BBUk0gLSBwYXJzaW5nIGVycm9yXG4KKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX2V4dGVuZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqaW5wdXRfc3RyaW5nLAorICAgIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKTsKKworCisjaWZkZWYgQkNNQ0xJX0lOVEVSTkFMCisKKyNkZWZpbmUgQkNNQ0xJX1NFU1NJT05fT1VUQlVGX0xFTiAyMDQ4CisjZGVmaW5lIEJDTUNMSV9NQVhfUFJPTVBUX0xFTiA4CisKKy8qIGVkaXRsaW5lIGZ1bmN0aW9uYWxpdHkgKi8KKy8qIElmIGxpYmVkaXQgaXMgaW5jbHVkZWQgLSBpdCB0YWtlcyBwcmVjZWRlbmNlICovCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKyNpbmNsdWRlIDxoaXN0ZWRpdC5oPgorI3VuZGVmIENPTkZJR19MSU5FTk9JU0UKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0xJQkVESVQgKi8KKworI2lmZGVmIENPTkZJR19MSU5FTk9JU0UKKyNpbmNsdWRlIDxsaW5lbm9pc2UuaD4KKyNlbmRpZgorCisvKiBNYW5hZ2VtZW50IHNlc3Npb24gc3RydWN0dXJlICovCitzdHJ1Y3QgYmNtY2xpX3Nlc3Npb24KK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqbmV4dDsKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHBhcm1zOworICAgIHVpbnQzMl90IG1hZ2ljOworI2RlZmluZSBCQ01DTElfU0VTU0lPTl9NQUdJQyAgICAgICAgICAgICgoJ3MnPDwyNCl8KCdlJzw8MTYpfCgncyc8PDgpfCdzJykKKyNkZWZpbmUgQkNNQ0xJX1NFU1NJT05fTUFHSUNfREVMICAgICAgICAoKCdzJzw8MjQpfCgnZSc8PDE2KXwoJ3MnPDw4KXwnficpCisKKyAgICAvKiBMaW5lIGVkaXRpbmcgYW5kIGhpc3Rvcnkgc3VwcG9ydCAqLworI2lmZGVmIENPTkZJR19MSUJFRElUCisgICAgRWRpdExpbmUgKmVsOworICAgIEhpc3RvcnkgKmhpc3Rvcnk7CisgICAgSGlzdEV2ZW50IGhpc3RldmVudDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19MSU5FTk9JU0UKKyAgICBsaW5lbm9pc2VTZXNzaW9uICpsbl9zZXNzaW9uOworI2VuZGlmCisgICAgY2hhciBvdXRidWZbQkNNQ0xJX1NFU1NJT05fT1VUQlVGX0xFTl07CisgICAgY2hhciBwcm9tcHRfYnVmW0JDTUNMSV9NQVhfUFJPTVBUX0xFTl07CisKKyAgICAvKiBGb2xsb3dlZCBieSBzZXNzaW9uIGRhdGEgKi8KK307CisjZW5kaWYKKworI2VuZGlmIC8qICNpZm5kZWYgQkNNQ0xJX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jb21tb25fZXBvbl9vYW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2MTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jb21tb25fZXBvbl9vYW0vTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjIENvbW1vbiBBUEkKKyMKK01PRF9OQU1FID0gY29tbW9uX2Vwb25fb2FtCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB1dGlscyBkZXZfbG9nCisKK3NyY3MgPSBiY21vbHRfZXBvbl9vYW1fdHlwZXMuYwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9iY21vbHRfZXBvbl9vYW1fdHlwZXMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jb21tb25fZXBvbl9vYW0vYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhZDIyZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jb21tb25fZXBvbl9vYW0vYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmMKQEAgLTAsMCArMSw4MjYzNSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKworMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmgiCisKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KGJ1Ziwgc2l6ZSwgc3RhcnQpICBiY21vbHRfYnVmX2luaXQoYnVmLCBzaXplLCBzdGFydCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9za2lwCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9nZXRfdXNlZAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZSAgICAgIGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl93cml0ZQorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4ICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MTYKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UyNAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MjQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UzMgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MzIKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9zMzIgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3MzMgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfczMyICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF9zMzIKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U2NAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91NjQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX2Jvb2wKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2wgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfYm9vbAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzICAgICAgICBiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MgICAgICBiY21vbHRfYnVmX3dyaXRlX2lwdjRfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzICAgICAgIGJjbW9sdF9idWZfcmVhZF9pcHY0X2FkZHJlc3MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY2X2FkZHJlc3MgICAgICBiY21vbHRfYnVmX3dyaXRlX2lwdjZfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzICAgICAgIGJjbW9sdF9idWZfcmVhZF9pcHY2X2FkZHJlc3MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3ZsYW5fdGFnCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3ZsYW5fdGFnCisKK3N0YXRpYyB1aW50MjRfdCB1aW50MzJfdF90b191aW50MjRfdCh1aW50MzJfdCB1MzIpCit7CisgICAgdWludDI0X3QgdTI0OworCisgICAgdTI0LnU4WzBdID0gKHUzMiA+PiAxNikgJiAweGZmOworICAgIHUyNC51OFsxXSA9ICh1MzIgPj4gOCkgJiAweGZmOworICAgIHUyNC51OFsyXSA9ICh1MzIgPj4gMCkgJiAweGZmOworCisgICAgcmV0dXJuIHUyNDsKK30KKworc3RhdGljIHVpbnQzMl90IHVpbnQyNF90X3RvX3VpbnQzMl90KHVpbnQyNF90IHUyNCkKK3sKKyAgICB1aW50MzJfdCB1MzIgPSAwOworCisgICAgdTMyIHw9IHUyNC51OFswXSA8PCAxNjsKKyAgICB1MzIgfD0gdTI0LnU4WzFdIDw8IDg7CisgICAgdTMyIHw9IHUyNC51OFsyXSA8PCAwOworCisgICAgcmV0dXJuIHUzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leF9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2sgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlc19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X2V4Y2xfYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdWludDMyX3RfdG9fdWludDI0X3QoKHVpbnQzMl90KSB0aGlzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDI0X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSB1aW50MjRfdF90b191aW50MzJfdChudW1fdmFsKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2tfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjayB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjayAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3BhY2soYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c19wYWNrKGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc19wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2hfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ19wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9uc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uc19wYWNrKGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3Zlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXRfcGFjayhiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG1fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmN2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5jdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c3dpdGNoaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5saW5rX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnN3aXRjaGluZ19kb21haW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGlua19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cHJvZ3JhbW1hYmxlX2ZpZWxkMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnByb2dyYW1tYWJsZV9maWVsZDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cHJvZ3JhbW1hYmxlX2ZpZWxkMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByb2dyYW1tYWJsZV9maWVsZDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF9wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnN3aXRjaGluZ19kb21haW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zc21fc291cmNlX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+aXBhZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnN3aXRjaGluZ19kb21haW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zc21fc291cmNlX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+aXBhZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnN2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5jdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmN2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3BhY2sodGhpcy0+b3B0aW9uX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3VucGFjaygmdGhpcy0+b3B0aW9uX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnJlc3VsdF9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV91bnBhY2soJnRoaXMtPnJlc3VsdF9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnN2Y19mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2xhc3NpZmllcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZGlyZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zdGF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcHRvc19sb3cpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwdG9zX2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwdG9zX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pcHByb3RvKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcGFkZHJfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXBzcmNfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBzcmNfYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBzcmNfYWRkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcHNyY19hZGRyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aXBzcmNfYWRkciwgdGhpcy0+aXBzcmNfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwc3JjX21hc2sgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBzcmNfbWFza1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmlwc3JjX21hc2ssIHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcGRzdF9hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwZHN0X2FkZHJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pcGRzdF9hZGRyLCB0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXBkc3RfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBkc3RfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBkc3RfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcGRzdF9tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aXBkc3RfbWFzaywgdGhpcy0+aXBkc3RfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zcmNfcG9ydF9zdGFydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNyY19wb3J0X2VuZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmRzdF9wb3J0X3N0YXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZHN0X3BvcnRfZW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5kc3RfbWFjX2FkZHIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmRzdF9tYWNfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+c3JjX21hY19hZGRyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sMnByb3RvX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sMnByb3RvX3ZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dXNlcl9wcmlvcml0eV9sb3cpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51c2VyX3ByaW9yaXR5X2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT52bGFuX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+Yml0bWFwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Zmxvd19sYWJlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNtaW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5wa3RfbWF0Y2hlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSAqdGhpcykKK3sKKyAgICByZXR1cm4gOTYgKyB0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCArIHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoICsgdGhpcy0+aXBkc3RfYWRkcl9sZW5ndGggKyB0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnN2Y19mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2xhc3NpZmllcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZGlyZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zdGF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcHRvc19sb3cpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwdG9zX2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwdG9zX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pcHByb3RvKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcGFkZHJfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXBzcmNfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBzcmNfYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBzcmNfYWRkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwc3JjX2FkZHJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pcHNyY19hZGRyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmlwc3JjX2FkZHJfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aXBzcmNfYWRkciwgdGhpcy0+aXBzcmNfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwc3JjX21hc2sgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcHNyY19tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+aXBzcmNfbWFzayA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pcHNyY19tYXNrX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmlwc3JjX21hc2ssIHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcGRzdF9hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBkc3RfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmlwZHN0X2FkZHIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+aXBkc3RfYWRkcl9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5pcGRzdF9hZGRyLCB0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXBkc3RfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBkc3RfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBkc3RfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwZHN0X21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pcGRzdF9tYXNrID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmlwZHN0X21hc2tfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aXBkc3RfbWFzaywgdGhpcy0+aXBkc3RfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zcmNfcG9ydF9zdGFydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNyY19wb3J0X2VuZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRzdF9wb3J0X3N0YXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZHN0X3BvcnRfZW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5kc3RfbWFjX2FkZHIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRzdF9tYWNfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+c3JjX21hY19hZGRyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sMnByb3RvX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sMnByb3RvX3ZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dXNlcl9wcmlvcml0eV9sb3cpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51c2VyX3ByaW9yaXR5X2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT52bGFuX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmdGhpcy0+Yml0bWFwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Zmxvd19sYWJlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNtaW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5wa3RfbWF0Y2hlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaXBzcmNfYWRkcl9sZW5ndGg7CisgICAgdWludDhfdCBpcHNyY19tYXNrX2xlbmd0aDsKKyAgICB1aW50OF90IGlwZHN0X2FkZHJfbGVuZ3RoOworICAgIHVpbnQ4X3QgaXBkc3RfbWFza19sZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGlwc3JjX2FkZHJfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGlwc3JjX2FkZHJfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmaXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBpcHNyY19tYXNrX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpcHNyY19tYXNrX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaXBkc3RfYWRkcl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaXBkc3RfYWRkcl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGlwZHN0X21hc2tfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGlwZHN0X21hc2tfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmludGZfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmludGZfZGVzY3JpcHRpb24gPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9kZXNjcmlwdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uLCB0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3BhY2sodGhpcy0+aW50Zl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmludGZfcGh5X2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9waHlfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pbnRmX3BoeV9hZGRyLCB0aGlzLT5pbnRmX3BoeV9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW50Zl9hbGlhc19uYW1lX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmludGZfYWxpYXNfbmFtZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX2FsaWFzX25hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aW50Zl9hbGlhc19uYW1lLCB0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKnRoaXMpCit7CisgICAgcmV0dXJuIDYgKyB0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCArIHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoICsgdGhpcy0+aW50Zl9hbGlhc19uYW1lX2xlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50Zl9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9kZXNjcmlwdGlvbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfZGVzY3JpcHRpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+aW50Zl9kZXNjcmlwdGlvbiA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmludGZfZGVzY3JpcHRpb24sIHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGVfdW5wYWNrKCZ0aGlzLT5pbnRmX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9waHlfYWRkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfcGh5X2FkZHJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+aW50Zl9waHlfYWRkciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pbnRmX3BoeV9hZGRyX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmludGZfcGh5X2FkZHIsIHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9hbGlhc19uYW1lID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9hbGlhc19uYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmludGZfYWxpYXNfbmFtZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aW50Zl9hbGlhc19uYW1lLCB0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaW50Zl9kZXNjcmlwdGlvbl9sZW5ndGg7CisgICAgdWludDhfdCBpbnRmX3BoeV9hZGRyX2xlbmd0aDsKKyAgICB1aW50OF90IGludGZfYWxpYXNfbmFtZV9sZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGludGZfZGVzY3JpcHRpb25fbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGludGZfZGVzY3JpcHRpb25fbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRmX3BoeV9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGludGZfcGh5X2FkZHJfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGludGZfcGh5X2FkZHJfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmaW50Zl9hbGlhc19uYW1lX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGludGZfYWxpYXNfbmFtZV9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50Zl9hbGlhc19uYW1lX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pZl9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmlmX210dSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlmX3NwZWVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzX3BhY2sodGhpcy0+aWZfYWRtaW5fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfcGFjayh0aGlzLT5pZl9vcGVyX3N0YXR1cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfbGFzdF9jaGFuZ2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5pZl9oY2luX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjaW5fdWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjaW5fbXVsdGljYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5pZl9oY2luX2Jyb2FkY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfaW5fZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9pbl9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9pbl91bmtub3duX3Byb3RvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjb3V0X29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjb3V0X3VjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5pZl9oY291dF9tdWx0aWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjb3V0X2Jyb2FkY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfb3V0X2Rpc2NhcmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfb3V0X2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aWZfbGlua191cF9kb3duX3RyYXBfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZl9wcm9taXNjdW91c19tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZl9jb25uZWN0b3JfcHJlc2VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlmX2NvdW50ZXJfZGlzY29udGludWl0eV90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pZl9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlmX210dSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlmX3NwZWVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzX3VucGFjaygmdGhpcy0+aWZfYWRtaW5fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5pZl9vcGVyX3N0YXR1cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfbGFzdF9jaGFuZ2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5pZl9oY2luX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjaW5fdWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjaW5fbXVsdGljYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5pZl9oY2luX2Jyb2FkY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfaW5fZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9pbl9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9pbl91bmtub3duX3Byb3RvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjb3V0X29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjb3V0X3VjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5pZl9oY291dF9tdWx0aWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjb3V0X2Jyb2FkY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfb3V0X2Rpc2NhcmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfb3V0X2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aWZfbGlua191cF9kb3duX3RyYXBfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZl9wcm9taXNjdW91c19tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZl9jb25uZWN0b3JfcHJlc2VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlmX2NvdW50ZXJfZGlzY29udGludWl0eV90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEwNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zdmNfZmxvd19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZGlyZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5mbG93X3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnFvc190eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2hhbm5lbF9zZXRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT5kc2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYXhfcmVxdWVzdHNfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4X2J5dGVzX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRvdGFsX2J5dGVzX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1heF90aW1lX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGggPiAwKSAmJiAodGhpcy0+c2VydmljZV9jbGFzcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlX2NsYXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnNlcnZpY2VfY2xhc3MsIHRoaXMtPnNlcnZpY2VfY2xhc3NfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmlvcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVzZXFfZHNpZF9zdXBwb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4X3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5taW5fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1pbl9wa3Rfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmFjdGl2ZV90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YWRtaXR0ZWRfdGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1heF9jb25jYXRfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnNjaGVkdWxpbmdfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm5vbV9wb2xsX2ludHZsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dG9sX3BvbGxfaml0dGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dW5zb2xfZ3JhbnRfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm5vbV9ncmFudF9pbnR2bCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRvbF9ncmFudF9qaXR0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dG9zX2FuZF9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT50b3NfYW5kX21hc2sgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidG9zX2FuZF9tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnRvc19hbmRfbWFzaywgdGhpcy0+dG9zX2FuZF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnRvc19vcl9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT50b3Nfb3JfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0b3Nfb3JfbWFza1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT50b3Nfb3JfbWFzaywgdGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4X2xhdGVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnJlcV90cmFuc19wb2xpY3kgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVxX3RyYW5zX3BvbGljeVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5yZXFfdHJhbnNfcG9saWN5LCB0aGlzLT5yZXFfdHJhbnNfcG9saWN5X2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlcWRfYXR0cmliX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5mb3JiaWRfYXR0cmliX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hdHRyaWJfYWdncl9tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hdHRyaWJfbWFza19zdWNjZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCA+IDApICYmICh0aGlzLT5hcHBsaWNhdGlvbl9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJhcHBsaWNhdGlvbl9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5hcHBsaWNhdGlvbl9pZCwgdGhpcy0+YXBwbGljYXRpb25faWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNvbnRfcmVxX3dpbmRvd19tdWx0aSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YndfcmVxX211bHRpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGVha19yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y3JlYXRlX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqdGhpcykKK3sKKyAgICByZXR1cm4gMTA0ICsgdGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGggKyB0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoICsgdGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoICsgdGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGggKyB0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3ZjX2Zsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmRpcmVjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Zmxvd190eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xb3NfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNoYW5uZWxfc2V0X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmdGhpcy0+ZHNpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWF4X3JlcXVlc3RzX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1heF9ieXRlc19wZXJfc2lkX2NsdXN0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50b3RhbF9ieXRlc19wZXJfc2lkX2NsdXN0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYXhfdGltZV9wZXJfc2lkX2NsdXN0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNlcnZpY2VfY2xhc3NfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnNlcnZpY2VfY2xhc3NfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnNlcnZpY2VfY2xhc3MgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlX2NsYXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnNlcnZpY2VfY2xhc3MgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5zZXJ2aWNlX2NsYXNzLCB0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc2VxX2RzaWRfc3VwcG9ydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1heF9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X2J1cnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWluX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5taW5fcGt0X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5hY3RpdmVfdGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFkbWl0dGVkX3RpbWVvdXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYXhfY29uY2F0X2J1cnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zY2hlZHVsaW5nX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ub21fcG9sbF9pbnR2bCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRvbF9wb2xsX2ppdHRlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVuc29sX2dyYW50X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ub21fZ3JhbnRfaW50dmwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50b2xfZ3JhbnRfaml0dGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+dG9zX2FuZF9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidG9zX2FuZF9tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnRvc19hbmRfbWFzayA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dG9zX2FuZF9tYXNrLCB0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT50b3Nfb3JfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnRvc19vcl9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidG9zX29yX21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dG9zX29yX21hc2sgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dG9zX29yX21hc2ssIHRoaXMtPnRvc19vcl9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1heF9sYXRlbmN5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXFfdHJhbnNfcG9saWN5X2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5yZXFfdHJhbnNfcG9saWN5X2xlbmd0aCA+IDApICYmICh0aGlzLT5yZXFfdHJhbnNfcG9saWN5ID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVxX3RyYW5zX3BvbGljeVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5yZXFfdHJhbnNfcG9saWN5ID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cmVxX3RyYW5zX3BvbGljeSwgdGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXFkX2F0dHJpYl9tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Zm9yYmlkX2F0dHJpYl9tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YXR0cmliX2FnZ3JfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YXR0cmliX21hc2tfc3VjY2VzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YXBwbGljYXRpb25faWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+YXBwbGljYXRpb25faWRsZW5ndGggPiAwKSAmJiAodGhpcy0+YXBwbGljYXRpb25faWQgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJhcHBsaWNhdGlvbl9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5hcHBsaWNhdGlvbl9pZCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmFwcGxpY2F0aW9uX2lkLCB0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y29udF9yZXFfd2luZG93X211bHRpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5id19yZXFfbXVsdGkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wZWFrX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jcmVhdGVfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHNlcnZpY2VfY2xhc3NfbGVuZ3RoOworICAgIHVpbnQ4X3QgdG9zX2FuZF9tYXNrX2xlbmd0aDsKKyAgICB1aW50OF90IHRvc19vcl9tYXNrX2xlbmd0aDsKKyAgICB1aW50OF90IHJlcV90cmFuc19wb2xpY3lfbGVuZ3RoOworICAgIHVpbnQ4X3QgYXBwbGljYXRpb25faWRsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnNlcnZpY2VfY2xhc3NfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogc2VydmljZV9jbGFzc19sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgc2VydmljZV9jbGFzc19sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ0b3NfYW5kX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdG9zX2FuZF9tYXNrX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB0b3NfYW5kX21hc2tfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdG9zX29yX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdG9zX29yX21hc2tfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHRvc19vcl9tYXNrX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcmVxX3RyYW5zX3BvbGljeV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiByZXFfdHJhbnNfcG9saWN5X2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCByZXFfdHJhbnNfcG9saWN5X2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZhcHBsaWNhdGlvbl9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGFwcGxpY2F0aW9uX2lkbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGFwcGxpY2F0aW9uX2lkbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zdmNfZmxvd19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnRvdGFsX3BrdF9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnRvdGFsX2J5dGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hY3RpdmVfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmludmFsaWRfcGhzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGt0c19kcm9wcGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGt0c19kZWxheWVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnN2Y19mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dG90YWxfcGt0X2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dG90YWxfYnl0ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFjdGl2ZV90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW52YWxpZF9waHNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wa3RzX2Ryb3BwZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wa3RzX2RlbGF5ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDM2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Y251X21hY19hZGRyZXNzX3N0YXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5jbnVfbWFjX2FkZHJlc3NfZW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5jbnVfbWFjX2FkZHJlc3Nfc3RhcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmNudV9tYWNfYWRkcmVzc19lbmQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aGlnaF9yZXNfdGltaW5nX29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCA+IDApICYmICh0aGlzLT5lcXVhbGl6YXRpb25fZGF0YSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlcXVhbGl6YXRpb25fZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGEsIHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuZXJyb3JlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5jb3JyZWN0ZWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dW5jb3JyZWN0YWJsZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zbnIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pY3JvX3JlZmxlY3Rpb25zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdGhpcykKK3sKKyAgICByZXR1cm4gMzcgKyB0aGlzLT5lcXVhbGl6YXRpb25fZGF0YV9sZW5ndGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5oaWdoX3Jlc190aW1pbmdfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5lcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZXF1YWxpemF0aW9uX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhLCB0aGlzLT5lcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmVycm9yZWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Y29ycmVjdGVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVuY29ycmVjdGFibGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c25yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5taWNyb19yZWZsZWN0aW9ucykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBlcXVhbGl6YXRpb25fZGF0YV9sZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICB1aW50OF90IGkxOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZHgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51c2NoYW5fY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dXNjaGFuX2NvdW50ID4gMCkgJiYgKHRoaXMtPnVzY2hhbl9kYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzY2hhbl9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnVzY2hhbl9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9wYWNrKCZ0aGlzLT51c2NoYW5fZGF0YVtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZV9wYWNrKHRoaXMtPmNvbm5lY3Rpdml0eV9zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbl9wYWNrKHRoaXMtPmRvY3Npc192ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlX3BhY2sodGhpcy0+aXBhZGRyX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXBhZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGFkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwYWRkcl92YWx1ZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcGFkZHJfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aXBhZGRyX3ZhbHVlLCB0aGlzLT5pcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dGltZXN0YW1wKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zZmxvd19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5zZmxvd19jb3VudCA+IDApICYmICh0aGlzLT5zZmxvd19pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZmxvd19pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT5zZmxvd19jb3VudDsgaTErKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zZmxvd19pZFtpMV0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5saW5rX2xvY2FsX2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxpbmtfbG9jYWxfYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+bGlua19sb2NhbF9hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtfbG9jYWxfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5saW5rX2xvY2FsX2FkZHIsIHRoaXMtPmxpbmtfbG9jYWxfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tYWNfZG9tYWluX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c2VydmljZV9ncm91cF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmNwX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnJjcF9pZGxlbmd0aCA+IDApICYmICh0aGlzLT5yY3BfaWQgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmNwX2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnJjcF9pZCwgdGhpcy0+cmNwX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmNjX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmNzX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dGNzX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGFzdF9yZWdpc3Rlcl90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YWRkcl9yZXNvbHZlX3JlcXVlc3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAoNDggKyB0aGlzLT5pcGFkZHJfbGVuZ3RoKSArICg0ICogdGhpcy0+c2Zsb3dfY291bnQpICsgdGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCArIHRoaXMtPnJjcF9pZGxlbmd0aDsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPnVzY2hhbl9jb3VudCA+IDApICYmICh0aGlzLT51c2NoYW5fZGF0YSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1c2NoYW5fY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51c2NoYW5fY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51c2NoYW5fZGF0YVtpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIHVpbnQ4X3QgaTE7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlkeCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnVzY2hhbl9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT51c2NoYW5fY291bnQgPiAwKSAmJiAodGhpcy0+dXNjaGFuX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1c2NoYW5fZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT51c2NoYW5fZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51c2NoYW5fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dXNjaGFuX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3VucGFjaygmdGhpcy0+dXNjaGFuX2RhdGFbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZV91bnBhY2soJnRoaXMtPmNvbm5lY3Rpdml0eV9zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbl91bnBhY2soJnRoaXMtPmRvY3Npc192ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlX3VucGFjaygmdGhpcy0+aXBhZGRyX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXBhZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGFkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwYWRkcl92YWx1ZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwYWRkcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pcGFkZHJfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+aXBhZGRyX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmlwYWRkcl92YWx1ZSwgdGhpcy0+aXBhZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRpbWVzdGFtcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c2Zsb3dfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+c2Zsb3dfY291bnQgPiAwKSAmJiAodGhpcy0+c2Zsb3dfaWQgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZmxvd19pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5zZmxvd19pZCA9ICh1aW50MzJfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+c2Zsb3dfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnNmbG93X2NvdW50OyBpMSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNmbG93X2lkW2kxXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxpbmtfbG9jYWxfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5saW5rX2xvY2FsX2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rX2xvY2FsX2FkZHJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+bGlua19sb2NhbF9hZGRyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxpbmtfbG9jYWxfYWRkcl9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5saW5rX2xvY2FsX2FkZHIsIHRoaXMtPmxpbmtfbG9jYWxfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYWNfZG9tYWluX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2VydmljZV9ncm91cF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmNwX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnJjcF9pZGxlbmd0aCA+IDApICYmICh0aGlzLT5yY3BfaWQgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyY3BfaWRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+cmNwX2lkID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnJjcF9pZGxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnJjcF9pZCwgdGhpcy0+cmNwX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmNjX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmNzX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dGNzX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGFzdF9yZWdpc3Rlcl90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YWRkcl9yZXNvbHZlX3JlcXVlc3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgdXNjaGFuX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgdWludDhfdCBpcGFkZHJfbGVuZ3RoOworICAgIHVpbnQ4X3Qgc2Zsb3dfY291bnQ7CisgICAgdWludDhfdCBsaW5rX2xvY2FsX2FkZHJfbGVuZ3RoOworICAgIHVpbnQ4X3QgcmNwX2lkbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1c2NoYW5fY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSkgKiB1c2NoYW5fY291bnQpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IHVzY2hhbl9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmaXBhZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGlwYWRkcl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaXBhZGRyX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc2Zsb3dfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDMyX3QpICogc2Zsb3dfY291bnQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgc2Zsb3dfY291bnQgKiA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsaW5rX2xvY2FsX2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGlua19sb2NhbF9hZGRyX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsaW5rX2xvY2FsX2FkZHJfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnJjcF9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJjcF9pZGxlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCByY3BfaWRsZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX2VuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jZW50ZXJfZnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uX3BhY2sodGhpcy0+bW9kdWxhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leF9wYWNrKHRoaXMtPmFubmV4LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3BhY2sodGhpcy0+aW50ZXJsZWF2ZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aW50ZXJmYWNlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2VudGVyX2ZyZXF1ZW5jeSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbl91bnBhY2soJnRoaXMtPm1vZHVsYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXhfdW5wYWNrKCZ0aGlzLT5hbm5leCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlcl91bnBhY2soJnRoaXMtPmludGVybGVhdmVyLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3dlcl9sZXZlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmludGVyZmFjZV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX2VuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jZW50ZXJfZnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2hhbm5lbF93aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlX3BhY2sodGhpcy0+Y2hhbm5lbF9wcm9maWxlX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc19zYWMyc2luYzJlbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWluaXNsb3Rfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRyYW5zbWl0X3RpbWluZ19vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmluaXRpYWxfcmFuZ2luZ19iYWNrb2ZmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5maW5hbF9yYW5naW5nX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmluaXRpYWxfZGF0YV9iYWNrb2ZmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5maW5hbF9kYXRhX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmFjdGl2ZV9zY2RtYV9jb2RlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y29kZXNfcGVyX3Nsb3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnNjZG1hX2ZyYW1lX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5ob3BwaW5nX3NlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZV9wYWNrKHRoaXMtPm1vZHVsYXRpb25fdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmVfZXF1YWxpemF0aW9uX3NldHRpbmcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pbnRlcmZhY2VfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNlbnRlcl9mcmVxdWVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jaGFubmVsX3dpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGVfdW5wYWNrKCZ0aGlzLT5jaGFubmVsX3Byb2ZpbGVfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX3NhYzJzaW5jMmVuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5taW5pc2xvdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dHJhbnNtaXRfdGltaW5nX29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW5pdGlhbF9yYW5naW5nX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmZpbmFsX3JhbmdpbmdfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW5pdGlhbF9kYXRhX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmZpbmFsX2RhdGFfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YWN0aXZlX3NjZG1hX2NvZGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jb2Rlc19wZXJfc2xvdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c2NkbWFfZnJhbWVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmhvcHBpbmdfc2VlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlX3VucGFjaygmdGhpcy0+bW9kdWxhdGlvbl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByZV9lcXVhbGl6YXRpb25fc2V0dGluZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmludGVyZmFjZV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pbnRlcmZhY2VfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNvbnRlbnRpb25faW50ZXJ2YWxzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dW5lcnJvcmVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmNvcnJlY3RlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmNvcnJlY3RhYmxlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNucikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWljcm9fcmVmbGVjdGlvbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50ZXJmYWNlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jb250ZW50aW9uX2ludGVydmFscykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVuZXJyb3JlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5jb3JyZWN0ZWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5jb3JyZWN0YWJsZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zbnIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pY3JvX3JlZmxlY3Rpb25zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmlucHV0X3Bvd2VyX2xldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pbnB1dF9wb3dlcl9sZXZlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmVyc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBhY2tldF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjaygmdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfcGFjaygmdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3BhY2soJnRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfcGFjaygmdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscywgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3BhY2soJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc1tpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZF9wYWNrKHRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lm1ldGhvZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl9wYWNrKHRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlcXVlc3Rfb3B0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fcGFjaygmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc1tpNl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk3ID0gMDsgaTcgPCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfcGFjaygmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNbaTddLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fcGFjaygmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzW2k4XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpOTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk5ID0gMDsgaTkgPCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpOSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2k5XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1faW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMCA9IDA7IGkxMCA8IHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudDsgaTEwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzW2kxMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1faW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTEgPSAwOyBpMTEgPCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OyBpMTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHlfcGFjaygmdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc1tpMTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ05VX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkxMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY251X21hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbnVfc3RhdHVzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTIgPSAwOyBpMTIgPCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X2NvdW50OyBpMTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3NbaTEyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkxMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY251X3N0YXR1c19kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbnVfc3RhdHVzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEzID0gMDsgaTEzIDwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQ7IGkxMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfcGFjaygmdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGFbaTEzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfaWRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNCA9IDA7IGkxNCA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQ7IGkxNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkc1tpMTRdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTUgPSAwOyBpMTUgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudDsgaTE1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3BhY2soJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhW2kxNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkxNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuaW50Zl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLnRpbWVzdGFtcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmNtY19pbnRlcmZhY2VfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbWNfaW50ZXJmYWNlX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE2ID0gMDsgaTE2IDwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuaW50Zl9jb3VudDsgaTE2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YV9wYWNrKCZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGFbaTE2XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX3JuZ19yZXFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLnJuZ19hYm9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW52YWxpZF9yZWdfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5mYWlsZWRfcmVnX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW52YWxpZF9kYXRhX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UudDV0aW1lb3V0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxNzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9pbmRleCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX2luZGV4XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTcgPSAwOyBpMTcgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudDsgaTE3KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0LmludGZfaW5kZXhbaTE3XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE4OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5uZXR3b3JrX2ludGVyZmFjZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmV0d29ya19pbnRlcmZhY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE4ID0gMDsgaTE4IDwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50OyBpMTgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV9wYWNrKCZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLm5ldHdvcmtfaW50ZXJmYWNlc1tpMThdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2lkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxOSA9IDA7IGkxOSA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTE5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHNbaTE5XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIwID0gMDsgaTIwIDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfY291bnQ7IGkyMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfcGFjaygmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YVtpMjBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTIxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfaWRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjEgPSAwOyBpMjEgPCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTIxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkc1tpMjFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGFzc2lmaWVyX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjIgPSAwOyBpMjIgPCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQ7IGkyMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9wYWNrKCZ0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YVtpMjJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIzID0gMDsgaTIzIDwgdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7IGkyMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyX3BhY2soJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2kyM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTI0ID0gMDsgaTI0IDwgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTI0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfcGFjaygmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc1tpMjRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfcGFjayh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UuY2hhbm5lbF9vbmVfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX3R3b19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfdGhyZWVfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX2ZvdXJfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3BhY2sodGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXF1ZXN0X29wdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV9wYWNrKCZ0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmNudV9tYWNfcmFuZ2UsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9FWENMVURFX0NOVVNfRlJPTV9MT0FEX0JBTEFOQ0lOR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3BhY2sodGhpcy0+dS5zZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVxdWVzdC5yZXF1ZXN0X29wdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzc19zdGFydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3NfZW5kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfcGFjayh0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZF9wYWNrKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5tZXRob2QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVzdHJpY3Rpb25zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjUgPSAwOyBpMjUgPCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50OyBpMjUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3BhY2soJnRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNbaTI1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfcGFjayh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0NNQ19TWVNURU1fRVZFTlRfTUVTU0FHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9BQ1RJVkVfQ05VU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9BQ1RJVkVfQ05VU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VX0NPTkZJR1VSQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVVNfQ09ORklHVVJBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9DTlVfQ09ORklHVVJBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUFNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TRVJWSUNFU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TRVJWSUNFU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfUkVHX1JTUF9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTMgKiB0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMiAqIHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEzICogdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgzMyAqIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgyICogdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMzMgKiB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgyICogdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoMiAqIHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgyICogdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoMiAqIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgyICogdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDMyICogdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ05VX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoNiAqIHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X3N0YXR1c19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNudV9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9zdGF0dXNfZGF0YVtpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgzNiAqIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmNtY19pbnRlcmZhY2VfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuaW50Zl9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuY21jX2ludGVyZmFjZV9kYXRhW2kxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgyICogdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0LmludGZfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgxMDUgKiB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgyICogdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhW2kyXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXNzaWZpZXJfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2RhdGFbaTNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDMgKiB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDMgKiB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9FWENMVURFX0NOVVNfRlJPTV9MT0FEX0JBTEFOQ0lOR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9ICg1ICsgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKyB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpICsgKDEyICogdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfQ01DX1NZU1RFTV9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VU19DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9SRUdfUlNQX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wYWNrZXRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjaygmdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3VucGFjaygmdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soJnRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjaygmdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTRdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc1tpNV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3VucGFjaygmdGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QubWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3VucGFjaygmdGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVxdWVzdF9vcHRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTYgPSAwOyBpNiA8IHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7IGk2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uX3VucGFjaygmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc1tpNl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk3OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk3ID0gMDsgaTcgPCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpN10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk4OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk4ID0gMDsgaTggPCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7IGk4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uX3VucGFjaygmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzW2k4XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk5OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpOSA9IDA7IGk5IDwgdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2k5XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2ludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OyBpMTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNbaTEwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2ludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTExID0gMDsgaTExIDwgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudDsgaTExKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5X3VucGFjaygmdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc1tpMTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTEyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNudV9tYWNfYWRkcmVzc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfY251X3N0YXR1c19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3MgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQgKiBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEyID0gMDsgaTEyIDwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudDsgaTEyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X21hY19hZGRyZXNzW2kxMl0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ05VX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X3N0YXR1c19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY251X3N0YXR1c19kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbnVfc3RhdHVzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X3N0YXR1c19kYXRhID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMyA9IDA7IGkxMyA8IHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X2NvdW50OyBpMTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3VucGFjaygmdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGFbaTEzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2lkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNCA9IDA7IGkxNCA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQ7IGkxNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkc1tpMTRdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2lkY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE1ID0gMDsgaTE1IDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2lkY291bnQ7IGkxNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV91bnBhY2soJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhW2kxNV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UudGltZXN0YW1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuY21jX2ludGVyZmFjZV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY21jX2ludGVyZmFjZV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGEgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTYgPSAwOyBpMTYgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50OyBpMTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3VucGFjaygmdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuY21jX2ludGVyZmFjZV9kYXRhW2kxNl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX3JuZ19yZXFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLnJuZ19hYm9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW52YWxpZF9yZWdfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5mYWlsZWRfcmVnX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW52YWxpZF9kYXRhX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UudDV0aW1lb3V0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxNzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9pbmRleCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfaW5kZXhcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9pbmRleCA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0LmludGZfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE3ID0gMDsgaTE3IDwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0LmludGZfY291bnQ7IGkxNysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2luZGV4W2kxN10pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxODsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UubmV0d29ya19pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmV0d29ya19pbnRlcmZhY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UubmV0d29ya19pbnRlcmZhY2VzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxOCA9IDA7IGkxOCA8IHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudDsgaTE4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGFfdW5wYWNrKCZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLm5ldHdvcmtfaW50ZXJmYWNlc1tpMThdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE5OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19pZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHMgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTkgPSAwOyBpMTkgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQ7IGkxOSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzW2kxOV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGEgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIwID0gMDsgaTIwIDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfY291bnQ7IGkyMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfdW5wYWNrKCZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhW2kyMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfaWRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIxID0gMDsgaTIxIDwgdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQ7IGkyMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHNbaTIxXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTIyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGFzc2lmaWVyX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2RhdGEgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjIgPSAwOyBpMjIgPCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQ7IGkyMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV91bnBhY2soJnRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9kYXRhW2kyMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjMgPSAwOyBpMjMgPCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTIzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfdW5wYWNrKCZ0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc1tpMjNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTI0ID0gMDsgaTI0IDwgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTI0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfdW5wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzW2kyNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfb25lX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UuY2hhbm5lbF90d29fcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX3RocmVlX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UuY2hhbm5lbF9mb3VyX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl91bnBhY2soJnRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVxdWVzdF9vcHRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmNudV9tYWNfcmFuZ2UsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKCZ0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXF1ZXN0LnJlcXVlc3Rfb3B0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3QuY251X21hY19hZGRyZXNzX3N0YXJ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzc19lbmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9FWENMVURFX0NOVVNfRlJPTV9MT0FEX0JBTEFOQ0lOR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV91bnBhY2soJnRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3VucGFjaygmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lm1ldGhvZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZXN0cmljdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTI1ID0gMDsgaTI1IDwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc19jb3VudDsgaTI1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV91bnBhY2soJnRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNbaTI1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV91bnBhY2soJnRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfQ01DX1NZU1RFTV9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VU19DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9SRUdfUlNQX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZSBvcGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSAqIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcykgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDMzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcykgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDMzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24pICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0KSAqIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0KSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5KSAqIHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCAqIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ05VX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGNudV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmY251X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSAqIGNudV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBjbnVfY291bnQgKiA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ05VX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBjbnVfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmNudV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEpICogY251X2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCBjbnVfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3ZjX2Zsb3dfaWRjb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZzdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIHN2Y19mbG93X2lkY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgc3ZjX2Zsb3dfaWRjb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEpICogc3ZjX2Zsb3dfaWRjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzdmNfZmxvd19pZGNvdW50ICogMzYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGludGZfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmludGZfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEpICogaW50Zl9jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgaW50Zl9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGludGZfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmaW50Zl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiBpbnRmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGludGZfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGludGVyZmFjZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhKSAqIGludGVyZmFjZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50ZXJmYWNlc19jb3VudCAqIDEwNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogc3ZjX2Zsb3dfaWRjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzdmNfZmxvd19pZGNvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3ZjX2Zsb3dfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZzdmNfZmxvd19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEpICogc3ZjX2Zsb3dfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHN2Y19mbG93X2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogc3ZjX2Zsb3dfaWRjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzdmNfZmxvd19pZGNvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBjbGFzc2lmaWVyX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmY2xhc3NpZmllcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSkgKiBjbGFzc2lmaWVyX2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCBjbGFzc2lmaWVyX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcikgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcikgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJlc3RyaWN0aW9uc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZyZXN0cmljdGlvbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlKSAqIHJlc3RyaWN0aW9uc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCByZXN0cmljdGlvbnNfY291bnQgKiAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0NNQ19TWVNURU1fRVZFTlRfTUVTU0FHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9BQ1RJVkVfQ05VU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9BQ1RJVkVfQ05VU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VX0NPTkZJR1VSQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVVNfQ09ORklHVVJBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9DTlVfQ09ORklHVVJBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUFNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TRVJWSUNFU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TRVJWSUNFU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfUkVHX1JTUF9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+c2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh1aW50MjRfdF90b191aW50MzJfdCh0aGlzLT5zaXplKSA+IDApICYmICh0aGlzLT5jZXJ0aWZpY2F0ZV9kYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+Y2VydGlmaWNhdGVfZGF0YSwgdWludDI0X3RfdG9fdWludDMyX3QodGhpcy0+c2l6ZSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqdGhpcykKK3sKKyAgICByZXR1cm4gMyArIHVpbnQyNF90X3RvX3VpbnQzMl90KHRoaXMtPnNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT5zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHVpbnQyNF90X3RvX3VpbnQzMl90KHRoaXMtPnNpemUpID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjZXJ0aWZpY2F0ZV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmNlcnRpZmljYXRlX2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodWludDI0X3RfdG9fdWludDMyX3QodGhpcy0+c2l6ZSkgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5jZXJ0aWZpY2F0ZV9kYXRhLCB1aW50MjRfdF90b191aW50MzJfdCh0aGlzLT5zaXplKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MjRfdCBzaXplOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChwYWNrZWQsICZzaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdWludDI0X3RfdG9fdWludDMyX3Qoc2l6ZSkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdWludDI0X3RfdG9fdWludDMyX3Qoc2l6ZSkgKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2sodGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC5zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC5zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX0FERF9HUk9VUF9BRERSRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX0RFTF9HUk9VUF9BRERSRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX0lOSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfU0VMRl9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfUkVTRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BPUlRfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUucGh5X2FkbWluX2NvbnRyb2wuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BPUlRfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiBsZWFmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX0FERF9HUk9VUF9BRERSRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX0RFTF9HUk9VUF9BRERSRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX0lOSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfU0VMRl9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfUkVTRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfcGFjayh0aGlzLT5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b2JqZWN0X2luc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3BhY2sodGhpcy0+YWxhcm1faWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9wb3dlcl9hbGFybS50aW1lX3N0YW1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3dlcl9hbGFybS5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfcGFjayh0aGlzLT51Lm9udV9wb3dlcl9hbGFybS5hbGFybV9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT05fSUZfU1dJVENIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9wb25faWZfc3dpdGNoLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2guc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfcGFjayh0aGlzLT51Lm9udV9wb25faWZfc3dpdGNoLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxVElNSU5HX1VOTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0NPTkdFU1RJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9NSVNTSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX1ZPTFRfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9FUVVJUE1FTlRfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0lBRF9DT05ORUNUSU9OX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BIWVNJQ0FMX0lOU1RSVUNUSU9OX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TRUxGX1RFU1RfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfU0xFRVBfU1RBVFVTX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFUk5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPVFNfUE9SVF9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi50aW1lX3N0YW1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA4OworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1faWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT1dFUl9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPTl9JRl9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9TRUxGX1RFU1RfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FMUxPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FMVBPUlRfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FMVRJTUlOR19VTkxPQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQVVUT19ORUdfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9DT05HRVNUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfTUlTU0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9WT0xUX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfRVFVSVBNRU5UX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9JQURfQ09OTkVDVElPTl9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QSFlTSUNBTF9JTlNUUlVDVElPTl9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfU0VMRl9URVNUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NMRUVQX1NUQVRVU19VUERBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9EUk9QX0VWRVJOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1RTX1BPUlRfRkFJTFVSRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKCZ0aGlzLT5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b2JqZWN0X2luc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3VucGFjaygmdGhpcy0+YWxhcm1faWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9wb3dlcl9hbGFybS50aW1lX3N0YW1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3dlcl9hbGFybS5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3dlcl9hbGFybS5hbGFybV9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT05fSUZfU1dJVENIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9wb25faWZfc3dpdGNoLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2guc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb25faWZfc3dpdGNoLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxVElNSU5HX1VOTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0NPTkdFU1RJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9NSVNTSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX1ZPTFRfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9FUVVJUE1FTlRfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0lBRF9DT05ORUNUSU9OX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BIWVNJQ0FMX0lOU1RSVUNUSU9OX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TRUxGX1RFU1RfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfU0xFRVBfU1RBVFVTX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFUk5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPVFNfUE9SVF9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi50aW1lX3N0YW1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRlZi5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgYWxhcm1faWQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKCZhbGFybV9pZCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGFsYXJtX2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPTl9JRl9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxVElNSU5HX1VOTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0NPTkdFU1RJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9NSVNTSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX1ZPTFRfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9FUVVJUE1FTlRfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0lBRF9DT05ORUNUSU9OX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BIWVNJQ0FMX0lOU1RSVUNUSU9OX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TRUxGX1RFU1RfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfU0xFRVBfU1RBVFVTX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFUk5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPVFNfUE9SVF9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV9wYWNrKHRoaXMtPnUucGh5X2FkbWluX3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmF1dG9fbmVnX2FkbWluX3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0ZWNobm9sb2dpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2F1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzW2kwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRlY2hub2xvZ2llc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnRfcGFjayh0aGlzLT51LmZlY19hYmlsaXR5LnN1cHBvcnQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlX3BhY2sodGhpcy0+dS5mZWNfbW9kZS5zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9BRE1JTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19EQVRBX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RJTUVfT0ZfTEFTVF9PUEVSX0NIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1VOS19QUk9UT0NPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX0ZSRVE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0ZBTFNFX0NBUlJJRVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSkFCQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0xPU0VfTUVESUFfQ1RSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VWRU5UX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZSQU1FU19UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVNUX1NPVVJDRV9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVRFX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NPVVJDRV9BRERSX0NIQU5HRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9URVhUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RYX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyAoNCAqIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNCArICg0ICogdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX0FETUlOX0tFWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfT1BFUl9LRVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX1BSSToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfUFJJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0RJU0NBUkQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0VSUl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVElNRV9PRl9MQVNUX09QRVJfQ0hBTkdFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1VOS19QUk9UT0NPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX0ZSRVE6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfRkFMU0VfQ0FSUklFUlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9KQUJCRVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0xPU0VfTUVESUFfQ1RSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfR0FURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfR0FURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VWRU5UX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NRRV9URVNUX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BTElHTl9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9CVVJTVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVRFX0VWRU5UUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1ZFUllfTE9OR19FVkVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9URVhUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUucGh5X2FkbWluX3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfYWRtaW5fc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRlY2hub2xvZ2llc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llcyA9ICh1aW50MzJfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCA+IDApICYmICh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRlY2hub2xvZ2llc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXMgPSAodWludDMyX3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzW2kxXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0X3VucGFjaygmdGhpcy0+dS5mZWNfYWJpbGl0eS5zdXBwb3J0LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlX3VucGFjaygmdGhpcy0+dS5mZWNfbW9kZS5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX0FETUlOX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BR0dfT1JfSU5ESVZJRFVBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19DT0xMRUNUT1JfTUFYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTElOS19VUF9ET1dOX05PVElGWV9FTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUE9SVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVElNRV9PRl9MQVNUX09QRVJfQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfRkFMU0VfQ0FSUklFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSURMRV9FUlJPUl9DT1VOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9KQUJCRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0RVUF9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfUERVX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9PVUk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTlNVUFBPUlRFRF9PUENPREVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9NSUlfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NRRV9URVNUX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZsZWFmLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGVjaG5vbG9naWVzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MzJfdCkgKiB0ZWNobm9sb2dpZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB0ZWNobm9sb2dpZXNfY291bnQgKiA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlY2hub2xvZ2llc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0ZWNobm9sb2dpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDMyX3QpICogdGVjaG5vbG9naWVzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgdGVjaG5vbG9naWVzX2NvdW50ICogNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FVkVOVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX0RFVklDRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5JUVVFX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUSVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9CVVJTVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0RBVEFfUkFURV9NSVNNQVRDSEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFURV9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SVU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TWU1fRVJSX0RVUklOR19QS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1ZFUllfTE9OR19FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfVEVYVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfcGFjayh0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19LRVlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm5ld19rZXlfcmVxdWVzdC5pbl91c2Vfa2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0NIVVJOSU5HX0tFWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkubmV3X2tleV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5uZXdfY2h1cm5pbmdfa2V5LmNodXJuaW5nX2tleTAsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV3X2NodXJuaW5nX2tleS5jaHVybmluZ19rZXkxLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfS0VZX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfQ0hVUk5JTkdfS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3VucGFjaygmdGhpcy0+Y29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfS0VZX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5uZXdfa2V5X3JlcXVlc3QuaW5fdXNlX2tleV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19DSFVSTklOR19LRVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5uZXdfY2h1cm5pbmdfa2V5Lm5ld19rZXlfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5uZXdfY2h1cm5pbmdfa2V5LmNodXJuaW5nX2tleTAsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5uZXdfY2h1cm5pbmdfa2V5LmNodXJuaW5nX2tleTEsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5uZXdfY2h1cm5pbmdfa2V5LmNodXJuaW5nX2tleTIsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZSBjb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3VucGFjaygmY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfS0VZX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0NIVVJOSU5HX0tFWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfcGFjayh0aGlzLT51LmNvbW1pdF9pbWFnZV9yZXF1ZXN0LmZsYWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Fja19wYWNrKHRoaXMtPnUuY29tbWl0X2ltYWdlX3Jlc3BvbnNlLmFjaywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnX3VucGFjaygmdGhpcy0+dS5jb21taXRfaW1hZ2VfcmVxdWVzdC5mbGFnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2tfdW5wYWNrKCZ0aGlzLT51LmNvbW1pdF9pbWFnZV9yZXNwb25zZS5hY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgb3Bjb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVwb3J0X2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDQpID09IDB4MDAwNCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWUyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDA4KSA9PSAweDAwMDgpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAxMCkgPT0gMHgwMDEwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMjApID09IDB4MDAyMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDQwKSA9PSAweDAwNDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDA4MCkgPT0gMHgwMDgwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZTcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXBvcnRfYml0bWFwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWUwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDgpID09IDB4MDAwOCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWUzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDEwKSA9PSAweDAwMTApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAyMCkgPT0gMHgwMDIwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwNDApID09IDB4MDA0MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWU2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDgwKSA9PSAweDAwODApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZV9wYWNrKHRoaXMtPmRiYV9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGJhX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfZ2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3NldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfcGFjaygmdGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmRiYV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGVfdW5wYWNrKCZ0aGlzLT5kYmFfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRiYV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfZ2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3VucGFjaygmdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF91bnBhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c1tpMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3VucGFjaygmdGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUgZGJhX2NvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3VucGFjaygmZGJhX2NvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChkYmFfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfc2V0c19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSAqIHF1ZXVlX3NldHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHF1ZXVlX3NldHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHF1ZXVlX3NldHNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZxdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCkgKiBxdWV1ZV9zZXRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBxdWV1ZV9zZXRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfc2V0c19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSAqIHF1ZXVlX3NldHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHF1ZXVlX3NldHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0X3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9PTERfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBvcnQucG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPmxlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX09MRF9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPmxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9PTERfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydC5wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKCZsZWFmLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfT0xEX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGVfcGFjayh0aGlzLT51LnBvcnQucG9ydF90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucG9ydC5jYXNjYWRlX3Nsb3RfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5jYXJkLmNhcmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmxsaWQubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPTl9JRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5wb25faWYucG9uX2lmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfT05VOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfQ0FSRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfTExJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9OX0lGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9PTlU6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPmxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGVfdW5wYWNrKCZ0aGlzLT51LnBvcnQucG9ydF90eXBlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnQuY2FzY2FkZV9zbG90X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNhcmQuY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sbGlkLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT05fSUY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb25faWYucG9uX2lmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfT05VOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfTExJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPTl9JRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX09OVToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5hY3Rpb24uZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKCZ0aGlzLT51Lm9sZF9tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5leHRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmV4dF9hdHRyaWJ1dGUuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3BhY2sodGhpcy0+dS5leHRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmV4dF9hY3Rpb24uZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUua3RhdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKHRoaXMtPnUua3RhdHRyaWJ1dGUuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUua3RhY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKHRoaXMtPnUua3RhY3Rpb24uZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5kZWYuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9sZF9tYW5hZ2VtZW50X29iamVjdC5vYmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm1hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm9sZF9tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3Qub2JqZWN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5leHRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5leHRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hY3Rpb24uZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUua3RhdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUua3RhdHRyaWJ1dGUuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUua3RhY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUua3RhY3Rpb24uZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjaygmdGhpcy0+dS5kZWYuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmYnJhbmNoLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlX3BhY2sodGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRElTQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9FTkFCTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LmVuYWJsZWQuY2lyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5lbmFibGVkLmJ1Y2tldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUuZW5hYmxlZC5leHRyYV9idXJzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRElTQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9FTkFCTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT51LmVuYWJsZWQuY2lyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmdGhpcy0+dS5lbmFibGVkLmJ1Y2tldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KGJ1ZiwgJnRoaXMtPnUuZW5hYmxlZC5leHRyYV9idXJzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZSBzdGF0ZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlX3VucGFjaygmc3RhdGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRElTQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9FTkFCTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF9wYWNrKHRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vYmplY3RfaW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayh0aGlzLT5hbGFybV9pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjaygmdGhpcy0+b2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm9iamVjdF9pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF91bnBhY2soJnRoaXMtPmFsYXJtX2lkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfcGFjaygmdGhpcy0+ZXZlbnRfZW50cnksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19wYWNrKHRoaXMtPmV2ZW50X3N0YXR1cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjaygmdGhpcy0+ZXZlbnRfZW50cnksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZXZlbnRfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV9wYWNrKCZ0aGlzLT5ldmVudF9lbnRyeSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c2V0X3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNsZWFyX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV91bnBhY2soJnRoaXMtPmV2ZW50X2VudHJ5LCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNldF90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jbGVhcl90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3BhY2sodGhpcy0+c3ViX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3N0YXR1c19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cnlfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfcGFjaygmdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdGF0dXNfc2V0LmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc3RhdHVzX3NldFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3BhY2soJnRoaXMtPnUuc3RhdHVzX3NldC5lbnRyaWVzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zdGF0dXNfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3BhY2soJnRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJpZXNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfdGhyZXNob2xkX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV9wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJpZXNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV90aHJlc2hvbGRfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfcGFjaygmdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJpZXNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3RocmVzaG9sZF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfcGFjaygmdGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cmllc1tpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoOCAqIHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cnlfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoMTIgKiB0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgxMiAqIHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg4ICogdGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgxNiAqIHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDE2ICogdGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3VucGFjaygmdGhpcy0+c3ViX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc3RhdHVzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cnlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV91bnBhY2soJnRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cmllc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdGF0dXNfc2V0LmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zdGF0dXNfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfdW5wYWNrKCZ0aGlzLT51LnN0YXR1c19zZXQuZW50cmllc1tpMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3N0YXR1c19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3VucGFjaygmdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cmllc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfdGhyZXNob2xkX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cnlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV91bnBhY2soJnRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cmllc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV90aHJlc2hvbGRfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cnlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfdW5wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cmllc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJ5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3RocmVzaG9sZF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5X3VucGFjaygmdGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cmllc1tpNV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgc3ViX3R5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3VucGFjaygmc3ViX3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChzdWJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSkgKiBlbnRyeV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBlbnRyeV9jb3VudCAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkpICogZW50cnlfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZW50cnlfY291bnQgKiAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5KSAqIGVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGVudHJ5X2NvdW50ICogMTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkpICogZW50cnlfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZW50cnlfY291bnQgKiA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5KSAqIGVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGVudHJ5X2NvdW50ICogMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZlbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSkgKiBlbnRyeV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBlbnRyeV9jb3VudCAqIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9GQVNUX0xFQVZFX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbl9wYWNrKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLmFjdGl2YXRlX2Zhc3RfbGVhdmUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9NVUxUSV9MTElEX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wubnVtX2xsaWRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9TTEVFUF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zbGVlcF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX2R1cmF0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5zbGVlcF9jb250cm9sLndha2VfZHVyYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZ19wYWNrKHRoaXMtPnUuc2xlZXBfY29udHJvbC5zbGVlcF9mbGFnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZV9wYWNrKHRoaXMtPnUuc2xlZXBfY29udHJvbC5zbGVlcF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fRkFTVF9MRUFWRV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9NVUxUSV9MTElEX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9TTEVFUF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9GQVNUX0xFQVZFX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbl91bnBhY2soJnRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLmFjdGl2YXRlX2Zhc3RfbGVhdmUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9NVUxUSV9MTElEX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC5udW1fbGxpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9TTEVFUF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zbGVlcF9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5zbGVlcF9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2xlZXBfY29udHJvbC5zbGVlcF9kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zbGVlcF9jb250cm9sLndha2VfZHVyYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZ191bnBhY2soJnRoaXMtPnUuc2xlZXBfY29udHJvbC5zbGVlcF9mbGFnLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlX3VucGFjaygmdGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uIGxlYWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9GQVNUX0xFQVZFX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fTVVMVElfTExJRF9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9TTEVFUF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5xdWV1ZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5maXhlZF9wYWNrZXRfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmZpeGVkX2JhbmR3aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmd1YXJhbnRlZWRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YmVzdF9lZmZvcnRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53cnJfd2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cXVldWVfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+Zml4ZWRfcGFja2V0X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5maXhlZF9iYW5kd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5ndWFyYW50ZWVkX2JhbmR3aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmJlc3RfZWZmb3J0X2JhbmR3aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d3JyX3dlaWdodCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb25fcGFjayh0aGlzLT5vcGVyYXRpb25fb2Zfc2VydmljZV9kYmEsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGVyYXRpb25fb2Zfc2VydmljZV9kYmEpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU0VSVklDRV9TTEFfT1BFUkFUSU9OX0RFQUNUSVZBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9BQ1RJVkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lX3BhY2sodGhpcy0+dS5hY3RpdmF0ZS5zY2hlbWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hY3RpdmF0ZS5wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYWN0aXZhdGUuY3ljbGVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfYWN0aXZhdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfcGFjaygmdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYuc2VydmljZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2VydmljZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi5zZXJ2aWNlcywgdGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU0VSVklDRV9TTEFfT1BFUkFUSU9OX0FDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDcgKyAoMTAgKiB0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnNlcnZpY2VzX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU0VSVklDRV9TTEFfT1BFUkFUSU9OX0FDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWVfdW5wYWNrKCZ0aGlzLT51LmFjdGl2YXRlLnNjaGVtZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmFjdGl2YXRlLnByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5hY3RpdmF0ZS5jeWNsZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2VydmljZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2FjdGl2YXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlX3VucGFjaygmdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2RlZl9jb3VudF9zZXJ2aWNlcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYuc2VydmljZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnNlcnZpY2VzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnNlcnZpY2VzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5kZWYuc2VydmljZXMsIHRoaXMtPnUuZGVmLnNlcnZpY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbiBvcGVyYXRpb25fb2Zfc2VydmljZV9kYmE7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl91bnBhY2soJm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU0VSVklDRV9TTEFfT1BFUkFUSU9OX0FDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmljZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc2VydmljZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUpICogc2VydmljZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgc2VydmljZXNfY291bnQgKiAxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2VydmljZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2VydmljZXNfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfZGVmX2NvdW50X3NlcnZpY2VzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm51bV9wb3J0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm51bV9wb3J0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfcGFjayh0aGlzLT53aWR0aCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2NC5vbnVfaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pcHY0Lm9udV9uZXR3b3JrX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LmlwdjQub251X2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjQuZGF0YV9jdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXB2NC5kYXRhX3N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmlwdjQuZGF0YV9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY2X2FkZHJlc3MoYnVmLCB0aGlzLT51LmlwdjYub251X2lwYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuaXB2Ni5pcHY2cHJlZml4X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2Ni5vbnVfZGVmYXVsdF9ndykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXB2Ni5kYXRhX2N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY2LmRhdGFfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXB2Ni5kYXRhX3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT53aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoX3VucGFjaygmdGhpcy0+d2lkdGgsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT53aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT51LmlwdjQub251X2lwYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2NC5vbnVfbmV0d29ya19tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5pcHY0Lm9udV9kZWZhdWx0X2d3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pcHY0LmRhdGFfY3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjQuZGF0YV9zdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcHY0LmRhdGFfcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY2X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5pcHY2Lm9udV9pcGFkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmlwdjYuaXB2NnByZWZpeF9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LmlwdjYub251X2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjYuZGF0YV9jdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2Ni5kYXRhX3N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwdjYuZGF0YV9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGggd2lkdGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoX3VucGFjaygmd2lkdGgsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh3aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF9wYWNrKHRoaXMtPndpZHRoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+d2lkdGgpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcHY0LnNubXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2NC50cmFwX2hvc3RfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjQudHJhcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY0LnNubXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcHY0LnNlY3VyaXR5X25hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwdjQuY29tbXVuaXR5X2Zvcl9yZWFkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcHY0LmNvbW11bml0eV9mb3Jfd3JpdGUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXB2Ni5zbm1wX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY2X2FkZHJlc3MoYnVmLCB0aGlzLT51LmlwdjYudHJhcF9ob3N0X2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY2LnRyYXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXB2Ni5zbm1wX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXB2Ni5zZWN1cml0eV9uYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcHY2LmNvbW11bml0eV9mb3JfcmVhZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXB2Ni5jb21tdW5pdHlfZm9yX3dyaXRlLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT53aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDExNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF91bnBhY2soJnRoaXMtPndpZHRoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+d2lkdGgpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcHY0LnNubXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2NC50cmFwX2hvc3RfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjQudHJhcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pcHY0LnNubXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwdjQuc2VjdXJpdHlfbmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcHY0LmNvbW11bml0eV9mb3JfcmVhZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcHY0LmNvbW11bml0eV9mb3Jfd3JpdGUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaXB2Ni5zbm1wX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LmlwdjYudHJhcF9ob3N0X2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pcHY2LnRyYXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2Ni5zbm1wX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcHY2LnNlY3VyaXR5X25hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXB2Ni5jb21tdW5pdHlfZm9yX3JlYWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXB2Ni5jb21tdW5pdHlfZm9yX3dyaXRlLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aCB3aWR0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoX3VucGFjaygmd2lkdGgsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh3aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5ldGhlcl90eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT52bGFuX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5ldGhlcl90eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT52bGFuX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+b2xkX3ZsYW4sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT5uZXdfdmxhbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+b2xkX3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+bmV3X3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnZsYW5zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnN2bGFuLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dmxhbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZsYW5zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT52bGFuc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlICp0aGlzKQoreworICAgIHJldHVybiA2ICsgKDQgKiB0aGlzLT52bGFuc19jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT5zdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dmxhbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52bGFuc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT52bGFuc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgdmxhbnNfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnZsYW5zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQpICogdmxhbnNfY291bnQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdmxhbnNfY291bnQgKiA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlX3BhY2sodGhpcy0+bW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm1vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TUEFSRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVEFHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS50YWcudmxhbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU0xBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUudHJhbnNsYXRpb24uZGVmYXVsdF92bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidHJhbnNsYXRpb25zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9uc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3BhY2soJnRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT51LnRydW5rLmRlZmF1bHRfdmxhbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudHJ1bmsucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudHJ1bmsucGVybWl0dGVkX3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUudHJ1bmsucGVybWl0dGVkX3ZsYW5zW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfQUdHUkVHQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS5hZ2dyZWdhdGUuZGVmYXVsdF92bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0YWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2FnZ3JlZ2F0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfcGFjaygmdGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTktfTURVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwZXJtaXR0ZWRfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX21kdVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX0hZQlJJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUuaHlicmlkLmRlZmF1bHRfdmxhbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGVybWl0dGVkX3ZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9oeWJyaWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9TUEVDSUFMX1RSQU5TUEFSRU5UOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+bW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNQQVJFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyAoOCAqIHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSVU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyAoNCAqIHRoaXMtPnUudHJ1bmsucGVybWl0dGVkX3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX0FHR1JFR0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0YWJsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTktfTURVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9ICg0ICogdGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX0hZQlJJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgKDQgKiB0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfU1BFQ0lBTF9UUkFOU1BBUkVOVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfdW5wYWNrKCZ0aGlzLT5tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNQQVJFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnUudGFnLnZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU0xBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50cmFuc2xhdGlvbi5kZWZhdWx0X3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9uc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJhbnNsYXRpb25fY291bnRfdHJhbnNsYXRpb25zKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRyYW5zbGF0aW9uc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJhbnNsYXRpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9uc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fdW5wYWNrKCZ0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9uc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnUudHJ1bmsuZGVmYXVsdF92bGFuLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX2NvdW50X3Blcm1pdHRlZF92bGFucyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwZXJtaXR0ZWRfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudHJ1bmsucGVybWl0dGVkX3ZsYW5zID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX0FHR1JFR0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS5hZ2dyZWdhdGUuZGVmYXVsdF92bGFuLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGFibGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9hZ2dyZWdhdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSVU5LX01EVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX21kdV9jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwZXJtaXR0ZWRfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX21kdVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfSFlCUklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT51Lmh5YnJpZC5kZWZhdWx0X3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2h5YnJpZF9jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwZXJtaXR0ZWRfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2h5YnJpZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfU1BFQ0lBTF9UUkFOU1BBUkVOVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlIG1vZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZV91bnBhY2soJm1vZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChtb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYW5zbGF0aW9uc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh0cmFuc2xhdGlvbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSVU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfQUdHUkVHQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IHRhYmxlc19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZ0YWJsZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSkgKiB0YWJsZXNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRhYmxlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTktfTURVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX0hZQlJJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1NQRUNJQUxfVFJBTlNQQVJFTlQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJhbnNsYXRpb25fY291bnRfdHJhbnNsYXRpb25zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfbWR1X2NvdW50X3Blcm1pdHRlZF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2h5YnJpZF9jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZF9wYWNrKHRoaXMtPmZpZWxkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmllbGQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5kYS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuZGEub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LnNhLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5zYS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1ZMQU5fUFJJOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmxhbl9wcmkucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudmxhbl9wcmkudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnZsYW5fcHJpLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnZsYW5faWQucmVzZXJ2ZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnZsYW5faWQudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnZsYW5faWQub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9FVEhfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmV0aF90eXBlLnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5ldGhfdHlwZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuZXRoX3R5cGUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9ERVNUX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVzdF9pcC5yZXNlcnZlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuZGVzdF9pcC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuZGVzdF9pcC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9JUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNvdXJjZV9pcC5yZXNlcnZlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuc291cmNlX2lwLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5zb3VyY2VfaXAub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXBfdHlwZS5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcF90eXBlLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF90eXBlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXBfdG9zLnJlc2VydmVkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmlwX3Rvcy52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuaXBfdG9zLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfUFJFQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwX3ByZWMucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXBfcHJlYy52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuaXBfcHJlYy5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc291cmNlX3BvcnQucmVzZXJ2ZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNvdXJjZV9wb3J0LnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5zb3VyY2VfcG9ydC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlc3RfcG9ydC5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVzdF9wb3J0LnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5kZXN0X3BvcnQub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcF92ZXIucmVzZXJ2ZWQsIDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmlwX3Zlci52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuaXBfdmVyLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfRkxPV19MQUJFTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwX2Zsb3dfbGFiZWwucmVzZXJ2ZWQsIDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pcF9mbG93X2xhYmVsLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF9mbG93X2xhYmVsLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuZHN0X2lwdjYudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmRzdF9pcHY2Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuc3JjX2lwdjYudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNyY19pcHY2Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuZHN0X2lwdjZwcmUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmRzdF9pcHY2cHJlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuc3JjX2lwdjZwcmUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNyY19pcHY2cHJlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfTlhUX0hEUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm54dF9oZHIucmVzZXJ2ZWQsIDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm54dF9oZHIudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51Lm54dF9oZHIub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZWYudmFsLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5kZWYub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+ZmllbGQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9QUkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9FVEhfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9ERVNUX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9JUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RPUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9QUkVDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX0ZMT1dfTEFCRUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RTVF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TUkNfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2UFJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9OWFRfSERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGRfdW5wYWNrKCZ0aGlzLT5maWVsZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmZpZWxkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZGEudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRhLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5zYS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuc2Eub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX1BSSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUudmxhbl9wcmkucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUudmxhbl9wcmkudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LnZsYW5fcHJpLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUudmxhbl9pZC5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUudmxhbl9pZC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUudmxhbl9pZC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0VUSF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5ldGhfdHlwZS5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZXRoX3R5cGUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmV0aF90eXBlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9JUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVzdF9pcC5yZXNlcnZlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZGVzdF9pcC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuZGVzdF9pcC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9JUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc291cmNlX2lwLnJlc2VydmVkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5zb3VyY2VfaXAudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LnNvdXJjZV9pcC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwX3R5cGUucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaXBfdHlwZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuaXBfdHlwZS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RPUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXBfdG9zLnJlc2VydmVkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwX3Rvcy52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuaXBfdG9zLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfUFJFQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXBfcHJlYy5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcF9wcmVjLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF9wcmVjLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnNvdXJjZV9wb3J0LnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zb3VyY2VfcG9ydC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuc291cmNlX3BvcnQub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9ERVNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlc3RfcG9ydC5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVzdF9wb3J0LnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5kZXN0X3BvcnQub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwX3Zlci5yZXNlcnZlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaXBfdmVyLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF92ZXIub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9GTE9XX0xBQkVMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcF9mbG93X2xhYmVsLnJlc2VydmVkLCAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuaXBfZmxvd19sYWJlbC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuaXBfZmxvd19sYWJlbC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RTVF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LmRzdF9pcHY2LnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5kc3RfaXB2Ni5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LnNyY19pcHY2LnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5zcmNfaXB2Ni5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RTVF9JUFY2UFJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LmRzdF9pcHY2cHJlLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5kc3RfaXB2NnByZS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2UFJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LnNyY19pcHY2cHJlLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5zcmNfaXB2NnByZS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX05YVF9IRFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm54dF9oZHIucmVzZXJ2ZWQsIDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm54dF9oZHIudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51Lm54dF9oZHIub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlZi52YWwsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRlZi5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkIGZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZF91bnBhY2soJmZpZWxkLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9QUkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRVRIX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9ERVNUX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RPUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1BSRUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TT1VSQ0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9GTE9XX0xBQkVMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RTVF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TUkNfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2UFJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9OWFRfSERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmVjZWRlbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5xdWV1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cHJpX21hcmtpbmcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y2xhdXNlc19jb3VudCA+IDApICYmICh0aGlzLT5jbGF1c2VzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2xhdXNlc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV9wYWNrKCZ0aGlzLT5jbGF1c2VzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPmNsYXVzZXNfY291bnQgPiAwKSAmJiAodGhpcy0+Y2xhdXNlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2xhdXNlc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNsYXVzZXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByZWNlZGVuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT5xdWV1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT5wcmlfbWFya2luZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT5jbGF1c2VzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmNsYXVzZXNfY291bnQgPiAwKSAmJiAodGhpcy0+Y2xhdXNlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2xhdXNlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5jbGF1c2VzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmNsYXVzZXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfdW5wYWNrKCZ0aGlzLT5jbGF1c2VzW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGNsYXVzZXNfY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSkgKiBjbGF1c2VzX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBjbGF1c2VzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbl9wYWNrKHRoaXMtPm9wZXJhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZGVsZXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc1tpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9BREQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9hZGRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zW2kxXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fTElTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFuc1tpMl0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5vcGVyYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9BREQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFuc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+b3BlcmF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2RlbGV0ZV9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZGVsZXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFucyA9IChiY21vc192bGFuX3RhZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9zX3ZsYW5fdGFnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQUREOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9hZGRfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibXVsdGljYXN0X3ZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2FkZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnMgPSAoYmNtb3Nfdmxhbl90YWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCAqIHNpemVvZihiY21vc192bGFuX3RhZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zW2kxXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fTElTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2xpc3RfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zID0gKGJjbW9zX3ZsYW5fdGFnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9zX3ZsYW5fdGFnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFuc1tpMl0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3Zfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb24gb3BlcmF0aW9uOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fdW5wYWNrKCZvcGVyYXRpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGVyYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9zX3ZsYW5fdGFnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9BREQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vc192bGFuX3RhZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb3Nfdmxhbl90YWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZGVsZXRlX2NvdW50X211bHRpY2FzdF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfYWRkX2NvdW50X211bHRpY2FzdF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfbGlzdF9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPmlwdHZfdXNlcl92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPmlwdHZfdXNlcl92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV9wYWNrKHRoaXMtPnRhZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dGFnX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX0RPX05PVF9TVFJJUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZX0lQVFY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2Vfc3RyaXBfZGF0YV9xdWVyeV9pcHR2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFuc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnlfcGFjaygmdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dGFnX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX0RPX05PVF9TVFJJUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZX0lQVFY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg0ICogdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGVfdW5wYWNrKCZ0aGlzLT50YWdfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnRhZ19tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9ET19OT1RfU1RSSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWV9JUFRWOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2Vfc3RyaXBfZGF0YV9xdWVyeV9pcHR2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5X3VucGFjaygmdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgdGFnX21vZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV91bnBhY2soJnRhZ19tb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGFnX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX0RPX05PVF9TVFJJUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZX0lQVFY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBtdWx0aWNhc3RfdmxhbnNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbXVsdGljYXN0X3ZsYW5zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5KSAqIG11bHRpY2FzdF92bGFuc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBtdWx0aWNhc3RfdmxhbnNfY291bnQgKiA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5ncm91cF9tYWNfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+aXBzb3VyY2VfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+aXBzb3VyY2VfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPmlwbXVsdGljYXN0X2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT5pcG11bHRpY2FzdF9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPmlwdjZtdWx0aWNhc3RfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY2X2FkZHJlc3MoYnVmLCAmdGhpcy0+aXB2Nm11bHRpY2FzdF9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+aXBzb3VyY2VfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY2X2FkZHJlc3MoYnVmLCAmdGhpcy0+aXBzb3VyY2VfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDI0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX09OTFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfbWFjX29ubHkudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19vbmx5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3BhY2soJnRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3BhY2soJnRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllc1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNFNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY0c2FcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYV9wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBQTFVTX01DQVNUX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkX3BhY2soJnRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX0lQVjZQTFVTX01DQVNUX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3BhY2soJnRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNlNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY2c2FcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYV9wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc1tpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfT05MWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwICogdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgxMCAqIHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjRTQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEyICogdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwICogdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX0lQVjZQTFVTX01DQVNUX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgyMCAqIHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjZTQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDI0ICogdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX09OTFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZGFfbWFjX29ubHkudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19vbmx5X2NvdW50X2VudHJpZXMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfb25seVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seV91bnBhY2soJnRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX3ZsYW5faWRfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c192bGFuX2lkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3VucGFjaygmdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjRTQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY0c2FfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfaXB2NHNhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3VucGFjaygmdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBQTFVTX01DQVNUX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkX2NvdW50X2VudHJpZXMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF91bnBhY2soJnRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBWNlBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3VucGFjaygmdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjZTQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY2c2FfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfaXB2NnNhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3VucGFjaygmdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNbaTVdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlIHR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19PTkxZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbnRyaWVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZW50cmllc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNFNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX0lQUExVU19NQ0FTVF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBWNlBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbnRyaWVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZW50cmllc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNlNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX29ubHlfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY0c2FfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY2c2FfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPndycl93ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+d3JyX3dlaWdodCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY19wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT52bGFuX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfZmlsdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19maWx0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzX3BhY2sodGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC5zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQucmVhc29uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uX3BhY2sodGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24uc3RhcnRfb3Jfc3RvcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi51c2VyX25hbWUsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi5wYXNzd29yZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZV9wYWNrKHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5lbmQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZW5kLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIudmVuZG9yX2lkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5vbnVfbW9kZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIub251X21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5od3ZlcnNpb24sIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIuc3d2ZXJzaW9uLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5leHRfb251X21vZGVsLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpcm13YXJlX3ZlcnNpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV92ZXJzaW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uLCB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DSElQU0VUX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNoaXBzZXRfaWQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5jaGlwc2V0X2lkLnZlbmRvcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuY2hpcHNldF9pZC5jaGlwX21vZGVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNoaXBzZXRfaWQucmV2aXNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2hpcHNldF9pZC5kZXNpZ25fZGF0ZSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzX3BhY2sodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5zZXJ2aWNlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9nZXBvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5nZWJpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fZmVwb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEuZmViaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX3BvdHNfcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2UxcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX3Vwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5tYXhfcXVldWVzX3Blcl9wb3J0X3VwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5tYXhfcXVldWVzX3Blcl9wb3J0X2Rvd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEuYmF0dGVyeV9iYWNrdXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT1BUSUNBTF9UUkFOU0NFSVZFUl9ESUFHTk9TSVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMudHJhbnNjZWl2ZXJfdGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnN1cHBseV92Y2MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnR4X2JpYXNfY3VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy50eF9wb3dlcl9vdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnJ4X3Bvd2VyX2luKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NFUlZJQ0VfU0xBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9wYWNrKCZ0aGlzLT51LnNlcnZpY2Vfc2xhLnNlcnZpY2Vfc2xhLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGVfcGFjayh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLm9udV90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIubnVtX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZV9wYWNrKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIucHJvdGVjdGlvbl90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIubnVtX3Bvbl9pZnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIubnVtX3Nsb3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRlcmZhY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X2NhcGFiaWxpdGllczJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfcGFjaygmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmJhdHRlcnlfYmFja3VwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0hPTERPVkVSX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2sodGhpcy0+dS5ob2xkb3Zlcl9jb25maWcuaG9sZG92ZXJfc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLmhvbGRvdmVyX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVhVX01BTkFHRV9HTE9CQUxfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3BhY2soJnRoaXMtPnUubXh1X21hbmFnZV9nbG9iYWxfcGFyYW1ldGVyLnBhcmFtcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX1NOTVBfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9wYWNrKCZ0aGlzLT51Lm14dV9tYW5hZ2Vfc25tcF9wYXJhbWV0ZXIucGFyYW1zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FDVElWRV9QT05fSUZBRE1JTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLnBvbl9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLmlzX2lwdjZhd2FyZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlX3BhY2sodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy5wb3dlcl9jb250cm9sX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy5zZXJ2aWNlX3NsYSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUubGlua19zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX3BvcnRfcGF1c2Uud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZXRoX3BvcnRfcGF1c2Uud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZXRoX3BvcnRfcGF1c2UuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QT0xJQ0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfcGFjaygmdGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy5jb25maWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WT0lQX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZvaXBfcG9ydC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52b2lwX3BvcnQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUudm9pcF9wb3J0LnBvcnRfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRTFQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5lMXBvcnQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZTFwb3J0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmUxcG9ydC5wb3J0X3N0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX0RPV05fUkFURV9MSU1JVElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcucmF0ZV9saW1pdGluZ19lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcuY2lyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcucGlyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Qud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2sodGhpcy0+dS5wb3J0X2xvb3BfZGV0ZWN0LnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmxhbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52bGFuLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3BhY2soJnRoaXMtPnUudmxhbi52bGFuX2luZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DTEFTU0lGSUNBVElPTl9BTkRfTUFSS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb25fcGFjayh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX3BhY2soJnRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3BhY2soJnRoaXMtPnUubXVsdGljYXN0X3ZsYW4udmxhbl9pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1RBR19PUEVSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfcGFjaygmdGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi50YWdfb3BlcmF0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZV9wYWNrKHRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC5tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpY2FzdF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3BhY2soJnRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9HUk9VUF9NQVg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lmdyb3VwX21heC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5ncm91cF9tYXgud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmdyb3VwX21heC5tYXhfZ3JvdXBzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBU1RfTEVBVkVfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2RlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmYXN0X2xlYXZlX21vZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmFzdF9sZWF2ZV9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc1tpMl0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBU1RfTEVBVkVfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2sodGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTExJRF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsbGlkX3F1ZXVlX3RhYmxlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbGxpZF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlX3BhY2soJnRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZVtpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24uaWFkX21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2xfcGFjayh0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi5wcm90b2NvbF9zdXBwb3J0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLmlhZF9zb2Z0d2FyZV92ZXIsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi5pYWRfc29mdHdhcmVfdGltZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLnZvaXBfdXNlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WT0lQX0dMT0JBTF9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlX3BhY2sodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX2lwbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLmlhZF9pcGFkZHIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX25ldF9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLmlhZF9kZWZhdWx0X2d3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZV9wYWNrKHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5wcHBvZV9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5wcHBvZV91c2VybmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5wcHBvZV9wYXNzd29yZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGVfcGFjayh0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudGFnZ2luZ19tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudm9pY2VfY3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudm9pY2Vfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9wcmkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFBBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMubWdwb3J0X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMubWdjX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ2NfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmJhY2t1cF9tZ2NfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmJhY2t1cF9tZ2NfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy51c2VfYWN0aXZlX21nYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZV9wYWNrKHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMucmVnX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5taWQsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlX3BhY2sodGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5oZWFydGJlYXRfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5oZWFydGJlYXRfY3ljbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuaGVhcnRiZWF0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhVU0VSX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLm5hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi5udW1fcnRwX3RpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi5wcmVmaXgsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLmRpZ2l0X2JlZ2luKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlX3BhY2sodGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLnJ0cF90aWRfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucnRwX3RpZF9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi5udW1fcnRwX3RpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24uZmlyc3RfcnRwX3RpZF9uYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5tZ3BvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX3Byb3h5X3NlcnZlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYWN0aXZlX3NpcF9yZWdpc3RyYXRpb25fc2VydmVyX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX3JlZ2lzdHJhdGlvbl9zZXJ2ZXJfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfcmVnX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX3JlZ19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMub3V0Ym91bmRfc2VydmVyX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5vdXRib3VuZF9zZXJ2ZXJfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuc2lwX3JlZ2lzdHJhdGlvbl9pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmRpc2FibGVfaGVhcnRiZWF0X3N3aXRjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuaGVhcnRiZWF0X2N5Y2xlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5oZWFydGJlYXRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX1VTRVJfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2lwX3VzZXJfcGFyYW1ldGVycy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLmFjY291bnQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMubmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2lwX3VzZXJfcGFyYW1ldGVycy5wYXNzd29yZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFYX01PREVNX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGVfcGFjayh0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLnZvaWNlX3QzOGVuYWJsZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZV9wYWNrKHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24udm9pY2VfZmF4X21vZGVtX2NvbnRyb2wsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4SUFEX09QRVJBVElPTl9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXNfcGFjayh0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy5pYWRfb3BlcmF0aW9uX3N0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPVFNfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wb3RzX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3RzX3N0YXR1cy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfcGFjayh0aGlzLT51LnBvdHNfc3RhdHVzLmlhZF9wb3J0X3N0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZV9wYWNrKHRoaXMtPnUucG90c19zdGF0dXMuaWFkX3BvcnRfc2VydmljZV9zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZV9wYWNrKHRoaXMtPnUucG90c19zdGF0dXMuaWFkX3BvcnRfY29kZWNfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9PUEVSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmlhZF9vcGVyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3BhY2sodGhpcy0+dS5pYWRfb3BlcmF0aW9uLmlhZF9vcGVyYXRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zaXBfZGlnaXRfbWFwLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXAgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2lwX2RpZ2l0YWxfbWFwXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2lwX2RpZ2l0X21hcFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwLCB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLmlkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2sodGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS5jb25maWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3BhY2sodGhpcy0+dS5hbGFybV90aHJlc2hvbGQuaWQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLnRocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmNsZWFyaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WRVJTSU9OX1NFUlZFUl9QQVJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmlwYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS5pcG1hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuZ2F0ZXdheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnZsYW5faWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS51c2VyX25hbWUsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS5wYXNzd29yZCwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmFjdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnZlcnNpb25fbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyMW5hbWUsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyMm5hbWUsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyM25hbWUsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9tYWNfbGltaXQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9tYWNfbGltaXQubWFjX2xpbWl0X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUubWFjX2FnaW5nX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl9wYWNrKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzID4gMCkgJiYgKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3BvcnRfbWFjX2ZpbHRlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIubnVtYmVyX29mX2VudHJpZXM7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfcGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLmNsYXVzZVtpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl9wYWNrKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5udW1iZXJfb2ZfZW50cmllcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLm51bWJlcl9vZl9lbnRyaWVzID4gMCkgJiYgKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcuY2xhdXNlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9wb3J0X21hY19iaW5kaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfcGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5jbGF1c2VbaTVdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19TVEFUSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTY7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb25fcGFjayh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5udW1iZXJfb2ZfZW50cmllcyA+IDApICYmICh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMuY2xhdXNlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9wb3J0X21hY19zdGF0aWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzOyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3BhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5jbGF1c2VbaTZdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QRVJGT1JNQU5DRV9TVEFUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5vY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5udWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZmluZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0b2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dHVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRudWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dGRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LnJlc2VydmVkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0lTT0xBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9pc29sYXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9pc29sYXRlLnBvcnRfaXNvbGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FERFJFU1NfVEFCTEVfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnkud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX0RPV05TVFJFQU1fU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcucG9ubWFjZHNyYXRlbGltaXRpbmdlbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5jYnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfVVNEU0JVRkZFUl9DQVBBQklMSVRZX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZV9wYWNrKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LmJ1ZmZlcl9tYW5hZ2VtZW50X2NhcGFiaWxpdHksIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LmRzYnVmZmVyX3NpemVfbWluaW11bV92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LmRzYnVmZmVyX3NpemVfbWF4aW11bV92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LnVzYnVmZmVyX3NpemVfbWluaW11bV92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LnVzYnVmZmVyX3NpemVfbWF4aW11bV92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci5idWZmZXJfbWFuYWdlbWVudF9pbmRpY2F0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uX3BhY2sodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLmJ1ZmZlcl9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09MTEVDVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC5zdGF0aXN0aWNzX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC5zdGF0aXN0aWNzX2ludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC5zdGF0aXN0aWNzX2R1cmF0aW9uX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT1VOVEVSX1JFU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb3VudGVyX3Jlc2V0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZV9wYWNrKHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb3VudGVyX3Jlc2V0LnN0YXRpc3RpY3NfcmVzZXQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9GTFVYX1NUQVRJU1RJQ1NfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci51bmlmbG93c3RhdGlzdGljc2NvbGxlY3Rjb250cm9saW5kaWNhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmlub2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmludWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmlubnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZpbmRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmluZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dG9jdGV0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXR1Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0bnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRkaXNjYXJkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRlcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLnBvbnBvcnRudW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZV9wYWNrKHRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi5tYWluX2xpZ2h0X2luZGljYXRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3BhY2sodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLnJlc2VydmVfbGlnaHRfaW5kaWNhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9MSUdIVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGVfcGFjayh0aGlzLT51Lm9udV9saWdodF9jb250cm9sLm1hdGNoX21hY19hZGRyZXNzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wucG9uX21hY19hZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZV9wYWNrKHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9saWdodF9jb250cm9sLmR1cmF0aW9uX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5mcmFtZXNfdHJhbnNtaXR0ZWRvaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5vY3RldHNfdHJhbnNtaXR0ZWRvaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5tdWx0aWNhc3RfZnJhbWVzeG1pdHRlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5icm9hZGNhc3RfZnJhbWVzeG1pdHRlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5mcmFtZXNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEub2N0ZXRzX3JlY2VpdmVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLm11bHRpY2FzdF9mcmFtZXNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuYnJvYWRjYXN0X2ZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLmNyYzhlcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuZmVjX2NvcnJlY3RlZF9ibG9ja3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuZmVjX3VuY29ycmVjdGFibGVfYmxvY2tzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfbWFjX2N0cmxfZnJhbWVzX3RyYW5zbWl0dGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfbWFjX2N0cmxfZnJhbWVzX3JlY2VpdmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfdHhfcmVnaXN0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF90eF9yZWdyZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfdHhfcmVwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfcnhfZ2F0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX3J4X3JlZ2lzdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hbGFybV9jb25maWcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWxhcm1fY29uZmlnLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfcGFjayh0aGlzLT51LmFsYXJtX2NvbmZpZy5hbGFybV9jb25maWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9ST1VHVUVfT05VX0VYQ0xfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucm91Z3VlX29udV9leGNsX2FiaWxpdHkud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucm91Z3VlX29udV9leGNsX2FiaWxpdHkud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5X3BhY2sodGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS5hYmlsaXR5LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NhcGFiaWxpdGllcy5zbGVlcF9tb2RlX2NhcGFiaWxpdHksIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLmVhcmx5X3dha2VfdXBfY2FwYWJpbGl0eSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLmVhcmx5X3dha2VfdXAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy5zbGVlcF9kdXJhdGlvbl9tYXgsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BST1RFQ1RJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy5vcHRpY2FsX2xvc190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLm1hY19sb3NfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QT1JUX0RJU0FCTEVfT05fTE9PUF9ERVRFQ1RFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGVfcGFjayh0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUubWFjX2FnaW5nX3RpbWUuYWdpbmdfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXNfcGFjayh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLm1vbml0b3Jpbmdfc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLm1vbml0b3JpbmdfcGVyaW9kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfQ1VSUkVOVF9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfVFhfUE9XRVJfU1VQUExZX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV90eF9wb3dlcl9zdXBwbHlfY29udHJvbC5hY3Rpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUub251X3R4X3Bvd2VyX3N1cHBseV9jb250cm9sLm9udV9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUub251X3R4X3Bvd2VyX3N1cHBseV9jb250cm9sLm9wdF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DSElQU0VUX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09QVElDQUxfVFJBTlNDRUlWRVJfRElBR05PU0lTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0VSVklDRV9TTEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2VydmljZV9zbGEuc2VydmljZV9zbGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTEgKyAoNiAqIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IT0xET1ZFUl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfR0xPQkFMX1BBUkFNRVRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubXh1X21hbmFnZV9nbG9iYWxfcGFyYW1ldGVyLnBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX1NOTVBfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubXh1X21hbmFnZV9zbm1wX3BhcmFtZXRlci5wYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUNUSVZFX1BPTl9JRkFETUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX0xJTktfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QT0xJQ0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy5jb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FMVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX0RPV05fUkFURV9MSU1JVElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS52bGFuLnZsYW5faW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DTEFTU0lGSUNBVElPTl9BTkRfTUFSS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi52bGFuX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1RBR19PUEVSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi50YWdfb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm11bHRpY2FzdF9jb250cm9sLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDUgKyAoNCAqIHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTExJRF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg0ICogdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3MzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfR0xPQkFMX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhVU0VSX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX1VTRVJfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBWF9NT0RFTV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4SUFEX09QRVJBVElPTl9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPVFNfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX0RJR0lUX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcF9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WRVJTSU9OX1NFUlZFUl9QQVJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDgxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19BR0lOR19USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyAoOCAqIHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgKDggKiB0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLm51bWJlcl9vZl9lbnRyaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19TVEFUSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMyArICg4ICogdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QRVJGT1JNQU5DRV9TVEFUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDExMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0lTT0xBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUREUkVTU19UQUJMRV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfRE9XTlNUUkVBTV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSX0NBUEFCSUxJVFlfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT1VOVEVSX1JFU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9GTFVYX1NUQVRJU1RJQ1NfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9MSUdIVF9FWENFUFRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9MSUdIVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1JPVUdVRV9PTlVfRVhDTF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QUk9URUNUSU9OX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfRElTQUJMRV9PTl9MT09QX0RFVEVDVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfQ1VSUkVOVF9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEyOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfSElTVE9SWV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEyOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9UWF9QT1dFUl9TVVBQTFlfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmRlZi51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1c191bnBhY2soJnRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQuc3RhdHVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQucmVhc29uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbl91bnBhY2soJnRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnN0YXJ0X29yX3N0b3AsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24udXNlcl9uYW1lLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnBhc3N3b3JkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlX3VucGFjaygmdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5lbmQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmVuZC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmVuZC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZW5kLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lbmRfY291bnRfdW5rbm93bigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5lbmQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmVuZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5vbnVfbW9kZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5vbnVfbWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5od3ZlcnNpb24sIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLnN3dmVyc2lvbiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLmV4dF9vbnVfbW9kZWwsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX3ZlcnNpb25fY291bnRfZmlybXdhcmVfdmVyc2lvbigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpcm13YXJlX3ZlcnNpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV92ZXJzaW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbiwgdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQ0hJUFNFVF9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuY2hpcHNldF9pZC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuY2hpcHNldF9pZC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNoaXBzZXRfaWQudmVuZG9yX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNoaXBzZXRfaWQuY2hpcF9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNoaXBzZXRfaWQucmV2aXNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmNoaXBzZXRfaWQuZGVzaWduX2RhdGUsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuY2hpcHNldF9pZC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuY2hpcHNldF9pZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfdW5wYWNrKCZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLnNlcnZpY2VzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9nZXBvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLmdlYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2ZlcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEuZmViaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fcG90c19wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9lMXBvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX3Vwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm1heF9xdWV1ZXNfcGVyX3BvcnRfdXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fZG93bnN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5tYXhfcXVldWVzX3Blcl9wb3J0X2Rvd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5iYXR0ZXJ5X2JhY2t1cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09QVElDQUxfVFJBTlNDRUlWRVJfRElBR05PU0lTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnRyYW5zY2VpdmVyX3RlbXBlcmF0dXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnN1cHBseV92Y2MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMudHhfYmlhc19jdXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMudHhfcG93ZXJfb3V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnJ4X3Bvd2VyX2luKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0VSVklDRV9TTEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2VydmljZV9zbGEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNlcnZpY2Vfc2xhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNlcnZpY2Vfc2xhLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV91bnBhY2soJnRoaXMtPnUuc2VydmljZV9zbGEuc2VydmljZV9zbGEsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNlcnZpY2Vfc2xhLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLm9udV90eXBlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLm51bV9saW5rcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLnByb3RlY3Rpb25fdHlwZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5udW1fcG9uX2lmcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLm51bV9zbG90cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfY2FwYWJpbGl0aWVzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV91bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5iYXR0ZXJ5X2JhY2t1cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2NhcGFiaWxpdGllczIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0hPTERPVkVSX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcuaG9sZG92ZXJfc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy5ob2xkb3Zlcl90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX0dMT0JBTF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm14dV9tYW5hZ2VfZ2xvYmFsX3BhcmFtZXRlci5wYXJhbXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX1NOTVBfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV91bnBhY2soJnRoaXMtPnUubXh1X21hbmFnZV9zbm1wX3BhcmFtZXRlci5wYXJhbXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BQ1RJVkVfUE9OX0lGQURNSU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLnBvbl9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy5pc19pcHY2YXdhcmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZV91bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczMucG93ZXJfY29udHJvbF90eXBlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLnNlcnZpY2Vfc2xhKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX0xJTktfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmV0aF9saW5rX3N0YXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9saW5rX3N0YXRlLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aF9saW5rX3N0YXRlLmxpbmtfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9saW5rX3N0YXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX3BvcnRfcGF1c2Uud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZXRoX3BvcnRfcGF1c2Uud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfcGF1c2UuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZXRoX3BvcnRfcGF1c2Uud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLmNvbmZpZywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52b2lwX3BvcnQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZvaXBfcG9ydC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnZvaXBfcG9ydC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudm9pcF9wb3J0LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfcG9ydC5wb3J0X3N0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnZvaXBfcG9ydC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudm9pcF9wb3J0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FMVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZTFwb3J0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5lMXBvcnQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5lMXBvcnQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmUxcG9ydC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lMXBvcnQucG9ydF9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5lMXBvcnQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmUxcG9ydC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLnJhdGVfbGltaXRpbmdfZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcuY2lyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5waXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Qud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Qud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Quc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Qud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Qud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUudmxhbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmxhbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnZsYW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnZsYW4ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3VucGFjaygmdGhpcy0+dS52bGFuLnZsYW5faW5mbywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS52bGFuLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS52bGFuLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DTEFTU0lGSUNBVElPTl9BTkRfTUFSS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5vcCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2NsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX3VucGFjaygmdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc1tpMV0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpY2FzdF92bGFuLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpY2FzdF92bGFuLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3VucGFjaygmdGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi52bGFuX2luZm8sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpY2FzdF92bGFuLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLnRhZ19vcGVyYXRpb24sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfU1dJVENIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpY2FzdF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpY2FzdF9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF91bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpY2FzdF9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9HUk9VUF9NQVg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ3JvdXBfbWF4LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ncm91cF9tYXgud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5ncm91cF9tYXgud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lmdyb3VwX21heC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ3JvdXBfbWF4Lm1heF9ncm91cHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZ3JvdXBfbWF4LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ncm91cF9tYXgud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBU1RfTEVBVkVfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCA+IDApICYmICh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmFzdF9sZWF2ZV9tb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zhc3RfbGVhdmVfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzID0gKHVpbnQzMl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzX2NvdW50ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc1tpMl0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGxpZF9xdWV1ZV90YWJsZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2xsaWRfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZSA9IChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlX3VucGFjaygmdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlW2kzXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9JQURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLmlhZF9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sX3VucGFjaygmdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ucHJvdG9jb2xfc3VwcG9ydCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi5pYWRfc29mdHdhcmVfdmVyLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLmlhZF9zb2Z0d2FyZV90aW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi52b2lwX3VzZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfR0xPQkFMX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZV91bnBhY2soJnRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9pcG1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX2lwYWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLmlhZF9uZXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLmlhZF9kZWZhdWx0X2d3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZV91bnBhY2soJnRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5wcHBvZV9tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5wcHBvZV91c2VybmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMucHBwb2VfcGFzc3dvcmQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlX3VucGFjaygmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnRhZ2dpbmdfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9jdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX3N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9wcmkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFBBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMubWdwb3J0X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ2NfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMubWdjX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmJhY2t1cF9tZ2NfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuYmFja3VwX21nY19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMudXNlX2FjdGl2ZV9tZ2MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGVfdW5wYWNrKCZ0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLnJlZ19tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMubWlkLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV91bnBhY2soJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuaGVhcnRiZWF0X21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jeWNsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5oMjQ4cGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhVU0VSX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi5uYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi5udW1fcnRwX3RpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucHJlZml4LCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLmRpZ2l0X2JlZ2luKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlX3VucGFjaygmdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLnJ0cF90aWRfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLnJ0cF90aWRfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ubnVtX3J0cF90aWRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi5maXJzdF9ydHBfdGlkX25hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMubWdwb3J0X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYmFja3VwX3NpcF9pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcHJveHlfc2VydmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcmVnaXN0cmF0aW9uX3NlcnZlcl9pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX3JlZ2lzdHJhdGlvbl9zZXJ2ZXJfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYmFja3VwX3NpcF9yZWdfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYmFja3VwX3NpcF9yZWdfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMub3V0Ym91bmRfc2VydmVyX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLm91dGJvdW5kX3NlcnZlcl9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLnNpcF9yZWdpc3RyYXRpb25faW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmRpc2FibGVfaGVhcnRiZWF0X3N3aXRjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5oZWFydGJlYXRfY3ljbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuaGVhcnRiZWF0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX1VTRVJfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuc2lwX3VzZXJfcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2lwX3VzZXJfcGFyYW1ldGVycy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLmFjY291bnQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLm5hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLnBhc3N3b3JkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVhfTU9ERU1fQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGVfdW5wYWNrKCZ0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLnZvaWNlX3QzOGVuYWJsZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3VucGFjaygmdGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi52b2ljZV9mYXhfbW9kZW1fY29udHJvbCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4SUFEX09QRVJBVElPTl9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy5pYWRfb3BlcmF0aW9uX3N0YXR1cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPVFNfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wb3RzX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wb3RzX3N0YXR1cy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzX3VucGFjaygmdGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZV91bnBhY2soJnRoaXMtPnUucG90c19zdGF0dXMuaWFkX3BvcnRfc2VydmljZV9zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlX3VucGFjaygmdGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9jb2RlY19tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wb3RzX3N0YXR1cy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucG90c19zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9PUEVSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmlhZF9vcGVyYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmlhZF9vcGVyYXRpb24ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT51LmlhZF9vcGVyYXRpb24uaWFkX29wZXJhdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX0RJR0lUX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zaXBfZGlnaXRfbWFwLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zaXBfZGlnaXRfbWFwLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNpcF9kaWdpdGFsX21hcFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3NpcF9kaWdpdF9tYXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwLCB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3VucGFjaygmdGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS5pZCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS5jb25maWcsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hbGFybV9hZG1pbl9zdGF0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF91bnBhY2soJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmlkLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hbGFybV90aHJlc2hvbGQudGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsYXJtX3RocmVzaG9sZC5jbGVhcmluZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZFUlNJT05fU0VSVkVSX1BBUkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmlwYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmlwbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmdhdGV3YXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnZsYW5faWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudXNlcl9uYW1lLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnBhc3N3b3JkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS5hY3Rpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnZlcnNpb25fbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnZlcjFuYW1lLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIybmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyM25hbWUsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X21hY19saW1pdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9tYWNfbGltaXQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9tYWNfbGltaXQud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbWFjX2xpbWl0Lm1hY19saW1pdF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19BR0lOR19USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19hZ2luZ190aW1lLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X21hY19hZ2luZ190aW1lLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUubWFjX2FnaW5nX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X21hY19hZ2luZ190aW1lLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5vcCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllcyA+IDApICYmICh0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIuY2xhdXNlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3BvcnRfbWFjX2ZpbHRlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIuY2xhdXNlID0gKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllcyAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIubnVtYmVyX29mX2VudHJpZXM7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIuY2xhdXNlW2k0XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLm9wLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMgPiAwKSAmJiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcG9ydF9tYWNfYmluZGluZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLmNsYXVzZSA9IChiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLm51bWJlcl9vZl9lbnRyaWVzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLmNsYXVzZVtpNV0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX1NUQVRJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm9wLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzID4gMCkgJiYgKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcG9ydF9tYWNfc3RhdGljXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5jbGF1c2UgPSAoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTYgPSAwOyBpNiA8IHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5udW1iZXJfb2ZfZW50cmllczsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5jbGF1c2VbaTZdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUEVSRk9STUFOQ0VfU1RBVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZmlub2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbm51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbmRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRvY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXR1Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRudWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0ZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRlcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LnJlc2VydmVkMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfSVNPTEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3J0X2lzb2xhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X2lzb2xhdGUucG9ydF9pc29sYXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUREUkVTU19UQUJMRV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX0RPV05TVFJFQU1fU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5wb25tYWNkc3JhdGVsaW1pdGluZ2VuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcuY2lyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5jYnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVJfQ0FQQUJJTElUWV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS5idWZmZXJfbWFuYWdlbWVudF9jYXBhYmlsaXR5LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkuZHNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS5kc2J1ZmZlcl9zaXplX21heGltdW1fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LnVzYnVmZmVyX3NpemVfbWluaW11bV92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkudXNidWZmZXJfc2l6ZV9tYXhpbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIuYnVmZmVyX21hbmFnZW1lbnRfaW5kaWNhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci5kaXJlY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIuYnVmZmVyX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT0xMRUNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC5zdGF0aXN0aWNzX2FjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wuc3RhdGlzdGljc19pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC5zdGF0aXN0aWNzX2R1cmF0aW9uX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPVU5URVJfUkVTRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb3VudGVyX3Jlc2V0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQuc3RhdGlzdGljc19yZXNldCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb3VudGVyX3Jlc2V0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci51bmlmbG93c3RhdGlzdGljc2NvbGxlY3Rjb250cm9saW5kaWNhdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZpbm9jdGV0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmludWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5udWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5kaXNjYXJkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmluZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0b2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0dWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0bnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dGRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0ZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi5wb25wb3J0bnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ubWFpbl9saWdodF9pbmRpY2F0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3VucGFjaygmdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLnJlc2VydmVfbGlnaHRfaW5kaWNhdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9saWdodF9jb250cm9sLm1hdGNoX21hY19hZGRyZXNzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9saWdodF9jb250cm9sLnBvbl9tYWNfYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9saWdodF9jb250cm9sLmFjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wuZHVyYXRpb25fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmZyYW1lc190cmFuc21pdHRlZG9rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEub2N0ZXRzX3RyYW5zbWl0dGVkb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5tdWx0aWNhc3RfZnJhbWVzeG1pdHRlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmJyb2FkY2FzdF9mcmFtZXN4bWl0dGVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuZnJhbWVzX3JlY2VpdmVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEub2N0ZXRzX3JlY2VpdmVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEubXVsdGljYXN0X2ZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmJyb2FkY2FzdF9mcmFtZXNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuY3JjOGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLmZlY19jb3JyZWN0ZWRfYmxvY2tzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuZmVjX3VuY29ycmVjdGFibGVfYmxvY2tzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9tYWNfY3RybF9mcmFtZXNfdHJhbnNtaXR0ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX21hY19jdHJsX2ZyYW1lc19yZWNlaXZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfdHhfcmVnaXN0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX3R4X3JlZ3JlcXVlc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX3R4X3JlcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfcnhfZ2F0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfcnhfcmVnaXN0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWxhcm1fY29uZmlnLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hbGFybV9jb25maWcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hbGFybV9jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZV91bnBhY2soJnRoaXMtPnUuYWxhcm1fY29uZmlnLmFsYXJtX2NvbmZpZywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuYWxhcm1fY29uZmlnLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hbGFybV9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1JPVUdVRV9PTlVfRVhDTF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5X3VucGFjaygmdGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS5hYmlsaXR5LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucm91Z3VlX29udV9leGNsX2FiaWxpdHkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NhcGFiaWxpdGllcy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NhcGFiaWxpdGllcy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLnNsZWVwX21vZGVfY2FwYWJpbGl0eSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NhcGFiaWxpdGllcy5lYXJseV93YWtlX3VwX2NhcGFiaWxpdHksICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NhcGFiaWxpdGllcy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLmVhcmx5X3dha2VfdXAsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy5zbGVlcF9kdXJhdGlvbl9tYXgsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUFJPVEVDVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy5vcHRpY2FsX2xvc190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMubWFjX2xvc190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfRElTQUJMRV9PTl9MT09QX0RFVEVDVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01BQ19BR0lOR19USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tYWNfYWdpbmdfdGltZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5tYWNfYWdpbmdfdGltZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1hY19hZ2luZ190aW1lLmFnaW5nX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzX3VucGFjaygmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy5tb25pdG9yaW5nX3N0YXR1cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMubW9uaXRvcmluZ19wZXJpb2QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX0NVUlJFTlRfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDExKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9UWF9QT1dFUl9TVVBQTFlfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHdpZHRoID0gMDsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1Ziwgd2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wuYWN0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3R4X3Bvd2VyX3N1cHBseV9jb250cm9sLm9udV9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wub3B0X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIHdpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5kZWYudW5rbm93biwgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlIGxlYWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZV91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcm13YXJlX3ZlcnNpb25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaXJtd2FyZV92ZXJzaW9uX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZmlybXdhcmVfdmVyc2lvbl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NISVBTRVRfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PUFRJQ0FMX1RSQU5TQ0VJVkVSX0RJQUdOT1NJUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0VSVklDRV9TTEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDhfdCBpbnRlcmZhY2VzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlKSAqIGludGVyZmFjZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBpbnRlcmZhY2VzX2NvdW50ICogNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSE9MRE9WRVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX0dMT0JBTF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVhVX01BTkFHRV9TTk1QX1BBUkFNRVRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUNUSVZFX1BPTl9JRkFETUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX0xJTktfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUE9MSUNJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WT0lQX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRTFQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX0RPV05fUkFURV9MSU1JVElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NMQVNTSUZJQ0FUSU9OX0FORF9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJ1bGVzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZydWxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUpICogcnVsZXNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHJ1bGVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1RBR19PUEVSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9HUk9VUF9NQVg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmYXN0X2xlYXZlX21vZGVzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MzJfdCkgKiBmYXN0X2xlYXZlX21vZGVzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDhfdCBsbGlkX3F1ZXVlX3RhYmxlX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZsbGlkX3F1ZXVlX3RhYmxlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUpICogbGxpZF9xdWV1ZV90YWJsZV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGxsaWRfcXVldWVfdGFibGVfY291bnQgKiA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WT0lQX0dMT0JBTF9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhQQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFVTRVJfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFYX01PREVNX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QT1RTX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9PUEVSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX0RJR0lUX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDE2X3Qgc2lwX2RpZ2l0YWxfbWFwX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmc2lwX2RpZ2l0YWxfbWFwX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogc2lwX2RpZ2l0YWxfbWFwX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1Ziwgc2lwX2RpZ2l0YWxfbWFwX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkVSU0lPTl9TRVJWRVJfUEFSQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpICogbnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2ZfZW50cmllcyAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2VudHJpZXM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZudW1iZXJfb2ZfZW50cmllcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjKSAqIG51bWJlcl9vZl9lbnRyaWVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbnVtYmVyX29mX2VudHJpZXMgKiA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19TVEFUSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2VudHJpZXM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZudW1iZXJfb2ZfZW50cmllcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjKSAqIG51bWJlcl9vZl9lbnRyaWVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbnVtYmVyX29mX2VudHJpZXMgKiA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QRVJGT1JNQU5DRV9TVEFUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9JU09MQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FERFJFU1NfVEFCTEVfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19ET1dOU1RSRUFNX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSX0NBUEFCSUxJVFlfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09VTlRFUl9SRVNFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9GTFVYX1NUQVRJU1RJQ1NfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9MSUdIVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1JPVUdVRV9PTlVfRVhDTF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BST1RFQ1RJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfQ1VSUkVOVF9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfSElTVE9SWV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9UWF9QT1dFUl9TVVBQTFlfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfdmVyc2lvbl9jb3VudF9maXJtd2FyZV92ZXJzaW9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5lbmRfZG93bmxvYWRfcmVxdWVzdC5maWxlX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZV9wYWNrKHRoaXMtPnUuZW5kX2Rvd25sb2FkX3Jlc3BvbnNlLnJwc19jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmVuZF9kb3dubG9hZF9yZXF1ZXN0LmZpbGVfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlX3VucGFjaygmdGhpcy0+dS5lbmRfZG93bmxvYWRfcmVzcG9uc2UucnBzX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZSBvcGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJnRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9kcm9wX2V2ZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2Ryb3BfZXZlbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX211bHRpY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX3VuZGVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV91bmRlcnNpemVfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9vdmVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9vdmVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYWdtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYWdtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1famFiYmVycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2phYmJlcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczY0b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYW1lczY0b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzNjV0bzEyN29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYW1lczEyOHRvMjU1b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9mcmFtZXM1MTJ0bzEwMjNvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9mcmFtZXMxMDI0dG8xNTE4b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2Rpc2NhcmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5zdGF0dXNfY2hhbmdlX3RpbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZHJvcF9ldmVudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9kcm9wX2V2ZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fbXVsdGljYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fY3JjX2Vycm9yZWRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fY3JjX2Vycm9yZWRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV91bmRlcnNpemVfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fdW5kZXJzaXplX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fb3ZlcnNpemVfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fb3ZlcnNpemVfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFnbWVudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFnbWVudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2phYmJlcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9qYWJiZXJzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXM2NG9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZnJhbWVzNjV0bzEyN29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZnJhbWVzMTI4dG8yNTVvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczI1NnRvNTExb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXM1MTJ0bzEwMjNvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczEwMjR0bzE1MThvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFtZXM2NG9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lczY1dG8xMjdvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lczI1NnRvNTExb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fZnJhbWVzNTEydG8xMDIzb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZXJyb3JzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fZXJyb3JzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+c3RhdHVzX2NoYW5nZV90aW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjk2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpbGVuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfd3JpdGVfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWUsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZV9jb3VudCA+IDApICYmICh0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtb2RlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfd3JpdGVfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZSwgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGF0YS5ibG9ja19udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kYXRhLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kYXRhLmRhdGEsIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYWNrLmJsb2NrX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfRVJST1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZXJyb3IuY29kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVycm9yLm1lc3NhZ2VfY291bnQgPiAwKSAmJiAodGhpcy0+dS5lcnJvci5tZXNzYWdlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1lc3NhZ2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9lcnJvclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVycm9yLm1lc3NhZ2UsIHRoaXMtPnUuZXJyb3IubWVzc2FnZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAodGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lX2NvdW50ICsgMSkgKyAodGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9FUlJPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKHRoaXMtPnUuZXJyb3IubWVzc2FnZV9jb3VudCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfd3JpdGVfcmVxdWVzdF9jb3VudF9maWxlbmFtZShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpbGVuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfd3JpdGVfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lLCB0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfd3JpdGVfcmVxdWVzdF9jb3VudF9tb2RlKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZV9jb3VudCA+IDApICYmICh0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1vZGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGUsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRhdGEuYmxvY2tfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRhdGEuZGF0YV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2RhdGFfY291bnRfZGF0YShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kYXRhLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRhdGEuZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRhdGEuZGF0YV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGF0YS5kYXRhLCB0aGlzLT51LmRhdGEuZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmFjay5ibG9ja19udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0VSUk9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmVycm9yLmNvZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZXJyb3IubWVzc2FnZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2Vycm9yX2NvdW50X21lc3NhZ2UoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZXJyb3IubWVzc2FnZV9jb3VudCA+IDApICYmICh0aGlzLT51LmVycm9yLm1lc3NhZ2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtZXNzYWdlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZXJyb3JcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lcnJvci5tZXNzYWdlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZXJyb3IubWVzc2FnZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZXJyb3IubWVzc2FnZSwgdGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZSBvcGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV91bnBhY2soJm9wY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxlbmFtZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtb2RlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkdW1teTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZHVtbXkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChkdW1teSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZmlsZW5hbWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGR1bW15OworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkdW1teSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbW9kZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG1vZGVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGRhdGFfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9FUlJPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGR1bW15OworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkdW1teSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG1lc3NhZ2VfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfd3JpdGVfcmVxdWVzdF9jb3VudF9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X21vZGUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50OF90IGR1bW15OworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkdW1teSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZGF0YV9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2Vycm9yX2NvdW50X21lc3NhZ2UoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50OF90IGR1bW15OworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkdW1teSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnX3BhY2sodGhpcy0+dS5hY3RpdmF0ZV9pbWFnZV9yZXF1ZXN0LmZsYWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9PUENPREVfQUNUSVZBVEVfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Fja19wYWNrKHRoaXMtPnUuYWN0aXZhdGVfaW1hZ2VfcmVzcG9uc2UuYWNrLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9PUENPREVfQUNUSVZBVEVfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9PUENPREVfQUNUSVZBVEVfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWdfdW5wYWNrKCZ0aGlzLT51LmFjdGl2YXRlX2ltYWdlX3JlcXVlc3QuZmxhZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrX3VucGFjaygmdGhpcy0+dS5hY3RpdmF0ZV9pbWFnZV9yZXNwb25zZS5hY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9PUENPREVfQUNUSVZBVEVfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZV9wYWNrKHRoaXMtPmRhdGFfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRhdGFfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfVEZUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudGZ0cC50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfcGFjaygmdGhpcy0+dS50ZnRwLnRmdHAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRhdGFfY2hlY2tpbmcudGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX3BhY2soJnRoaXMtPnUuZGF0YV9jaGVja2luZy5maWxlX2NoZWNrLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9TV01JUlJPUklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3dtaXJyb3JpbmcudGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9wYWNrKCZ0aGlzLT51LnN3bWlycm9yaW5nLnN3bWlycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9DT01NSVRfSU1BR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNvbW1pdF9pbWFnZS50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9wYWNrKCZ0aGlzLT51LmNvbW1pdF9pbWFnZS5jb21taXRfaW1hZ2UsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5kYXRhX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1RGVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnRmdHAudGZ0cCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9EQVRBX0NIRUNLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kYXRhX2NoZWNraW5nLmZpbGVfY2hlY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfU1dNSVJST1JJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zd21pcnJvcmluZy5zd21pcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9DT01NSVRfSU1BR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29tbWl0X2ltYWdlLmNvbW1pdF9pbWFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZV91bnBhY2soJnRoaXMtPmRhdGFfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRhdGFfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfVEZUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50ZnRwLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV91bnBhY2soJnRoaXMtPnUudGZ0cC50ZnRwLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGF0YV9jaGVja2luZy50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmRhdGFfY2hlY2tpbmcuZmlsZV9jaGVjaywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9TV01JUlJPUklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zd21pcnJvcmluZy50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX3VucGFjaygmdGhpcy0+dS5zd21pcnJvcmluZy5zd21pcnJvciwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9DT01NSVRfSU1BR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY29tbWl0X2ltYWdlLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3VucGFjaygmdGhpcy0+dS5jb21taXRfaW1hZ2UuY29tbWl0X2ltYWdlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlIGRhdGFfdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3VucGFjaygmZGF0YV90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZGF0YV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9URlRQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9EQVRBX0NIRUNLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9TV01JUlJPUklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMywgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMywgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dHhieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmRyb3BwZWRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dHhieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRyb3BwZWRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfUE9SVF9ET1dOU1RSRUFNX1JBVEVfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUucG9ydF9kb3duc3RyZWFtX3JhdGVfc2hhcGluZy5pc19hY3RpdmF0ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LnBvcnRfZG93bnN0cmVhbV9yYXRlX3NoYXBpbmcucmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X21hY19saW1pdC5pc19hY3RpdmF0ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X21hY19saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfQkxPQ0tfVU5CTE9DS19PTlVfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuYmxvY2tfdW5ibG9ja19vbnVfdHJhZmZpYy5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX0RJQUdOT1NUSUNTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9kaWFnbm9zdGljcy5vcHRpY3NfbW9kdWxlX3RlbXBlcmF0dXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfZGlhZ25vc3RpY3MudHhvcHRpY3NfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9kaWFnbm9zdGljcy5yeG9wdGljc19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX1FVRVVFX0RST1BfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX3F1ZXVlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9xdWV1ZV9kcm9wX2NvdW50ZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3BhY2soJnRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLmNvdW50ZXJfYml0X21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eGZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4Ynl0ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eG11bHRpY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4YnJvYWRjYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhkcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhmcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGJ5dGVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhtdWx0aWNhc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGJyb2FkY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4b3ZlcnNpemVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnh1bmRlcnNpemVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhjcmNfZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX1JTVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfcnN0cC5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUubG9vcF9kZXRlY3QuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sb29wX2RldGVjdC5pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sb29wX2RldGVjdC5ibG9ja190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTVBDUF9DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIuY291bnRlcl9iaXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X21wY3BfY291bnRlci5yeGhlY19lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIucnhyZWdpc3RlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X21wY3BfY291bnRlci50eHJlZ2lzdGVyX2FjaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X21wY3BfY291bnRlci5yeGdhdGVfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnR4cmVwb3J0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT1BUSUNBTF9QT1dFUl9BTEFSTV9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXNfcGFjayh0aGlzLT51Lm9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0aWNfbWFjLm1hY3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFjc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3N0YXRpY19tYWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LnN0YXRpY19tYWMubWFjc1tpMV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPndpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NQUNfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfQkxPQ0tfVU5CTE9DS19PTlVfVFJBRkZJQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfRElBR05PU1RJQ1M6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX1FVRVVFX0RST1BfQ09VTlRFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoOCAqIHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfRVRIRVJORVRfUE9SVF9DT1VOVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gOTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX1JTVFA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01QQ1BfQ09VTlRFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT1BUSUNBTF9QT1dFUl9BTEFSTV9TVEFUVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoNiAqIHRoaXMtPnUuc3RhdGljX21hYy5tYWNzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfUE9SVF9ET1dOU1RSRUFNX1JBVEVfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X2Rvd25zdHJlYW1fcmF0ZV9zaGFwaW5nLmlzX2FjdGl2YXRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X2Rvd25zdHJlYW1fcmF0ZV9zaGFwaW5nLnJhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21hY19saW1pdC5pc19hY3RpdmF0ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbWFjX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9CTE9DS19VTkJMT0NLX09OVV9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmJsb2NrX3VuYmxvY2tfb251X3RyYWZmaWMuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9ESUFHTk9TVElDUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9kaWFnbm9zdGljcy5vcHRpY3NfbW9kdWxlX3RlbXBlcmF0dXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9kaWFnbm9zdGljcy50eG9wdGljc19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfZGlhZ25vc3RpY3MucnhvcHRpY3NfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9RVUVVRV9EUk9QX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fcXVldWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3F1ZXVlX2Ryb3BfY291bnRlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzID0gKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcl91bnBhY2soJnRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXNbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfRVRIRVJORVRfUE9SVF9DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLmNvdW50ZXJfYml0X21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4ZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eGJ5dGVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eG11bHRpY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhicm9hZGNhc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4ZHJvcHBlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhmcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4Ynl0ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4bXVsdGljYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGJyb2FkY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhvdmVyc2l6ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4dW5kZXJzaXplZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhjcmNfZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX1JTVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9yc3RwLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxvb3BfZGV0ZWN0LmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sb29wX2RldGVjdC5pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxvb3BfZGV0ZWN0LmJsb2NrX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NUENQX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLmNvdW50ZXJfYml0X21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21wY3BfY291bnRlci5yeGhlY19lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21wY3BfY291bnRlci5yeHJlZ2lzdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIudHhyZWdpc3Rlcl9hY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21wY3BfY291bnRlci5yeGdhdGVfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIudHhyZXBvcnRfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cy5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3VucGFjaygmdGhpcy0+dS5vcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cy5hbGFybV9zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudCA+IDApICYmICh0aGlzLT51LnN0YXRpY19tYWMubWFjcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hY3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9zdGF0aWNfbWFjXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc3RhdGljX21hYy5tYWNzID0gKGJjbW9zX21hY19hZGRyZXNzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudCAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RhdGljX21hYy5tYWNzW2kxXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZsZWFmLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0JMT0NLX1VOQkxPQ0tfT05VX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9ESUFHTk9TVElDUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfUVVFVUVfRFJPUF9DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fcXVldWVzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdXBzdHJlYW1fcXVldWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcikgKiB1cHN0cmVhbV9xdWV1ZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB1cHN0cmVhbV9xdWV1ZXNfY291bnQgKiA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01QQ1BfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBtYWNzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbWFjc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgKiBtYWNzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbWFjc19jb3VudCAqIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fT05VX0NPVU5URVJfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9SRVNUT1JFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LnJlc3RvcmVfb251LnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3Jlc3RvcmVfb251XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93biwgdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS50eHBvd2VyX29mZi5pc19wb3dlcl9vZmYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudHhwb3dlcl9vZmYuZHVyYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9PTlVfQ09VTlRFUl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1RYUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fT05VX0NPVU5URVJfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9SRVNUT1JFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnJlc3RvcmVfb251LnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9yZXN0b3JlX29udV9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlc3RvcmVfb251LnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3Jlc3RvcmVfb251XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnJlc3RvcmVfb251LnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnJlc3RvcmVfb251LnVua25vd24sIHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS50eHBvd2VyX29mZi5sZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS50eHBvd2VyX29mZi5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eHBvd2VyX29mZi5pc19wb3dlcl9vZmYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eHBvd2VyX29mZi5kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS50eHBvd2VyX29mZi5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIGxlYWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9PTlVfQ09VTlRFUl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX0VORDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcmVzdG9yZV9vbnVfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9wYWNrKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKCZ0aGlzLT51Lm9sZF9tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuZXh0X2FjdGlvbi5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9wYWNrKCZ0aGlzLT51Lmt0YXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUua3RhY3Rpb24uYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLmxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hY3Rpb24uYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9sZF9tYW5hZ2VtZW50X29iamVjdC5vYmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm1hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXh0X2FjdGlvbi5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUua3RhdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lmt0YWN0aW9uLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm9sZF9tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3Qub2JqZWN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjaygmdGhpcy0+dS5leHRfYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuZXh0X2FjdGlvbi5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3VucGFjaygmdGhpcy0+dS5rdGFjdGlvbi5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLmxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi5sZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5kZWYubGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggYnJhbmNoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5leHRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3BhY2sodGhpcy0+dS5leHRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUua3RhdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3BhY2sodGhpcy0+dS5rdGFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9sZF9tYW5hZ2VtZW50X29iamVjdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3QudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0LnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm1hbmFnZW1lbnRfb2JqZWN0LnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5leHRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5leHRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUua3RhdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5rdGFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50X3BhY2sodGhpcy0+dS5sb29wX2RldGVjdC5ldmVudCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9PUFRJQ0FMX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudF9wYWNrKHRoaXMtPnUub3B0aWNhbF9wb3dlcl9hbGFybS5ldmVudCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfT1BUSUNBTF9QT1dFUl9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudF91bnBhY2soJnRoaXMtPnUubG9vcF9kZXRlY3QuZXZlbnQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9PUFRJQ0FMX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudF91bnBhY2soJnRoaXMtPnUub3B0aWNhbF9wb3dlcl9hbGFybS5ldmVudCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlIHR5cGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX09QVElDQUxfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoIC0gMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV9wYWNrKHRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfcGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWVzc2FnZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NvZnR3YXJlX2Rvd25sb2FkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3BhY2soJnRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGVfcGFjayh0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJhdXRoZW50aWNhdGlvbl9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9vbnVfYXV0aGVudGljYXRpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YSwgdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV9wYWNrKCZ0aGlzLT51LmNodXJuaW5nLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9wYWNrKCZ0aGlzLT51LmRiYS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9LVE9OVV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImV2ZW50c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfa3RvbnVfZXZlbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3BhY2soJnRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfcGFjaygmdGhpcy0+dS5ldmVudC5ldmVudHMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc1tpMl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc1tpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NPRlRXQVJFX0RPV05MT0FEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudCA+IDApICYmICh0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1lc3NhZ2VzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc1tpNF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0NIVVJOSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNodXJuaW5nLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZGJhLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk1OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZXZlbnRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzX2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzW2k1XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmV2ZW50LmV2ZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl91bnBhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZV9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZV9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zb2Z0d2FyZV9kb3dubG9hZF9jb3VudF9tZXNzYWdlcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudCA+IDApICYmICh0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWVzc2FnZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NvZnR3YXJlX2Rvd25sb2FkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3VucGFjaygmdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlX3VucGFjaygmdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJhdXRoZW50aWNhdGlvbl9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9vbnVfYXV0aGVudGljYXRpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YSwgdGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV91bnBhY2soJnRoaXMtPnUuY2h1cm5pbmcudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmRiYS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk1OworICAgICAgICAgICAgICAgIHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9rdG9udV9ldmVudF9jb3VudF9ldmVudHMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZXZlbnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9rdG9udV9ldmVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50cyA9IChiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzX2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV91bnBhY2soJnRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzW2k1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV91bnBhY2soJnRoaXMtPnUuZXZlbnQuZXZlbnRzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSBvcDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3VucGFjaygmb3AsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbWVzc2FnZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWVzc2FnZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0NIVVJOSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGV2ZW50c19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZXZlbnRzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3Jfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc29mdHdhcmVfZG93bmxvYWRfY291bnRfbWVzc2FnZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9rdG9udV9ldmVudF9jb3VudF9ldmVudHMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF9wYWNrKHRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3BhY2sodGhpcy0+ZGlyZWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF9wYWNrKHRoaXMtPnUuYWRkX2ZpbHRlci5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hZGRfZmlsdGVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3BhY2sodGhpcy0+dS5hZGRfZmlsdGVyLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX1JFTU9WRV9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3BhY2sodGhpcy0+dS5yZW1vdmVfZmlsdGVyLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnJlbW92ZV9maWx0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fcGFjayh0aGlzLT51LnJlbW92ZV9maWx0ZXIuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUVVFVUVfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlX3BhY2sodGhpcy0+dS5xdWV1ZV9tYXAucHJpX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9tYXAuaW5fcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfbWFwLm91dF9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfUFJJT1JJVFlfRk9SX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3BhY2sodGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4uZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYWRkX3ByaW9yaXR5X2Zvcl92bGFuLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi5wcmlfdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4ucHJpX3F1ZXVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNjsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUkVNT1ZFX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUVVFVUVfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9QUklPUklUWV9GT1JfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfdW5wYWNrKCZ0aGlzLT5jb21tYW5kLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPmRpcmVjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfdW5wYWNrKCZ0aGlzLT51LmFkZF9maWx0ZXIuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWRkX2ZpbHRlci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWRkX2ZpbHRlci5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9SRU1PVkVfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF91bnBhY2soJnRoaXMtPnUucmVtb3ZlX2ZpbHRlci5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5yZW1vdmVfZmlsdGVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5yZW1vdmVfZmlsdGVyLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX1FVRVVFX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZV91bnBhY2soJnRoaXMtPnUucXVldWVfbWFwLnByaV90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucXVldWVfbWFwLmluX3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnF1ZXVlX21hcC5vdXRfcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX1BSSU9SSVRZX0ZPUl9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF91bnBhY2soJnRoaXMtPnUuYWRkX3ByaW9yaXR5X2Zvcl92bGFuLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4ucHJpX3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWRkX3ByaW9yaXR5X2Zvcl92bGFuLnByaV9xdWV1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIGNvbW1hbmQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kX3VucGFjaygmY29tbWFuZCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUkVNT1ZFX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX1FVRVVFX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9QUklPUklUWV9GT1JfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG9ydF9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5hdXRvX25lZ290aWF0aW9uX2VuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zcGVlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZnVsbF9kdXBsZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZWFybmluZ190YWJsZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmVuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YXV0b19uZWdvdGlhdGlvbl9lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3BlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2Z1bGxfZHVwbGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVhcm5pbmdfdGFibGVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfdGFnZ2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmxhbl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX3RhZ2dlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnZsYW5zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZsYW5zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52bGFuc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcGFjaygmdGhpcy0+dmxhbnNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cHZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKnRoaXMpCit7CisgICAgcmV0dXJuIDYgKyAoNCAqIHRoaXMtPnZsYW5zX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnZsYW5zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZsYW5zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZsYW5zID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT52bGFuc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmxhbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3VucGFjaygmdGhpcy0+dmxhbnNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCB2bGFuc19jb3VudDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZ2bGFuc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbikgKiB2bGFuc19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB2bGFuc19jb3VudCAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX2xpbmtlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c3BlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZnVsbF9kdXBsZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2xpbmtlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3BlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfZnVsbF9kdXBsZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5pbl9nb29kX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmluX2dvb2RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW5fYnJvYWRjYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW5fbXVsdGljYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b3V0X2dvb2Rfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b3V0X2dvb2RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b3V0X2Jyb2FkY2FzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm91dF9tdWx0aWNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aW5fZ29vZF9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbl9nb29kX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluX2Jyb2FkY2FzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluX211bHRpY2FzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm91dF9nb29kX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm91dF9nb29kX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm91dF9icm9hZGNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5vdXRfbXVsdGljYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0MCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dW5kZXJzaXplZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm92ZXJzaXplZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmphYmJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmluX21hY19yZWNlaXZlX2Vycm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW5fZmNzX2Vycm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnVuZGVyc2l6ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5vdmVyc2l6ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5qYWJiZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbl9tYWNfcmVjZWl2ZV9lcnJvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluX2Zjc19lcnJvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDBBTkQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfcGFjaygmdGhpcy0+dS5wb3J0MGFuZDEucG9ydDAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKCZ0aGlzLT51LnBvcnQwYW5kMS5wb3J0MSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDJBTkQzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfcGFjaygmdGhpcy0+dS5wb3J0MmFuZDMucG9ydDIsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKCZ0aGlzLT51LnBvcnQyYW5kMy5wb3J0MywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfRVJST1JTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfcGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c19wYWNrKCZ0aGlzLT51LmVycm9ycy5wb3J0MSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3BhY2soJnRoaXMtPnUuZXJyb3JzLnBvcnQyLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfcGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQwQU5EMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMkFORDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfRVJST1JTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDgwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQwQU5EMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3VucGFjaygmdGhpcy0+dS5wb3J0MGFuZDEucG9ydDAsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3VucGFjaygmdGhpcy0+dS5wb3J0MGFuZDEucG9ydDEsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDJBTkQzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKCZ0aGlzLT51LnBvcnQyYW5kMy5wb3J0MiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKCZ0aGlzLT51LnBvcnQyYW5kMy5wb3J0MywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c191bnBhY2soJnRoaXMtPnUuZXJyb3JzLnBvcnQwLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c191bnBhY2soJnRoaXMtPnUuZXJyb3JzLnBvcnQxLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c191bnBhY2soJnRoaXMtPnUuZXJyb3JzLnBvcnQyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c191bnBhY2soJnRoaXMtPnUuZXJyb3JzLnBvcnQzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMEFORDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0MCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0MCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQyQU5EMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfRVJST1JTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkX3BhY2sodGhpcy0+aWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZF91bnBhY2soJnRoaXMtPmlkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9QT1JUX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfcG9ydF9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfcGFjaygmdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF92bGFuLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3NldF92bGFuXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfcGFjaygmdGhpcy0+dS5zZXRfdmxhbi5wb3J0c1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfR0VUX09OVV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X29udV9jb25maWcucHJvZmlsZV9vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X29udV9jb25maWcudmFsdWVfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X29udV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3BhY2soJnRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9TVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfc3RwLnJlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuc2V0X3N0cC5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF9zdHAubWF4X2FnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3N0cC5mb3J3YXJkX2RlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfc3RwLmhlbGxvX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1RYUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF90eHBvd2VyX29mZi5lbmFibGVfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LmxsaWRfYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuYmxvY2tfY2FwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9sb29wX2RldGVjdC5zZW5kX2NhcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3Qub2x0X21hY19jYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnNldF9sb29wX2RldGVjdC5zZW5kX3BlcmlvZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LmJsb2NrX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0Lm9sdF9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX0xPT1BfREVURUNUX1VOQkxPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0X3VuYmxvY2subGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfQ0xBU1NJRklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfcGFjaygmdGhpcy0+dS5jbGFzc2lmaWVyLmNsYXNzaWZpZXIsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfdmVyc2lvbi5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5vbnVfdmVyc2lvbi5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV92ZXJzaW9uLmluZm9fY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImluZm9cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3ZlcnNpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvLCB0aGlzLT51Lm9udV92ZXJzaW9uLmluZm9fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0ZMQVNIX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24ubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5ib290X21vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uYWN0aXZlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmltYWdlMXN0cmluZywgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uaW1hZ2Uyc3RyaW5nLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfQUNUSVZFX0lNQUdFX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2FjdGl2ZV9pbWFnZV90aW1lLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2FjdGl2ZV9pbWFnZV90aW1lLmFjdGl2ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X2FjdGl2ZV9pbWFnZV90aW1lLmJ1aWxkX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfc3RhdGlzdGljLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9zdGF0aXN0aWMub3ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcXVlbmNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfc3RhdGlzdGljXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV9wYWNrKCZ0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDX0dFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LmxsaWRfYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdGF0aXN0aWNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNfZ2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfcGFjaygmdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfSUdNUF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm9udV9pZ21wX3NldC5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2lnbXBfc2V0Lm1heF9ncm91cHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1BPUlRfSUdNUF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm9udV9wb3J0X2lnbXBfZmlsdGVyLmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9zaGFwaW5nLnJlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X3NoYXBpbmcuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5vbnVfc2hhcGluZy5yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfUE9SVF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgxMCAqIHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF92bGFuLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0dFVF9PTlVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE1ICsgKDQgKiB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1NUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1RfVU5CTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2xhc3NpZmllci5jbGFzc2lmaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOCArIHRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0ZMQVNIX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9BQ1RJVkVfSU1BR0VfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXF1ZW5jZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzW2kxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDX0dFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgKDYgKiB0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfSUdNUF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1BPUlRfSUdNUF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9QT1JUX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9wb3J0X2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF91bnBhY2soJnRoaXMtPnUucG9ydF9jb25maWcucG9ydHNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF92bGFuLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfc2V0X3ZsYW5cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfdmxhbi5wb3J0cyA9IChiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfdW5wYWNrKCZ0aGlzLT51LnNldF92bGFuLnBvcnRzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0dFVF9PTlVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X29udV9jb25maWcubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUuZ2V0X29udV9jb25maWcub3ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmdldF9vbnVfY29uZmlnLnByb2ZpbGVfb3ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmdldF9vbnVfY29uZmlnLnZhbHVlX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X29udV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0cyA9IChiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9TVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfc3RwLnJlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUuc2V0X3N0cC5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF9zdHAubWF4X2FnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3N0cC5mb3J3YXJkX2RlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfc3RwLmhlbGxvX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1RYUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF90eHBvd2VyX29mZi5lbmFibGVfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LmxsaWRfYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuYmxvY2tfY2FwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9sb29wX2RldGVjdC5zZW5kX2NhcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3Qub2x0X21hY19jYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LnNldF9sb29wX2RldGVjdC5zZW5kX3BlcmlvZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LmJsb2NrX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0Lm9sdF9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX0xPT1BfREVURUNUX1VOQkxPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0X3VuYmxvY2subGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfQ0xBU1NJRklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmNsYXNzaWZpZXIuY2xhc3NpZmllciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3ZlcnNpb24ubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUub251X3ZlcnNpb24ub3ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV92ZXJzaW9uLmluZm9fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3ZlcnNpb24uaW5mbyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImluZm9cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3ZlcnNpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUub251X3ZlcnNpb24uaW5mbywgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9GTEFTSF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uYm9vdF9tb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmFjdGl2ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmltYWdlMXN0cmluZywgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5pbWFnZTJzdHJpbmcsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9BQ1RJVkVfSU1BR0VfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUuYWN0aXZlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUuYnVpbGRfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9zdGF0aXN0aWMubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUub251X3N0YXRpc3RpYy5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfc3RhdGlzdGljX2NvdW50X3NlcXVlbmNlcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2VxdWVuY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlcyA9IChiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3N0YXRpc3RpY19nZXQubGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3RhdGlzdGljc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfc3RhdGlzdGljX2dldFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3MgPSAoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZV91bnBhY2soJnRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfSUdNUF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51Lm9udV9pZ21wX3NldC5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2lnbXBfc2V0Lm1heF9ncm91cHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1BPUlRfSUdNUF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51Lm9udV9wb3J0X2lnbXBfZmlsdGVyLmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9zaGFwaW5nLnJlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUub251X3NoYXBpbmcuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5vbnVfc2hhcGluZy5yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSBvcGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1BPUlRfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydCkgKiBwb3J0c19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBwb3J0c19jb3VudCAqIDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0KSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCBwb3J0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9HRVRfT05VX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnKSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHBvcnRzX2NvdW50ICogNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfU1RQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVF9VTkJMT0NLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGluZm9fY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZpbmZvX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaW5mb19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpbmZvX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfRkxBU0hfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9BQ1RJVkVfSU1BR0VfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2VxdWVuY2VzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNlcXVlbmNlc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDX0dFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHN0YXRpc3RpY3NfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZzdGF0aXN0aWNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlKSAqIHN0YXRpc3RpY3NfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgc3RhdGlzdGljc19jb3VudCAqIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0lHTVBfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9QT1JUX0lHTVBfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNfY291bnRfc2VxdWVuY2VzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5uYW1lID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPm5hbWUsIHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5sZW5ndGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPm5hbWUgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5uYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPm5hbWUsIHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgdWludDMyX3QgaTA7CisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5uYW1lc19jb3VudCA+IDApICYmICh0aGlzLT5uYW1lcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuYW1lc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bmFtZXNfY291bnQgPiA2NTUzNUwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bmFtZXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfcGFjaygmdGhpcy0+bmFtZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3QgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+bmFtZXNfY291bnQgPiAwKSAmJiAodGhpcy0+bmFtZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmFtZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5uYW1lc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm5hbWVzW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHRoaXMtPm5hbWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X2NvdW50X25hbWVzKCZwb3N0TGVuQnVmKTsKKyAgICBpZiAoKHRoaXMtPm5hbWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPm5hbWVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmFtZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+bmFtZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bmFtZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPm5hbWVzX2NvdW50ID4gNjU1MzVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm5hbWVzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3VucGFjaygmdGhpcy0+bmFtZXNbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB1aW50MzJfdCBuYW1lc19lbGVtX2NvdW50ID0gMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWVzX2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobmFtZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lKSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X2NvdW50X25hbWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm1hY19hZGRyZXNzX2NvdW50ID4gMCkgJiYgKHRoaXMtPm1hY19hZGRyZXNzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm1hY19hZGRyZXNzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3NbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlICp0aGlzKQoreworICAgIHJldHVybiAoNiAqIHRoaXMtPm1hY19hZGRyZXNzX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICB0aGlzLT5tYWNfYWRkcmVzc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhidWYpOworICAgIGlmICgodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPiAwKSAmJiAodGhpcy0+bWFjX2FkZHJlc3MgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYWNfYWRkcmVzc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcyA9IChiY21vc19tYWNfYWRkcmVzcyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgKiBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm1hY19hZGRyZXNzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3NbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBtYWNfYWRkcmVzc19lbGVtX2NvdW50ID0gMDsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWFjX2FkZHJlc3NfZWxlbV9jb3VudCArPSAxOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtYWNfYWRkcmVzc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSk7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfY291bnRfbWFjX2FkZHJlc3MoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2lkdGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjaygmdGhpcy0+dS5hZGRfZHluX21hY19hZGRyLm1hY19hZGRlc3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9wYWNrKCZ0aGlzLT51LmRlbF9keW5fbWFjX2FkZHIubWFjX2FkZHJlc3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9wYWNrKCZ0aGlzLT51LmFkZF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9wYWNrKCZ0aGlzLT51LmRlbF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fcGFjayh0aGlzLT51Lmxvb3BiYWNrX2VuYWJsZS5sb2NhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fcGFjayh0aGlzLT51Lmxvb3BiYWNrX2Rpc2FibGUubG9jYXRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lmxhc2VyX3R4X3Bvd2VyX29mZi5kaXNhYmxlX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RJU0FCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVElDX0xFQVJOX1RBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DT05GSUdVUkVfTUNBU1RfTExJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3BhY2sodGhpcy0+dS5jb25maWd1cmVfbWNhc3RfbGxpZC5sbGlkX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5jb25maWd1cmVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVRSSUVWRV9DVVJSRU5UX0FMQVJNX1NVTU1BUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYWRkX2R5bl9tYWNfYWRkci5tYWNfYWRkZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZGVsX2R5bl9tYWNfYWRkci5tYWNfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFkZF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19NQUNfQUREUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kZWxfc3RhdGljX21hY19hZGRyLm1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRJQ19MRUFSTl9UQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DT05GSUdVUkVfTUNBU1RfTExJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVRSSUVWRV9DVVJSRU5UX0FMQVJNX1NVTU1BUlk6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV91bnBhY2soJnRoaXMtPnUuYWRkX2R5bl9tYWNfYWRkci5tYWNfYWRkZXNzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfRFlOX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3VucGFjaygmdGhpcy0+dS5kZWxfZHluX21hY19hZGRyLm1hY19hZGRyZXNzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3VucGFjaygmdGhpcy0+dS5hZGRfc3RhdGljX21hY19hZGRyLm1hY19hZGRyZXNzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3VucGFjaygmdGhpcy0+dS5kZWxfc3RhdGljX21hY19hZGRyLm1hY19hZGRyZXNzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl91bnBhY2soJnRoaXMtPnUubG9vcGJhY2tfZW5hYmxlLmxvY2F0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uX3VucGFjaygmdGhpcy0+dS5sb29wYmFja19kaXNhYmxlLmxvY2F0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGFzZXJfdHhfcG93ZXJfb2ZmLmRpc2FibGVfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUSUNfTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmNvbmZpZ3VyZV9tY2FzdF9sbGlkLmxsaWRfYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jb25maWd1cmVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVRSSUVWRV9DVVJSRU5UX0FMQVJNX1NVTU1BUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfRFlOX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUSUNfTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVUUklFVkVfQ1VSUkVOVF9BTEFSTV9TVU1NQVJZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cXVldWVfY291bnQgPiAwKSAmJiAodGhpcy0+cXVldWVfc2l6ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXMsIHRoaXMtPnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5xdWV1ZV9jb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5xdWV1ZV9jb3VudCA+IDApICYmICh0aGlzLT5xdWV1ZV9zaXplcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NpemVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnF1ZXVlX3NpemVzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnF1ZXVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXMsIHRoaXMtPnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgcXVldWVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBxdWV1ZV9jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBxdWV1ZV9jb3VudCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV9wYWNrKHRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udS5pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9jb3VudCA+IDApICYmICh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX25ldHdvcmtfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV0d29ya19wb24ucG9uLCB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGluay5saW5rX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubGluay5saW5rID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5saW5rLmxpbmssIHRoaXMtPnUubGluay5saW5rX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudXNlcl9wb3J0LnBvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdXNlcl9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnQsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfcGFjaygmdGhpcy0+dS5xdWV1ZS5xdWV1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9NQ0FTVF9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1jYXN0X2xpbmsubWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYnJpZGdlLmJyaWRnZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJicmlkZ2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2JyaWRnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmJyaWRnZS5icmlkZ2UsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2JyaWRnZV9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydCwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9NRVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPmxlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPm9iamVjdF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX09OVToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTElOSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubGluay5saW5rX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS51c2VyX3BvcnQucG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1FVRVVFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01DQVNUX0xJTks6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9NRVA6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfdW5wYWNrKCZ0aGlzLT5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251Lmluc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbmV0d29ya19wb25fY291bnRfcG9uKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV0d29ya19wb24ucG9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9uZXR3b3JrX3BvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbiA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb24sIHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUubGluay5saW5rX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9saW5rX2NvdW50X2xpbmsoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5saW5rLmxpbmtfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saW5rLmxpbmsgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9saW5rXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubGluay5saW5rID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubGluay5saW5rX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmxpbmsubGluaywgdGhpcy0+dS5saW5rLmxpbmtfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91c2VyX3BvcnRfY291bnRfcG9ydCgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudXNlcl9wb3J0LnBvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91c2VyX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS51c2VyX3BvcnQucG9ydCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnVzZXJfcG9ydC5wb3J0LCB0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3VucGFjaygmdGhpcy0+dS5xdWV1ZS5xdWV1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUNBU1RfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1jYXN0X2xpbmsubWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX2NvdW50X2JyaWRnZSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmJyaWRnZS5icmlkZ2VfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2UuYnJpZGdlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiYnJpZGdlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2UuYnJpZGdlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5icmlkZ2UuYnJpZGdlLCB0aGlzLT51LmJyaWRnZS5icmlkZ2VfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0JSSURHRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX3BvcnRfY291bnRfcG9ydCgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0ID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0LCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfdW5wYWNrKCZvYmplY3RfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob2JqZWN0X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcG9uX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvbl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBvbl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGlua19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsaW5rX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobGlua19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3J0X2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvcnRfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwb3J0X2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01DQVNUX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0JSSURHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBicmlkZ2VfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJpZGdlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoYnJpZGdlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcG9ydF9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb3J0X2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9ydF9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX25ldHdvcmtfcG9uX2NvdW50X3BvbihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2xpbmtfY291bnRfbGluayhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VzZXJfcG9ydF9jb3VudF9wb3J0KGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX2NvdW50X2JyaWRnZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2JyaWRnZV9wb3J0X2NvdW50X3BvcnQoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuc3RhbmRhcmRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LnN0YW5kYXJkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3BhY2soJnRoaXMtPnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuZXh0ZW5kZWRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+dS5leHRlbmRlZF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2JqZWN0Lm9iamVjdF9jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91bnBhY2soJnRoaXMtPnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5leHRlbmRlZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9wYWNrKCZ0aGlzLT5zdGF0aXN0aWMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJpc2luZ190aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5mYWxsaW5nX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgKnRoaXMpCit7CisgICAgcmV0dXJuIDggKyBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+c3RhdGlzdGljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKCZ0aGlzLT5zdGF0aXN0aWMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmlzaW5nX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmZhbGxpbmdfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV9wYWNrKHRoaXMtPmNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGVfdW5wYWNrKCZ0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmluc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfcGFjaygmdGhpcy0+ZmllbGQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bXNiX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxzYl9tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF91bnBhY2soJnRoaXMtPmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bXNiX21hc2spKQorICAgIHsKKyAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxzYl9tYXNrKSkKKyAgICB7CisgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfcGFjaygmdGhpcy0+ZmllbGQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfdW5wYWNrKCZ0aGlzLT5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9OT1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0byBwYWNrIGZvciBlbXB0eSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0byBwYWNrIGZvciBlbXB0eSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0ZPUldBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0byBwYWNrIGZvciBlbXB0eSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfcGFjaygmdGhpcy0+dS5xdWV1ZS5xdWV1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfcGFjaygmdGhpcy0+dS5zZXQuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldC52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LnNldC52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3NldFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNldC52YWx1ZSwgdGhpcy0+dS5zZXQudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfcGFjaygmdGhpcy0+dS5jb3B5LmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9wYWNrKCZ0aGlzLT51LmRlbGV0ZS5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfSU5TRVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfcGFjaygmdGhpcy0+dS5pbnNlcnQuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1JFUExBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9wYWNrKCZ0aGlzLT51LnJlcGxhY2UuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soJnRoaXMtPnUuY2xlYXJfZGVsZXRlLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9wYWNrKCZ0aGlzLT51LmNsZWFyX2luc2VydC5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfTk9QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgdGhpcy0+dS5zZXQudmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ09QWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1JFUExBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX05PUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHVucGFjayAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0byB1bnBhY2sgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9GT1JXQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vIGRhdGEgdG8gdW5wYWNrICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV91bnBhY2soJnRoaXMtPnUucXVldWUucXVldWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfdW5wYWNrKCZ0aGlzLT51LnNldC5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0LnZhbHVlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2V0X2NvdW50X3ZhbHVlKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldC52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LnNldC52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0LnZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0LnZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5zZXQudmFsdWUsIHRoaXMtPnUuc2V0LnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ09QWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyX3VucGFjaygmdGhpcy0+dS5jb3B5LmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3VucGFjaygmdGhpcy0+dS5kZWxldGUuZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfSU5TRVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKCZ0aGlzLT51Lmluc2VydC5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9SRVBMQUNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKCZ0aGlzLT51LnJlcGxhY2UuZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKCZ0aGlzLT51LmNsZWFyX2RlbGV0ZS5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soJnRoaXMtPnUuY2xlYXJfaW5zZXJ0LmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0IHJlc3VsdDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF91bnBhY2soJnJlc3VsdCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlc3VsdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX05PUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ESVNDQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0ZPUldBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ09QWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfSU5TRVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1JFUExBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zZXRfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZV9wYWNrKHRoaXMtPnN1YnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmhlYWRlci5wcmVjZWRlbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3BhY2soJnRoaXMtPnUuY2xhdXNlLmZpZWxkX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGF1c2UubXNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2xhdXNlLmxzYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3BhY2sodGhpcy0+dS5jbGF1c2Uub3BlcmF0b3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCA+IDApICYmICh0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYXRjaF92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfY2xhdXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlLCB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfcGFjaygmdGhpcy0+dS5yZXN1bHQucmVzdWx0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5zdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNiArIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlc3VsdC5yZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZV91bnBhY2soJnRoaXMtPnN1YnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmhlYWRlci5wcmVjZWRlbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3VucGFjaygmdGhpcy0+dS5jbGF1c2UuZmllbGRfY29kZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhdXNlLm1zYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmNsYXVzZS5sc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuY2xhdXNlLm9wZXJhdG9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9sZW5ndGggPiAwKSAmJiAodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYXRjaF92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfY2xhdXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlLCB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfdW5wYWNrKCZ0aGlzLT51LnJlc3VsdC5yZXN1bHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSBzdWJ0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZV91bnBhY2soJnN1YnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChzdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF0Y2hfdmFsdWVfbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbWF0Y2hfdmFsdWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbWF0Y2hfdmFsdWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIG1hdGNoX3ZhbHVlX2xlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5xdWV1ZV9iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhpbXVtX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5idXJzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZV9iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhpbXVtX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5idXJzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWxfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXBfcGFjayh0aGlzLT50cmFmZmljX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1heGltdW1fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWxfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF91bnBhY2soJnRoaXMtPnRyYWZmaWNfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4aW11bV9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmV2ZW50X2NvZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmVuYWJsZWRfZGlzYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZXZlbnRfY29kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZW5hYmxlZF9kaXNhYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3BhY2soYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyAoMiAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNlcXVlbmNlX251bWJlci5zZXF1bmNlX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUub251X2lkLmlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmZpcm13YXJlX2luZm8uYm9vdF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5maXJtd2FyZV9pbmZvLmJvb3RfY3JjMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmZpcm13YXJlX2luZm8uYXBwbGljYXRpb25fdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZmlybXdhcmVfaW5mby5hcHBsaWNhdGlvbl9jcmMzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ0hJUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNoaXBfaW5mby5qZWRlY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuY2hpcF9pbmZvLmNoaXBfbW9kZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmNoaXBfaW5mby5jaGlwX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBVEVfT0ZfTUFOVUZBQ1RVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS55ZWFyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRhdGVfb2ZfbWFudWZhY3R1cmUubW9udGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS5kYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BTlVGQUNUVVJFUl9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWYgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGVmXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWFudWZhY3R1cmVyX2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWYsIHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTE9HSUNBTF9MSU5LUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tYXhfbG9naWNhbF9saW5rcy5iaWRpcmVjdGlvbmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tYXhfbG9naWNhbF9saW5rcy5kb3duc3RyZWFtX29ubHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9FUE9OX1BPUlRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm51bV9lcG9uX3BvcnRzLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9VTklfUE9SVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubnVtX3VuaV9wb3J0cy5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QQUNLRVRfQlVGRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci51cHN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci51cF9xdWV1ZXNfbWF4X3Blcl9saW5rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBhY2tldF9idWZmZXIudXBfcXVldWVfaW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBhY2tldF9idWZmZXIuZG93bnN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci5kbl9xdWV1ZXNfbWF4X3Blcl9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBhY2tldF9idWZmZXIuZG5fcXVldWVfaW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnRvdGFsX3BhY2tldF9idWZmZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBhY2tldF9idWZmZXIudXBzdHJlYW1fcGFja2V0X2J1ZmZlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci5kb3duc3JlYW1fcGFja2V0X2J1ZmZlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDAgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0MFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MFtpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cyA+IDB4MDAwMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MVtpMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID4gMHgwMDAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQyID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0MlwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OyBpMisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQyW2kyXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMgPiAweDAwMDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkzKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDNbaTNdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV9wYWNrKHRoaXMtPnUubGlua19zdGF0ZS5saW5rX3N0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub2FtX3JhdGUubWF4aW11bV9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vYW1fcmF0ZS5taW5pbXVtX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEFCTEVfU0laRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5keW5fbGVhcm5fdGFibGVfc2l6ZS5tYXhfbWFjX2FsbG93ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZHluX2xlYXJuX2FnZV9saW1pdC5keW5hbWljX2FkZHJlc3NfYWdlX2xpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuZHluX21hY190YWJsZS5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuc3RhdGljX21hY190YWJsZS5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5X3BhY2sodGhpcy0+dS5wb3J0X2NhcGFiaWxpdHkubWF4aW11bV9jYXBhYmlsaXRpZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5X3BhY2sodGhpcy0+dS5wb3J0X2NhcGFiaWxpdHkuY3VycmVudF9jYXBhYmlsaXRpZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3BhY2sodGhpcy0+dS5keW5fbGVhcm5fbW9kZS5sZWFybmluZ19tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWluX21hY19saW1pdC5taW5pbXVtX2d1YXJhbnRlZWRfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9NQUNfQUxMT1dFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tYXhfbWFjX2FsbG93ZWQubWF4X2FsbG93ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYWdnX21hY19saW1pdC5hZ2dyZWdhdGVfbWFjX2xpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MRU5fRVJSX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lmxlbl9lcnJfZGlzY2FyZC5sZW5fZXJyb3JfZGlzY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZmxvb2RfdW5rbm93bi5mbG9vZF91bmtub3duKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmxvY2FsX3N3aXRjaGluZy5sb2NhbF9zd2l0Y2hpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rcyA+IDApICYmICh0aGlzLT51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19jb25maWd1cmF0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rczsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3BhY2soJnRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbltpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHMgPiAwKSAmJiAodGhpcy0+dS5xdWV1ZV9jb25maWcucG9ydF9jb25maWd1cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRfY29uZmlndXJhdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF9wYWNrKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb25baTVdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9GSUxFTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmaXJtd2FyZV9maWxlbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX2ZpbGVuYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWUsIHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3BhY2soJnRoaXMtPnUucG9ydF9zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF9wYWNrKCZ0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2guc3RhdF90aHJlc2hvbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmtleV9leHBpcnlfdGltZS50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGVfcGFjayh0aGlzLT51LmVuY3J5cHRfbW9kZS5lbmNyeXB0aW9uX21ldGhvZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0lOR1JFU1NfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcGFjaygmdGhpcy0+dS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGVfcGFjayh0aGlzLT51Lmx1ZV9maWVsZC5maWVsZF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3BhY2sodGhpcy0+dS5sdWVfZmllbGQubGF5ZXJfc2VsZWN0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubHVlX2ZpZWxkLmJpdF93b3JkX29mZnNldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sdWVfZmllbGQuYml0X29mZnNldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sdWVfZmllbGQuYml0X3dpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmx1ZV9maWVsZC5yZWZlcmVuY2VfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9DVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYWx0X2N2bGFuX2V0aGVydHlwZS50cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuYWx0X2N2bGFuX2V0aGVydHlwZS5pbnNlcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9TVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYWx0X3N2bGFuX2V0aGVydHlwZS50cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuYWx0X3N2bGFuX2V0aGVydHlwZS5pbnNlcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JDX1JBVEVfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYmNfcmF0ZV9saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF9wYWNrKHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcudHJhZmZpY190eXBlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzX3BhY2sodGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5yYXRlX3VuaXRzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcubnVtYmVyX29mX3NoYXBlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVycyA+IDApICYmICh0aGlzLT51LmVncmVzc19zaGFwaW5nLnNoYXBlcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2hhcGVyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2VncmVzc19zaGFwaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTYgPSAwOyBpNiA8IHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcubnVtYmVyX29mX3NoYXBlcnM7IGk2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcl9wYWNrKCZ0aGlzLT51LmVncmVzc19zaGFwaW5nLnNoYXBlcnNbaTZdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTc7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c19wYWNrKHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5yYXRlX3VuaXRzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVscyA+IDApICYmICh0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcucmF0ZV9sZXZlbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV9sZXZlbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9pbmdyZXNzX3BvbGljaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTcgPSAwOyBpNyA8IHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHM7IGk3KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWxfcGFjaygmdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfbGV2ZWxzW2k3XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV9wYWNrKHRoaXMtPnUuZmVjX21vZGUucnhfZG93biwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3BhY2sodGhpcy0+dS5mZWNfbW9kZS50eF91cCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRlJfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubWZyX25hbWUubWFuX25hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYW5fbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21mcl9uYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubWZyX25hbWUubWFuX25hbWUsIHRoaXMtPnUubWZyX25hbWUubWFuX25hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZXQVJFX01GR19USU1FX1ZBUl9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZndhcmVfbWZnX3RpbWVfdmFyX2N0cmwuY29kZV9hY2Nlc3Nfc3RhcnQsIDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmZ3YXJlX21mZ190aW1lX3Zhcl9jdHJsLmN2Y19hY2Nlc3Nfc3RhcnQsIDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9WRU5ET1JfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3JfbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3ZlbmRvcl9uYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50ID4gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZSwgdGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTU9ERUxfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtb2RlbF9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tb2RlbF9udW1iZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudCA+IDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlciwgdGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9IV19WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaHdfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2h3X3ZlcnNpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaHdfdmVyc2lvbi5od192ZXJzaW9uX2NvdW50ID4gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb24sIHRoaXMtPnUuaHdfdmVyc2lvbi5od192ZXJzaW9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk4OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF90ZW1wZXJhdHVyZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdGVtcGVyYXR1cmVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50ID4gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk4ID0gMDsgaTggPCB0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZV9jb3VudDsgaTgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZVtpOF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpOTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjYyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3ZjY1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdmNjXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50ID4gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk5ID0gMDsgaTkgPCB0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50OyBpOSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NbaTldKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF90eF9iaWFzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9iaWFzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50OyBpMTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNbaTEwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTExOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF90eF9wb3dlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdHhfcG93ZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyX2NvdW50ID4gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMSA9IDA7IGkxMSA8IHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyX2NvdW50OyBpMTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcltpMTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3J4X3Bvd2VyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl9yeF9wb3dlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEyID0gMDsgaTEyIDwgdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQ7IGkxMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyW2kxMl0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF91bmljYXN0X2ZyYW1lcy5yeF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfdW5pY2FzdF9mcmFtZXMudHhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZV90b29fc2hvcnQucnhfZnJhbWVzX3Rvb19zaG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTY0LnJ4X2ZyYW1lczY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1MTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lNjUxMjcucnhfZnJhbWVzNjUxMjcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4MjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTI4MjU1LnJ4X2ZyYW1lczEyODI1NSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWUyNTY1MTEucnhfZnJhbWVzMjU2NTExKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMjEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU1MTIxMDIzLnJ4X2ZyYW1lczUxMjEwMjMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWUxMDI0MTUxOC5yeF9mcmFtZXMxMDI0MTUxOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTE1MTlwbHVzLnJ4X2ZyYW1lczE1MTlwbHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lNjQudHhfZnJhbWVzNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWU2NTEyNy50eF9mcmFtZXM2NTEyNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxMjgyNTUudHhfZnJhbWVzMTI4MjU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NjUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTI1NjUxMS50eF9mcmFtZXMyNTY1MTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTUxMjEwMjMudHhfZnJhbWVzNTEyMTAyMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0MTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTEwMjQxNTE4LnR4X2ZyYW1lczEwMjQxNTE4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMTUxOXBsdXMudHhfZnJhbWVzMTUxOXBsdXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX2RlbGF5X3RocmVzaC5xdWV1ZV9kZWxheV90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnF1ZXVlX2RlbGF5LnF1ZXVlX2RlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5mcmFtZXNfZHJvcHBlZC5mcmFtZXNfZHJvcHBlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ieXRlc19kcm9wcGVkLmJ5dGVzX2Ryb3BwZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuYnl0ZXNfZGVsYXllZC5ieXRlc19kZWxheWVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfYnl0ZXNfdW51c2VkLnR4X2J5dGVzX3VudXNlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRE9OVV9QT1JUX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTEzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF90eXBlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZG9udV9wb3J0X3R5cGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTMgPSAwOyBpMTMgPCB0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZV9jb3VudDsgaTEzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV9wYWNrKHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlW2kxM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NVU1BFTkRfUkVTVU1FX0FMQVJNX1JFUE9SVElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTQ7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRlZlwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3N1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNCA9IDA7IGkxNCA8IHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudDsgaTE0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfcGFjaygmdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmW2kxNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lQTUNfRk9SV0FSRElOR19SVUxFX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3NfcGFjayh0aGlzLT51LmlwbWNfZm9yd2FyZGluZ19ydWxlX2NvbmZpZ3VyYXRpb24uZmllbGRfYml0bWFwLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lUUElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lml0cGlkLmFsdGVybmF0ZV9pdHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lml0cGlkLmluc2VydF90aGlzX3RwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JUUElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmJ0cGlkLmFsdGVybmF0ZV9idHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmJ0cGlkLmluc2VydF90aGlzX3RwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NJUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jaXIuY29tbWl0ZWRfYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucXVldWVfY2lyLmNvbW1pdGVkX2luZm9ybWF0aW9uX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0VJUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9laXIuZXhjZXNzX2J1cnN0X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnF1ZXVlX2Vpci5xdWV1ZV9laXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZW5hYmxlX2NvbG9yX21hcmtpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5maWVsZF9jb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZmllbGRfaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5tc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLmxzYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZ3JlZW5fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy55ZWxsb3dfdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX1JBVEVfTElNSVRFUl9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5udW1iZXJfb2ZfcmF0ZV9saW1pdGVycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jYnNfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jaXJfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5lYnNfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5laXJfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNvbG9yX2F3YXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY291cGxpbmdfY29uZmlndXJhYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY291cGxpbmdfYmVoYXZpcm9fZGVmYXVsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNvbG9yX21hcmtpbmdfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLnNtYXJ0X2NvbG9yX2Ryb3ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NPVVBMSU5HX0ZMQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jb3VwbGluZ19mbGFnLmNvdXBsaW5nX2ZsYWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NMT0NLX1RSQU5TUE9SVF9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMucHBzX3B1bHNlX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5jbG9ja190cmFuc3BvcnRfY2FwYWJpbGl0aWVzLnRvZF9zdHJpbmdfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMudjJmcmFtZV9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkFCTEVfQ0xPQ0tfVFJBTlNQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5lbmFibGVfY2xvY2tfdHJhbnNwb3J0LnBwc19wdWxzZV9vdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5lbmFibGVfY2xvY2tfdHJhbnNwb3J0LnRvZF9zdHJpbmdfb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZW5hYmxlX2Nsb2NrX3RyYW5zcG9ydC52MmZyYW1lX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS50aW1lX3RyYW5zZmVyLm1wY3BfcmVmZXJlbmNlX3BvaW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRvZF9zdHJpbmdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV90aW1lX3RyYW5zZmVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nLCB0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZ19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFJPUEFHQVRJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5wcm9wYWdhdGlvbl9wYXJhbWV0ZXJzLm5kb3duKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5wcm9wYWdhdGlvbl9wYXJhbWV0ZXJzLm51cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlRUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnJ0dC5ydHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmRhY19jb25maWd1cmF0aW9uLnN0YWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmRhY19jb25maWd1cmF0aW9uLmN0YWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5kYWNfY29uZmlndXJhdGlvbl9lbmFibGVfZGlzYWJsZS5sbGRwX2luc3RhbmNlX3N0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lX2Jyb2FkY2FzdC5yeF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lc19icm9hZGNhc3QudHhfYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX01VTFRJQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZXNfbXVsdGljYXN0LnR4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWVzX211bHRpY2FzdC5yeF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9ieXRlc19ncmVlbi50eF9ieXRlc19ncmVlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfR1JFRU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfYnl0ZXNfZ3JlZW4ucnhfYnl0ZXNfZ3JlZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3BhY2soJnRoaXMtPnUub251X21jYXN0X2xsaWQubGxpZF92YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX0xFQVJORUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS51bmlfbWFjX2xlYXJuZWQubWFjX2FkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudW5pX21hY19sZWFybmVkLnVuaV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX1RBQkxFX0ZVTExfQkVIQVZJT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnVuaV9tYWNfdGFibGVfZnVsbF9iZWhhdmlvci5vdmVyX3dyaXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfUFdSX1NBVklOR19DQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZV9wYWNrKHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnB3cl9zYXZpbmdfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLmVhcmx5X3dha2VfdXBfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGRfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplID4gMCkgJiYgKHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbl9zcGVjX2ZpZWxkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3B3cl9zYXZpbmdfY2FwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkLCB0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfUEFTU1dPUkRfQ0hBTExFTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VORVJHWV9FRkZJQ0lFTlRfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19ESVNDQVJERUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUVESUFfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1CRVJfT0ZfUFJPR1JBTU1BQkxFX0NPVU5URVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BXUl9PVkVSX0VUSEVSTkVUX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFYX0ZSQU1FX1NJWkVfTElNSVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9JRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9JTkZPOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DSElQX0lORk86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBVEVfT0ZfTUFOVUZBQ1RVUkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFOVUZBQ1RVUkVSX0lORk86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9FUE9OX1BPUlRTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9VTklfUE9SVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUEFDS0VUX0JVRkZFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoKCgyICsgKDIgKiB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCkpICsgKDIgKiB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCkpICsgKDIgKiB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCkpICsgKDIgKiB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09BTV9SQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQUJMRV9TSVpFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5keW5fbWFjX3RhYmxlLm1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc3RhdGljX21hY190YWJsZS5tYWNfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTUFDX0FMTE9XRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MRU5fRVJSX0RJU0NBUkQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rcyA+IDApICYmICh0aGlzLT51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJudW1iZXJfb2ZfbGlua3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rczsgaTArKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb25baTBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzID4gMCkgJiYgKHRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm51bWJlcl9vZl9wb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbltpMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9GSUxFTkFNRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICh0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lX2NvdW50ICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNoLnN0YXRfdGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0g6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2guc3RhdF90aHJlc2hvbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0lOR1JFU1NfUlVMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MVUVfRklFTEQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX0NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfU1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JDX1JBVEVfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgKDcgKiB0aGlzLT51LmVncmVzc19zaGFwaW5nLm51bWJlcl9vZl9zaGFwZXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDUgKiB0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcubnVtYmVyX29mX3JhdGVfbGV2ZWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01GUl9OQU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZXQVJFX01GR19USU1FX1ZBUl9DVFJMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9WRU5ET1JfTkFNRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NT0RFTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9IV19WRVJTSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZV9jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1ZDQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX0JJQVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX1BPV0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcl9jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1MTI3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4MjU1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjQxNTE4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1MTI3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4MjU1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjQxNTE4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVlfVEhSRVNIOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRE9OVV9QT1JUX1RZUEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZV9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NVU1BFTkRfUkVTVU1FX0FMQVJNX1JFUE9SVElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lQTUNfRk9SV0FSRElOR19SVUxFX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQlRQSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ0lSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0VJUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT0xPUl9NQVJLSU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX1JBVEVfTElNSVRFUl9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NPVVBMSU5HX0ZMQUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ0xPQ0tfVFJBTlNQT1JUX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkFCTEVfQ0xPQ0tfVFJBTlNQT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RJTUVfVFJBTlNGRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgdGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmdfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QUk9QQUdBVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JUVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9CUk9BRENBU1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0JST0FEQ0FTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfR1JFRU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfR1JFRU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX01DQVNUX0xMSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub251X21jYXN0X2xsaWQubGxpZF92YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX0xFQVJORUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19UQUJMRV9GVUxMX0JFSEFWSU9SOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9QV1JfU0FWSU5HX0NBUDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRkxBR1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19QQVNTV09SRF9DSEFMTEVOR0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VORVJHWV9FRkZJQ0lFTlRfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19ESVNDQVJERUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfRElTQ0FSREVEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTkVfUkFURV9NT0RFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRURJQV9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1CRVJfT0ZfUFJPR1JBTU1BQkxFX0NPVU5URVJTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUFYX0ZSQU1FX1NJWkVfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFdSX09WRVJfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ZRUxMT1c6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19VTklDQVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9MMkVSUk9SUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfWUVMTE9XOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfTDJFUlJPUlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQVhfRlJBTUVfU0laRV9MSU1JVDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRlZi51bmtub3duX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXF1ZW5jZV9udW1iZXIuc2VxdW5jZV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2lkLmlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmlybXdhcmVfaW5mby5ib290X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmlybXdhcmVfaW5mby5ib290X2NyYzMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZpcm13YXJlX2luZm8uYXBwbGljYXRpb25fdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5maXJtd2FyZV9pbmZvLmFwcGxpY2F0aW9uX2NyYzMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DSElQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jaGlwX2luZm8uamVkZWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcF9pbmZvLmNoaXBfbW9kZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcF9pbmZvLmNoaXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRhdGVfb2ZfbWFudWZhY3R1cmUueWVhcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRhdGVfb2ZfbWFudWZhY3R1cmUubW9udGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kYXRlX29mX21hbnVmYWN0dXJlLmRheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFOVUZBQ1RVUkVSX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWZfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tYW51ZmFjdHVyZXJfaW5mb19jb3VudF9kZWYoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWYgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkZWZcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tYW51ZmFjdHVyZXJfaW5mb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWYsIHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTE9HSUNBTF9MSU5LUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1heF9sb2dpY2FsX2xpbmtzLmJpZGlyZWN0aW9uYWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWF4X2xvZ2ljYWxfbGlua3MuZG93bnN0cmVhbV9vbmx5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1fRVBPTl9QT1JUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm51bV9lcG9uX3BvcnRzLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9VTklfUE9SVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5udW1fdW5pX3BvcnRzLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BBQ0tFVF9CVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBhY2tldF9idWZmZXIudXBzdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci51cF9xdWV1ZXNfbWF4X3Blcl9saW5rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci51cF9xdWV1ZV9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRvd25zdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci5kbl9xdWV1ZXNfbWF4X3Blcl9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci5kbl9xdWV1ZV9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci50b3RhbF9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBhY2tldF9idWZmZXIudXBzdHJlYW1fcGFja2V0X2J1ZmZlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRvd25zcmVhbV9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDAgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQwXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQwID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDBbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMgPiAweDAwMDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0MVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQxID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDFbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cyA+IDB4MDAwMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDIgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkyKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MltpMl0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID4gMHgwMDAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTMrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQzW2kzXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGVfdW5wYWNrKCZ0aGlzLT51Lmxpbmtfc3RhdGUubGlua19zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vYW1fcmF0ZS5tYXhpbXVtX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub2FtX3JhdGUubWluaW11bV9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RBQkxFX1NJWkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5keW5fbGVhcm5fdGFibGVfc2l6ZS5tYXhfbWFjX2FsbG93ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5keW5fbGVhcm5fYWdlX2xpbWl0LmR5bmFtaWNfYWRkcmVzc19hZ2VfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmR5bl9tYWNfdGFibGUubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LnN0YXRpY19tYWNfdGFibGUubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfdW5wYWNrKCZ0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5tYXhpbXVtX2NhcGFiaWxpdGllcywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV91bnBhY2soJnRoaXMtPnUucG9ydF9jYXBhYmlsaXR5LmN1cnJlbnRfY2FwYWJpbGl0aWVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3VucGFjaygmdGhpcy0+dS5keW5fbGVhcm5fbW9kZS5sZWFybmluZ19tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1pbl9tYWNfbGltaXQubWluaW11bV9ndWFyYW50ZWVkX2xpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTUFDX0FMTE9XRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tYXhfbWFjX2FsbG93ZWQubWF4X2FsbG93ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hZ2dfbWFjX2xpbWl0LmFnZ3JlZ2F0ZV9tYWNfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sZW5fZXJyX2Rpc2NhcmQubGVuX2Vycm9yX2Rpc2NhcmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmxvb2RfdW5rbm93bi5mbG9vZF91bmtub3duKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubG9jYWxfc3dpdGNoaW5nLmxvY2FsX3N3aXRjaGluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfbGlua3MgPiAwKSAmJiAodGhpcy0+dS5xdWV1ZV9jb25maWcubGlua19jb25maWd1cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19jb25maWd1cmF0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbiA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rcyAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rczsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3VucGFjaygmdGhpcy0+dS5xdWV1ZV9jb25maWcubGlua19jb25maWd1cmF0aW9uW2k0XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9wb3J0cyA+IDApICYmICh0aGlzLT51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X2NvbmZpZ3VyYXRpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5xdWV1ZV9jb25maWcucG9ydF9jb25maWd1cmF0aW9uID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzOyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfdW5wYWNrKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb25baTVdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfRklMRU5BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX2ZpbGVuYW1lX2NvdW50X2Zpcm13YXJlX2ZpbGVuYW1lKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpcm13YXJlX2ZpbGVuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lLCB0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF91bnBhY2soJnRoaXMtPnUucG9ydF9zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfdW5wYWNrKCZ0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2guc3RhdF90aHJlc2hvbGQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmtleV9leHBpcnlfdGltZS50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51LmVuY3J5cHRfbW9kZS5lbmNyeXB0aW9uX21ldGhvZCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV91bnBhY2soJnRoaXMtPnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV91bnBhY2soJnRoaXMtPnUubHVlX2ZpZWxkLmZpZWxkX2NvZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdF91bnBhY2soJnRoaXMtPnUubHVlX2ZpZWxkLmxheWVyX3NlbGVjdCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sdWVfZmllbGQuYml0X3dvcmRfb2Zmc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubHVlX2ZpZWxkLmJpdF9vZmZzZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sdWVfZmllbGQuYml0X3dpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubHVlX2ZpZWxkLnJlZmVyZW5jZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX0NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsdF9jdmxhbl9ldGhlcnR5cGUudHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWx0X2N2bGFuX2V0aGVydHlwZS5pbnNlcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9TVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hbHRfc3ZsYW5fZXRoZXJ0eXBlLnRwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsdF9zdmxhbl9ldGhlcnR5cGUuaW5zZXJ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CQ19SQVRFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYmNfcmF0ZV9saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF91bnBhY2soJnRoaXMtPnUuZWdyZXNzX3NoYXBpbmcudHJhZmZpY190eXBlcywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHNfdW5wYWNrKCZ0aGlzLT51LmVncmVzc19zaGFwaW5nLnJhdGVfdW5pdHMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZWdyZXNzX3NoYXBpbmcubnVtYmVyX29mX3NoYXBlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVycyA+IDApICYmICh0aGlzLT51LmVncmVzc19zaGFwaW5nLnNoYXBlcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzaGFwZXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZWdyZXNzX3NoYXBpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5zaGFwZXJzID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVycyAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTYgPSAwOyBpNiA8IHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcubnVtYmVyX29mX3NoYXBlcnM7IGk2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcl91bnBhY2soJnRoaXMtPnUuZWdyZXNzX3NoYXBpbmcuc2hhcGVyc1tpNl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTc7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c191bnBhY2soJnRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5yYXRlX3VuaXRzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcubnVtYmVyX29mX3JhdGVfbGV2ZWxzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMgPiAwKSAmJiAodGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfbGV2ZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV9sZXZlbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9pbmdyZXNzX3BvbGljaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5yYXRlX2xldmVscyA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcubnVtYmVyX29mX3JhdGVfbGV2ZWxzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTcgPSAwOyBpNyA8IHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHM7IGk3KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWxfdW5wYWNrKCZ0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcucmF0ZV9sZXZlbHNbaTddLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV91bnBhY2soJnRoaXMtPnUuZmVjX21vZGUucnhfZG93biwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGVfdW5wYWNrKCZ0aGlzLT51LmZlY19tb2RlLnR4X3VwLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUZSX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21mcl9uYW1lX2NvdW50X21hbl9uYW1lKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubWZyX25hbWUubWFuX25hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hbl9uYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lLCB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GV0FSRV9NRkdfVElNRV9WQVJfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5md2FyZV9tZmdfdGltZV92YXJfY3RybC5jb2RlX2FjY2Vzc19zdGFydCwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmZ3YXJlX21mZ190aW1lX3Zhcl9jdHJsLmN2Y19hY2Nlc3Nfc3RhcnQsIDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9WRU5ET1JfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdmVuZG9yX25hbWVfY291bnRfdmVuZG9yX25hbWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuZG9yX25hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV92ZW5kb3JfbmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQgPiAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZSwgdGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTU9ERUxfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21vZGVsX251bWJlcl9jb3VudF9tb2RlbF9udW1iZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1vZGVsX251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21vZGVsX251bWJlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQgPiAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyLCB0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0hXX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9od192ZXJzaW9uX2NvdW50X2h3X3ZlcnNpb24oJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJod192ZXJzaW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfaHdfdmVyc2lvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQgPiAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb24sIHRoaXMtPnUuaHdfdmVyc2lvbi5od192ZXJzaW9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk4OworICAgICAgICAgICAgICAgIHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZV9jb3VudF9jdXJyZW50X3RlbXBlcmF0dXJlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF90ZW1wZXJhdHVyZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdGVtcGVyYXR1cmVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmUgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50OyBpOCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVbaThdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9WQ0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTk7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdmNjX2NvdW50X2N1cnJlbnRfdmNjKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjYyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImN1cnJlbnRfdmNjXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl92Y2NcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjYyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTkgPSAwOyBpOSA8IHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQ7IGk5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjW2k5XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfQklBUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9iaWFzX2NvdW50X2N1cnJlbnRfdHhfYmlhcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF90eF9iaWFzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9iaWFzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhcyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50ID4gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMCA9IDA7IGkxMCA8IHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc19jb3VudDsgaTEwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNbaTEwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTExOworICAgICAgICAgICAgICAgIHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlcl9jb3VudF9jdXJyZW50X3R4X3Bvd2VyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF90eF9wb3dlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdHhfcG93ZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXIgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTExID0gMDsgaTExIDwgdGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQ7IGkxMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJbaTExXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fUlhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTEyOworICAgICAgICAgICAgICAgIHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl9yeF9wb3dlcl9jb3VudF9jdXJyZW50X3J4X3Bvd2VyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF9yeF9wb3dlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fcnhfcG93ZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXIgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEyID0gMDsgaTEyIDwgdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQ7IGkxMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJbaTEyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfdW5pY2FzdF9mcmFtZXMucnhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfdW5pY2FzdF9mcmFtZXMudHhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lX3Rvb19zaG9ydC5yeF9mcmFtZXNfdG9vX3Nob3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU2NC5yeF9mcmFtZXM2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lNjUxMjcucnhfZnJhbWVzNjUxMjcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4MjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUxMjgyNTUucnhfZnJhbWVzMTI4MjU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NjUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lMjU2NTExLnJ4X2ZyYW1lczI1NjUxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU1MTIxMDIzLnJ4X2ZyYW1lczUxMjEwMjMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTEwMjQxNTE4LnJ4X2ZyYW1lczEwMjQxNTE4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUxNTE5cGx1cy5yeF9mcmFtZXMxNTE5cGx1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNjQudHhfZnJhbWVzNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTY1MTI3LnR4X2ZyYW1lczY1MTI3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyODI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMTI4MjU1LnR4X2ZyYW1lczEyODI1NSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTI1NjUxMS50eF9mcmFtZXMyNTY1MTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNTEyMTAyMy50eF9mcmFtZXM1MTIxMDIzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjQxNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxMDI0MTUxOC50eF9mcmFtZXMxMDI0MTUxOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMTUxOXBsdXMudHhfZnJhbWVzMTUxOXBsdXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfZGVsYXlfdGhyZXNoLnF1ZXVlX2RlbGF5X3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9kZWxheS5xdWV1ZV9kZWxheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mcmFtZXNfZHJvcHBlZC5mcmFtZXNfZHJvcHBlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmJ5dGVzX2Ryb3BwZWQuYnl0ZXNfZHJvcHBlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmJ5dGVzX2RlbGF5ZWQuYnl0ZXNfZGVsYXllZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfYnl0ZXNfdW51c2VkLnR4X2J5dGVzX3VudXNlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRE9OVV9QT1JUX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTEzOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZG9udV9wb3J0X3R5cGVfY291bnRfcG9ydF90eXBlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF90eXBlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZG9udV9wb3J0X3R5cGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGUgPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEzID0gMDsgaTEzIDwgdGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVfY291bnQ7IGkxMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGVfdW5wYWNrKCZ0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZVtpMTNdLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NVU1BFTkRfUkVTVU1FX0FMQVJNX1JFUE9SVElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTQ7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nX2NvdW50X2RlZigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGVmXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZiA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTQgPSAwOyBpMTQgPCB0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQ7IGkxNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zX3VucGFjaygmdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmW2kxNF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JUE1DX0ZPUldBUkRJTkdfUlVMRV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzX3VucGFjaygmdGhpcy0+dS5pcG1jX2ZvcndhcmRpbmdfcnVsZV9jb25maWd1cmF0aW9uLmZpZWxkX2JpdG1hcCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lUUElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaXRwaWQuYWx0ZXJuYXRlX2l0cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5pdHBpZC5pbnNlcnRfdGhpc190cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CVFBJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmJ0cGlkLmFsdGVybmF0ZV9idHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYnRwaWQuaW5zZXJ0X3RoaXNfdHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ0lSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY2lyLmNvbW1pdGVkX2J1cnN0X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY2lyLmNvbW1pdGVkX2luZm9ybWF0aW9uX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0VJUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2Vpci5leGNlc3NfYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9laXIucXVldWVfZWlyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT0xPUl9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZW5hYmxlX2NvbG9yX21hcmtpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLmZpZWxkX2NvZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLmZpZWxkX2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5tc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcubHNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLmdyZWVuX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy55ZWxsb3dfdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX1JBVEVfTElNSVRFUl9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLm51bWJlcl9vZl9yYXRlX2xpbWl0ZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY2JzX21pbl9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jaXJfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmVic19taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuZWlyX21pbl9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNvbG9yX2F3YXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jb3VwbGluZ19jb25maWd1cmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNvdXBsaW5nX2JlaGF2aXJvX2RlZmF1bHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNvbG9yX21hcmtpbmdfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuc21hcnRfY29sb3JfZHJvcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ09VUExJTkdfRkxBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY291cGxpbmdfZmxhZy5jb3VwbGluZ19mbGFnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DTE9DS19UUkFOU1BPUlRfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMucHBzX3B1bHNlX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMudG9kX3N0cmluZ19zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jbG9ja190cmFuc3BvcnRfY2FwYWJpbGl0aWVzLnYyZnJhbWVfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5BQkxFX0NMT0NLX1RSQU5TUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lbmFibGVfY2xvY2tfdHJhbnNwb3J0LnBwc19wdWxzZV9vdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQudG9kX3N0cmluZ19vdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQudjJmcmFtZV9vdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RJTUVfVFJBTlNGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50aW1lX3RyYW5zZmVyLm1wY3BfcmVmZXJlbmNlX3BvaW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZ19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3RpbWVfdHJhbnNmZXJfY291bnRfdG9kX3N0cmluZygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZ19jb3VudCA+IDApICYmICh0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRvZF9zdHJpbmdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV90aW1lX3RyYW5zZmVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZywgdGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BST1BBR0FUSU9OX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wcm9wYWdhdGlvbl9wYXJhbWV0ZXJzLm5kb3duKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnByb3BhZ2F0aW9uX3BhcmFtZXRlcnMubnVwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SVFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ydHQucnR0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRhY19jb25maWd1cmF0aW9uLnN0YWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb24uY3RhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRU5BQkxFX0RJU0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb25fZW5hYmxlX2Rpc2FibGUubGxkcF9pbnN0YW5jZV9zdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX0JST0FEQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lX2Jyb2FkY2FzdC5yeF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWVzX2Jyb2FkY2FzdC50eF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWVzX211bHRpY2FzdC50eF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWVzX211bHRpY2FzdC5yeF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2J5dGVzX2dyZWVuLnR4X2J5dGVzX2dyZWVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2J5dGVzX2dyZWVuLnJ4X2J5dGVzX2dyZWVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUNBU1RfTExJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF91bnBhY2soJnRoaXMtPnUub251X21jYXN0X2xsaWQubGxpZF92YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19MRUFSTkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS51bmlfbWFjX2xlYXJuZWQubWFjX2FkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS51bmlfbWFjX2xlYXJuZWQudW5pX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfVEFCTEVfRlVMTF9CRUhBVklPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS51bmlfbWFjX3RhYmxlX2Z1bGxfYmVoYXZpb3Iub3Zlcl93cml0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX1BXUl9TQVZJTkdfQ0FQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC5wd3Jfc2F2aW5nX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAuZWFybHlfd2FrZV91cF9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGRfc2l6ZSA+IDApICYmICh0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbl9zcGVjX2ZpZWxkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3B3cl9zYXZpbmdfY2FwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkLCB0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfUEFTU1dPUkRfQ0hBTExFTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VORVJHWV9FRkZJQ0lFTlRfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19ESVNDQVJERUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUVESUFfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1CRVJfT0ZfUFJPR1JBTU1BQkxFX0NPVU5URVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BXUl9PVkVSX0VUSEVSTkVUX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFYX0ZSQU1FX1NJWkVfTElNSVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DSElQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQU5VRkFDVFVSRVJfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWZhdWx0X2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChkZWZhdWx0X2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFYX0xPR0lDQUxfTElOS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1fRVBPTl9QT1JUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUEFDS0VUX0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEFCTEVfU0laRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFYX01BQ19BTExPV0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MRU5fRVJSX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2xpbmtzOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfcG9ydHM7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9saW5rcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQpICogbnVtYmVyX29mX2xpbmtzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCBudW1iZXJfb2ZfbGlua3M7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQpICogbnVtYmVyX29mX3BvcnRzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBudW1iZXJfb2ZfcG9ydHM7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9GSUxFTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJtd2FyZV9maWxlbmFtZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmZHVtbXkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChkdW1teSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX2ZpbGVuYW1lX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZmlybXdhcmVfZmlsZW5hbWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfQ1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX1NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JDX1JBVEVfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3NoYXBlcnM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9zaGFwZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcikgKiBudW1iZXJfb2Zfc2hhcGVycyk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG51bWJlcl9vZl9zaGFwZXJzICogNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9yYXRlX2xldmVsczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZudW1iZXJfb2ZfcmF0ZV9sZXZlbHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCkgKiBudW1iZXJfb2ZfcmF0ZV9sZXZlbHMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2ZfcmF0ZV9sZXZlbHMgKiA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01GUl9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hbl9uYW1lX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1hbl9uYW1lX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWFuX25hbWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GV0FSRV9NRkdfVElNRV9WQVJfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVkVORE9SX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmVuZG9yX25hbWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmVuZG9yX25hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2ZW5kb3JfbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01PREVMX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtb2RlbF9udW1iZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbW9kZWxfbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobW9kZWxfbnVtYmVyX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSFdfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBod192ZXJzaW9uX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGh3X3ZlcnNpb25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChod192ZXJzaW9uX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3RlbXBlcmF0dXJlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcGVyYXR1cmVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjdXJyZW50X3RlbXBlcmF0dXJlX2VsZW1fY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVkNDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdmNjX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmNjX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoY3VycmVudF92Y2NfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdHhfYmlhc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3R4X2JpYXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjdXJyZW50X3R4X2JpYXNfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3R4X3Bvd2VyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHhfcG93ZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjdXJyZW50X3R4X3Bvd2VyX2VsZW1fY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fUlhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF9yeF9wb3dlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3J4X3Bvd2VyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoY3VycmVudF9yeF9wb3dlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMjEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4MjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NjUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjQxNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9ERUxBWV9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3J0X3R5cGVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9ydF90eXBlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9ydF90eXBlX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TVVNQRU5EX1JFU1VNRV9BTEFSTV9SRVBPUlRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGVmYXVsdF9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZGVmYXVsdF9lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lQTUNfRk9SV0FSRElOR19SVUxFX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lUUElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQlRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DSVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9FSVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT0xPUl9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9SQVRFX0xJTUlURVJfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DT1VQTElOR19GTEFHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DTE9DS19UUkFOU1BPUlRfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQUJMRV9DTE9DS19UUkFOU1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2Rfc3RyaW5nX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0b2Rfc3RyaW5nX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodG9kX3N0cmluZ19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BST1BBR0FUSU9OX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SVFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRU5BQkxFX0RJU0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX0JST0FEQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0JST0FEQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX01VTFRJQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX01VTFRJQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfR1JFRU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0dSRUVOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUNBU1RfTExJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfTEVBUk5FRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfVEFCTEVfRlVMTF9CRUhBVklPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX1BXUl9TQVZJTkdfQ0FQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmVuX3NwZWNfZmllbGRfc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdmVuX3NwZWNfZmllbGRfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHZlbl9zcGVjX2ZpZWxkX3NpemUpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB2ZW5fc3BlY19maWVsZF9zaXplICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX1BBU1NXT1JEX0NIQUxMRU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkVSR1lfRUZGSUNJRU5UX0VUSEVSTkVUX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19ESVNDQVJERUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfRElTQ0FSREVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTkVfUkFURV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01FRElBX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNQkVSX09GX1BST0dSQU1NQUJMRV9DT1VOVEVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUFYX0ZSQU1FX1NJWkVfQ0FQQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QV1JfT1ZFUl9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19VTklDQVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfTDJFUlJPUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19VTklDQVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfTDJFUlJPUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BWF9GUkFNRV9TSVpFX0xJTUlUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWFudWZhY3R1cmVyX2luZm9fY291bnRfZGVmKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX2ZpbGVuYW1lX2NvdW50X2Zpcm13YXJlX2ZpbGVuYW1lKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDhfdCBkdW1teTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHVtbXkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21mcl9uYW1lX2NvdW50X21hbl9uYW1lKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3ZlbmRvcl9uYW1lX2NvdW50X3ZlbmRvcl9uYW1lKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21vZGVsX251bWJlcl9jb3VudF9tb2RlbF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfaHdfdmVyc2lvbl9jb3VudF9od192ZXJzaW9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdGVtcGVyYXR1cmVfY291bnRfY3VycmVudF90ZW1wZXJhdHVyZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3ZjY19jb3VudF9jdXJyZW50X3ZjYyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X2JpYXNfY291bnRfY3VycmVudF90eF9iaWFzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdHhfcG93ZXJfY291bnRfY3VycmVudF90eF9wb3dlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3J4X3Bvd2VyX2NvdW50X2N1cnJlbnRfcnhfcG93ZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZG9udV9wb3J0X3R5cGVfY291bnRfcG9ydF90eXBlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3N1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZ19jb3VudF9kZWYoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdGltZV90cmFuc2Zlcl9jb3VudF90b2Rfc3RyaW5nKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm1hY19hZGRyZXNzX2NvdW50ID4gMCkgJiYgKHRoaXMtPm1hY19hZGRyZXNzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5tYWNfYWRkcmVzc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlICp0aGlzKQoreworICAgIHJldHVybiAoNiAqIHRoaXMtPm1hY19hZGRyZXNzX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIHRoaXMtPm1hY19hZGRyZXNzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhidWYpOworICAgIGlmICgodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPiAwKSAmJiAodGhpcy0+bWFjX2FkZHJlc3MgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYWNfYWRkcmVzc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPm1hY19hZGRyZXNzX2NvdW50ICogc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5tYWNfYWRkcmVzc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IG1hY19hZGRyZXNzX2VsZW1fY291bnQgPSAwOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtYWNfYWRkcmVzc19lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG1hY19hZGRyZXNzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVfY291bnRfbWFjX2FkZHJlc3MoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV9wYWNrKHRoaXMtPmV2ZW50X2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5ldmVudF9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1NUQVRJU1RJQ1NfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ucmFpc2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2sodGhpcy0+dS5zdGF0aXN0aWNzX2FsYXJtLm9iamVjdF90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ub2JqZWN0X2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0uc3RhdF9icmFuY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0uc3RhdF9sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0tFWUVYQ0hBTkdFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9NQUNfVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9PTlVfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1dFUl9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5kZWYucmFpc2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2sodGhpcy0+dS5kZWYub2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLm9iamVjdF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+ZXZlbnRfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9TVEFUSVNUSUNTX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0tFWUVYQ0hBTkdFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9NQUNfVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9PTlVfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1dFUl9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGVfdW5wYWNrKCZ0aGlzLT5ldmVudF9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZXZlbnRfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9TVEFUSVNUSUNTX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5zdGF0aXN0aWNzX2FsYXJtLnJhaXNlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soJnRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zdGF0aXN0aWNzX2FsYXJtLm9iamVjdF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zdGF0aXN0aWNzX2FsYXJtLnN0YXRfYnJhbmNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zdGF0aXN0aWNzX2FsYXJtLnN0YXRfbGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9LRVlFWENIQU5HRV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfTUFDX1RBQkxFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfT05VX0JVU1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1JUX0RJU0FCTEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9XRVJfRkFJTFVSRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUuZGVmLnJhaXNlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soJnRoaXMtPnUuZGVmLm9iamVjdF90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5vYmplY3RfaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUgZXZlbnRfY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGVfdW5wYWNrKCZldmVudF9jb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZXZlbnRfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9TVEFUSVNUSUNTX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0tFWUVYQ0hBTkdFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9NQUNfVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9PTlVfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1dFUl9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfcGFjayh0aGlzLT51LmZpbGVfcmVhZC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlsZW5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV93cml0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID4gMTI4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZSwgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlsZV9kYXRhLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCA+IDApICYmICh0aGlzLT51LmZpbGVfZGF0YS5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEsIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlsZV9hY2suYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl9wYWNrKHRoaXMtPnUuZmlsZV9hY2suZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfV1JJVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9SRUFEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlX3VucGFjaygmdGhpcy0+dS5maWxlX3JlYWQuZmlsZV90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfV1JJVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2ZpbGVfd3JpdGVfY291bnRfZmlsZW5hbWUoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmaWxlbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9maWxlX3dyaXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZV9jb3VudCA+IDEyOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZSwgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZmlsZV9kYXRhLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCA+IDApICYmICh0aGlzLT51LmZpbGVfZGF0YS5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9maWxlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5maWxlX2RhdGEuZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmZpbGVfZGF0YS5kYXRhLCB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmZpbGVfYWNrLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3JfdW5wYWNrKCZ0aGlzLT51LmZpbGVfYWNrLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSBvcGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZV91bnBhY2soJm9wY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9SRUFEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxlbmFtZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmaWxlbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2ZpbGVfd3JpdGVfY291bnRfZmlsZW5hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lORk9fVExWX1RZUEVfRFBPRV9PQU1fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRwb2Vfb2FtX3N1cHBvcnQuZHBvZV9vYW1fdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lORk9fVExWX1RZUEVfRFBPRV9PQU1fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kcG9lX29hbV9zdXBwb3J0LmRwb2Vfb2FtX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV91OHZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19pZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX3R4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19zaW5nbGVfY29sbF9mcmFtZXMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfbXVsdGlwbGVfY29sbF9mcmFtZXMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19yeF9vay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2Zjc19lcnIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2FsaWduX2Vyci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfb2N0ZXRzX3R4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19kZWZlcnJlZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfbGF0ZV9jb2xsaXNpb25zLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2V4Y2Vzc2l2ZV9jb2xsaXNpb25zLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX2xvc3RfbWFjX3R4X2Vyci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2NhcnJpZXJfc2Vuc2VfZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19vY3RldHNfcnhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfbG9zdF9tYWNfcnhfZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19tY2FzdF9mcmFtZXNfdHhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2JjYXN0X2ZyYW1lc190eF9vay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19mcl9leGNlc3NpdmVfZGVmZXJyYWwudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX21jYXN0X2ZyYW1lc19yeF9vay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfYmNhc3RfZnJhbWVzX3J4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfaW5fcmFuZ2VfbGVuX2Vyci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19vdXRfb2ZfcmFuZ2VfbGVuX2Vyci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZV90b29fbG9uZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5tYWNfZW5hYmxlX3N0YXR1cy5zdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5tYWNfYWRkci5tYWNfYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGVfcGFjayh0aGlzLT51LnBoeV90eXBlLnR5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51LnBoeV9zeW1ib2xfZXJyX2R1cmluZ19jYXJyaWVyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZV9wYWNrKHRoaXMtPnUucGh5X2FkbWluX3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGVfcGFjayh0aGlzLT51Lm1hdV9tZWRpYV9hdmFpbC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjaygmdGhpcy0+dS5hdXRvX25lZ19pZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfcGFjayh0aGlzLT51LmF1dG9fbmVnX2FkbWluX3N0YXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWdfcGFjayh0aGlzLT51LmF1dG9fbmVnX3JlbW90ZV9zaWcudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnX3BhY2sodGhpcy0+dS5hdXRvX25lZ19hdXRvX2NmZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCA+IDApICYmICh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3BhY2sodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfcnhfdGVjaFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV9wYWNrKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfcGFjayh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3NlbGVjdF9hYmxlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl9wYWNrKHRoaXMtPnUuYXV0b19uZWdfYWRfc2VsZWN0X2FibGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3BhY2sodGhpcy0+dS5hdXRvX25lZ19yeF9zZWxlY3RfYWJsZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzX3BhY2sodGhpcy0+dS5tYWNfZHVwbGV4X3N0YXR1cy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZnVuY3Rpb25zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfbWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNbaTNdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfY3RybF9mcmFtZXNfdHgudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfY3RybF9mcmFtZXNfcngudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX3Vuc3VwcG9ydGVkX29wX3J4LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfY3RybF9wYXVzZV9kZWxheS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2N0cmxfcGF1c2VfdHgudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX3BhdXNlX3J4LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUub2FtX2xvY2FsX2Vycl9mcmFtZV9zZWNzX2V2ZW50LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5vYW1fbG9jYWxfZXJyX2ZyYW1lX3BlcmlvZF9ldmVudC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm9hbV9sb2NhbF9lcnJfZnJfc2VjX3N1bV9ldmVudC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5vYW1fZW11bF9jcmM4ZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX21hY19jdHJsX2ZyYW1lc190eC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9tYWNfY3RybF9mcmFtZXNfcngudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX2Rpc2NvdmVyeV93aW5kb3dfdHgudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9kaXNjb3ZlcnlfdGltZW91dC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZlY19jb3JyZWN0ZWRfYmxvY2tzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5mZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3MudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnRfcGFjayh0aGlzLT51LmZlY19hYmlsaXR5LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlX3BhY2sodGhpcy0+dS5mZWNfbW9kZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfR0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfZ2F0ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnX2Fjay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3R4X3JlZ2lzdGVyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnX3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVwb3J0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9yeF9nYXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdfYWNrLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfcnhfcmVnaXN0ZXIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9yeF9yZXBvcnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5tYWNfY29sbGlzaW9uX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+d2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX0FETUlOX0tFWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfT1BFUl9LRVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX1BSSToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfUFJJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0RJU0NBUkQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0VSUl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVElNRV9PRl9MQVNUX09QRVJfQ0hBTkdFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1VOS19QUk9UT0NPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX0NBUEFDSVRZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfTUFQOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0RVUF9FVkVOVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NRRV9URVNUX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BTElHTl9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9CVVJTVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVRFX0VWRU5UUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1ZFUllfTE9OR19FVkVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9URVhUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19pZC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX3R4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19zaW5nbGVfY29sbF9mcmFtZXMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfbXVsdGlwbGVfY29sbF9mcmFtZXMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19yeF9vay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2Zjc19lcnIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2FsaWduX2Vyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfb2N0ZXRzX3R4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19kZWZlcnJlZC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfbGF0ZV9jb2xsaXNpb25zLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2V4Y2Vzc2l2ZV9jb2xsaXNpb25zLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX2xvc3RfbWFjX3R4X2Vyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2NhcnJpZXJfc2Vuc2VfZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19vY3RldHNfcnhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfbG9zdF9tYWNfcnhfZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19tY2FzdF9mcmFtZXNfdHhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2JjYXN0X2ZyYW1lc190eF9vay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19mcl9leGNlc3NpdmVfZGVmZXJyYWwudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX21jYXN0X2ZyYW1lc19yeF9vay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfYmNhc3RfZnJhbWVzX3J4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfaW5fcmFuZ2VfbGVuX2Vyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19vdXRfb2ZfcmFuZ2VfbGVuX2Vyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZV90b29fbG9uZy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tYWNfZW5hYmxlX3N0YXR1cy5zdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1hY19hZGRyLm1hY19hZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV91bnBhY2soJnRoaXMtPnUucGh5X3R5cGUudHlwZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51LnBoeV9zeW1ib2xfZXJyX2R1cmluZ19jYXJyaWVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGVfdW5wYWNrKCZ0aGlzLT51LnBoeV9hZG1pbl9zdGF0ZS5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGVfdW5wYWNrKCZ0aGlzLT51Lm1hdV9tZWRpYV9hdmFpbC52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfaWQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZV91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfYWRtaW5fc3RhdGUudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19yZW1vdGVfc2lnLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19hdXRvX2NmZy52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eV9jb3VudF9jYXBhYmlsaXRpZXMoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNhcGFiaWxpdGllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc1tpMF0sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5X2NvdW50X2NhcGFiaWxpdGllcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCA+IDApICYmICh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNhcGFiaWxpdGllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzID0gKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNbaTFdLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfcnhfdGVjaF9jb3VudF9jYXBhYmlsaXRpZXMoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19yeF90ZWNoLmNhcGFiaWxpdGllc19jb3VudCA+IDApICYmICh0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfcnhfdGVjaFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzID0gKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNbaTJdLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfbG9jYWxfc2VsZWN0X2FibGUudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX2FkX3NlbGVjdF9hYmxlLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19yeF9zZWxlY3RfYWJsZS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51Lm1hY19kdXBsZXhfc3RhdHVzLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfbWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkX2NvdW50X2Z1bmN0aW9ucygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZnVuY3Rpb25zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfbWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9ucyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNbaTNdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX2ZyYW1lc190eC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfdW5zdXBwb3J0ZWRfb3BfcngudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX3BhdXNlX2RlbGF5LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfY3RybF9wYXVzZV90eC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfcGF1c2VfcngudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5vYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm9hbV9sb2NhbF9lcnJfZnJhbWVfcGVyaW9kX2V2ZW50LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUub2FtX2xvY2FsX2Vycl9mcl9zZWNfc3VtX2V2ZW50LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm9hbV9lbXVsX2NyYzhlcnIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfbWFjX2N0cmxfZnJhbWVzX3R4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX21hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfZGlzY292ZXJ5X3dpbmRvd190eC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX2Rpc2NvdmVyeV90aW1lb3V0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmVjX2NvcnJlY3RlZF9ibG9ja3MudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmVjX3VuY29ycmVjdGFibGVfYmxvY2tzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3VucGFjaygmdGhpcy0+dS5mZWNfYWJpbGl0eS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlX3VucGFjaygmdGhpcy0+dS5mZWNfbW9kZS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX3R4X2dhdGUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX3R4X3JlZ19hY2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF90eF9yZWdpc3Rlci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX3R4X3JlZ19yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX3R4X3JlcG9ydC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfcnhfZ2F0ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfcnhfcmVnX2Fjay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX3J4X3JlZ2lzdGVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfcnhfcmVnX3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfcnhfcmVwb3J0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWFjX2NvbGxpc2lvbl9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX0FETUlOX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BR0dfT1JfSU5ESVZJRFVBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19DT0xMRUNUT1JfTUFYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTElOS19VUF9ET1dOX05PVElGWV9FTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUE9SVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVElNRV9PRl9MQVNUX09QRVJfQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfRkFMU0VfQ0FSUklFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSURMRV9FUlJPUl9DT1VOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9KQUJCRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VWRU5UX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX0RFVklDRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5JUVVFX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZSQU1FU19UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVNUX1NPVVJDRV9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVRFX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NPVVJDRV9BRERSX0NIQU5HRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9URVhUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RYX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoY2FwYWJpbGl0aWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoY2FwYWJpbGl0aWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZ1bmN0aW9uc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmdW5jdGlvbnNfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX0FETUlOX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BR0dfT1JfSU5ESVZJRFVBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19DT0xMRUNUT1JfTUFYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTElOS19VUF9ET1dOX05PVElGWV9FTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUE9SVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVElNRV9PRl9MQVNUX09QRVJfQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfRkFMU0VfQ0FSUklFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSURMRV9FUlJPUl9DT1VOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9KQUJCRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VWRU5UX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX0RFVklDRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5JUVVFX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZSQU1FU19UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVNUX1NPVVJDRV9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVRFX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NPVVJDRV9BRERSX0NIQU5HRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9URVhUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RYX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5X2NvdW50X2NhcGFiaWxpdGllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoX2NvdW50X2NhcGFiaWxpdGllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRfY291bnRfZnVuY3Rpb25zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUE9SVF9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUE9SVF9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9wYWNrKCZ0aGlzLT51Lm9iamVjdC5vYmplY3RfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfcGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuc3RhbmRhcmRfYWN0aW9uLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGVmLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2JqZWN0Lm9iamVjdF9jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc3RhbmRhcmRfYXR0cmlidXRlLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91bnBhY2soJnRoaXMtPnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2FjdGlvbi5hY3Rpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV9wYWNrKHRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfcGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlX3BhY2sodGhpcy0+dS5tY2FzdF9yZWcuYWN0aW9uX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWNhc3RfcmVnLm11bHRpY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZV9wYWNrKHRoaXMtPnUubWNhc3RfcmVnX3Jlc3Auc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1jYXN0X3JlZ19yZXNwLm11bHRpY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCA+IDApICYmICh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJrZXlfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2tleV9leGNoYW5nZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfcGFjaygmdGhpcy0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb25fcGFjayh0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5keW5hbWljX2lwbWNhc3RfY3RybC5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmlwc2EsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmlwZGEsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmNsaWVudF9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfcGFjayh0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsX3Jlc3AucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl9wYWNrKHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwuaXBzYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5pcGRhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLnBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZV9wYWNrKHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybF9yZXNwLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc1tpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc1tpMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl91bnBhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X3JlZy5hY3Rpb25fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5tY2FzdF9yZWcubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3VucGFjaygmdGhpcy0+dS5tY2FzdF9yZWdfcmVzcC5zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUubWNhc3RfcmVnX3Jlc3AubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwia2V5X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9rZXlfZXhjaGFuZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5keW5hbWljX2lwbWNhc3RfY3RybC5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuaXBzYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5keW5hbWljX2lwbWNhc3RfY3RybC5pcGRhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5keW5hbWljX2lwbWNhc3RfY3RybC5jbGllbnRfbWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3VucGFjaygmdGhpcy0+dS5keW5hbWljX2lwbWNhc3RfY3RybF9yZXNwLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwuaXBzYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLmlwZGEsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwucG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3VucGFjaygmdGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsX3Jlc3AucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSBvcDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soJm9wLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZrZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICoga2V5X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBrZXlfbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Jfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWFqb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pbm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb21fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51bml4X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnJhbmRvbSwgMjgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb20gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dW5peF90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnJhbmRvbSwgMjgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5zZXNzaW9uX2lkID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlc3Npb25faWRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbmd0aCA+IDMyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnNlc3Npb25faWQsIHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkICp0aGlzKQoreworICAgIHJldHVybiAxICsgdGhpcy0+bGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+c2Vzc2lvbl9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlc3Npb25faWRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+c2Vzc2lvbl9pZCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbmd0aCA+IDMyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+c2Vzc2lvbl9pZCwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGxlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+Y2lwaGVyc3VpdGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNpcGhlcnN1aXRlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW5ndGg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfcGFjayh0aGlzLT5jaXBoZXJzdWl0ZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMiAqIHRoaXMtPmxlbmd0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+Y2lwaGVyc3VpdGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2lwaGVyc3VpdGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmNpcGhlcnN1aXRlcyA9IChiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW5ndGggKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuZ3RoOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX3VucGFjaygmdGhpcy0+Y2lwaGVyc3VpdGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlKSAqIGxlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPm1ldGhvZHMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWV0aG9kc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW5ndGg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3BhY2sodGhpcy0+bWV0aG9kc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArIHRoaXMtPmxlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+bWV0aG9kcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1ldGhvZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+bWV0aG9kcyA9IChiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuZ3RoICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW5ndGg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3VucGFjaygmdGhpcy0+bWV0aG9kc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kKSAqIGxlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIHVpbnQzMl90IGkwOworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudCA+IDApICYmICh0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0ID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2xpc3RcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3BhY2soJnRoaXMtPmNlcnRpZmljYXRlX2xpc3RbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDI0X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdWludDMyX3RfdG9fdWludDI0X3QoYnl0ZXNBZnRlckxlbkZpZWxkKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDI0X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPmNlcnRpZmljYXRlX2xpc3RfY291bnQgPiAwKSAmJiAodGhpcy0+Y2VydGlmaWNhdGVfbGlzdCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjZXJ0aWZpY2F0ZV9saXN0X2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2VydGlmaWNhdGVfbGlzdFtpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MjRfdCBjZXJ0aWZpY2F0ZV9saXN0X3NpemUgPSB1aW50MzJfdF90b191aW50MjRfdCgwKTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KGJ1ZiwgJmNlcnRpZmljYXRlX2xpc3Rfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB1aW50MjRfdF90b191aW50MzJfdChjZXJ0aWZpY2F0ZV9saXN0X3NpemUpLCBidWYtPmN1cnIpOworICAgIHRoaXMtPmNlcnRpZmljYXRlX2xpc3RfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfY291bnRfY2VydGlmaWNhdGVfbGlzdCgmcG9zdExlbkJ1Zik7CisgICAgaWYgKCh0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50ID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX2xpc3QgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjZXJ0aWZpY2F0ZV9saXN0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmNlcnRpZmljYXRlX2xpc3QgPSAoYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3VucGFjaygmdGhpcy0+Y2VydGlmaWNhdGVfbGlzdFtpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIHVpbnQyNF90X3RvX3VpbnQzMl90KGNlcnRpZmljYXRlX2xpc3Rfc2l6ZSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQyNF90IGxlbmd0aDsKKyAgICB1aW50MzJfdCBjZXJ0aWZpY2F0ZV9saXN0X2VsZW1fY291bnQgPSAwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgdWludDI0X3RfdG9fdWludDMyX3QobGVuZ3RoKSwgcGFja2VkLT5jdXJyKTsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2VydGlmaWNhdGVfbGlzdF9lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGNlcnRpZmljYXRlX2xpc3RfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVpbnQyNF90X3RvX3VpbnQzMl90KGxlbmd0aCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X2NvdW50X2NlcnRpZmljYXRlX2xpc3QoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5jZXJ0aWZpY2F0ZV90eXBlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjZXJ0aWZpY2F0ZV90eXBlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbmd0aDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX3BhY2sodGhpcy0+Y2VydGlmaWNhdGVfdHlwZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0ICp0aGlzKQoreworICAgIHJldHVybiAxICsgdGhpcy0+bGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+Y2VydGlmaWNhdGVfdHlwZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjZXJ0aWZpY2F0ZV90eXBlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmNlcnRpZmljYXRlX3R5cGVzID0gKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuZ3RoICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuZ3RoOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfdW5wYWNrKCZ0aGlzLT5jZXJ0aWZpY2F0ZV90eXBlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlKSAqIGxlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGVfcGFjayh0aGlzLT5pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmlkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby52ZXJzaW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb21fcGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8ucmFuZG9tLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3BhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLnNlc3Npb25faWQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfcGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8uY2lwaGVyX3N1aXRlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jb21wcmVzc2lvbl9tZXRob2RzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3BhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9wYWNrKCZ0aGlzLT51LnNlcnZlcl9oZWxsby5yYW5kb20sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfcGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uc2Vzc2lvbl9pZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfcGFjayh0aGlzLT51LnNlcnZlcl9oZWxsby5jaXBoZXJzdWl0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3BhY2sodGhpcy0+dS5zZXJ2ZXJfaGVsbG8uY29tcHJlc3Npb25fbWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfcGFjaygmdGhpcy0+dS5jZXJ0aWZpY2F0ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNlcnRpZmljYXRlX3JlcXVlc3QuY2VydGlmaWNhdGVfdHlwZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfcGFjaygmdGhpcy0+dS5jZXJ0aWZpY2F0ZV9yZXF1ZXN0LmNlcnRpZmljYXRlX2F1dGhvcml0aWVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPX0RPTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1ZFUklGWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5Lmhhc2hfc2l6ZSA+IDApICYmICh0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5lbmNyeXB0ZWRfaGFzaCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbmNyeXB0ZWRfaGFzaFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2NlcnRpZmljYXRlX3ZlcmlmeVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5lbmNyeXB0ZWRfaGFzaCwgdGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5zaXplID4gMCkgJiYgKHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5lbmNyeXB0ZWRfcHJlX21hc3Rlcl9zZWNyZXQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfY2xpZW50X2tleV9leGNoYW5nZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0LCB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9GSU5JU0hFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZXJpZnlfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2ZpbmlzaGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGEsIHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfSEVMTE9fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDI0X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdWludDMyX3RfdG9fdWludDI0X3QoYnl0ZXNBZnRlckxlbkZpZWxkKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDI0X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDQ7CisgICAgc3dpdGNoICh0aGlzLT5pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfSEVMTE86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzQgKyBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2xpZW50X2hlbGxvLnNlc3Npb25faWQpICsgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jaXBoZXJfc3VpdGVzKSArIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jbGllbnRfaGVsbG8uY29tcHJlc3Npb25fbWV0aG9kcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzNyArIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uc2Vzc2lvbl9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jZXJ0aWZpY2F0ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2VydGlmaWNhdGVfcmVxdWVzdC5jZXJ0aWZpY2F0ZV90eXBlcykgKyBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2VydGlmaWNhdGVfcmVxdWVzdC5jZXJ0aWZpY2F0ZV9hdXRob3JpdGllcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMT19ET05FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURV9WRVJJRlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArIHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5Lmhhc2hfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0ZJTklTSEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0hFTExPX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfS0VZX0VYQ0hBTkdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MjRfdCBsZW5ndGggPSB1aW50MzJfdF90b191aW50MjRfdCgwKTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3VucGFjaygmdGhpcy0+aWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB1aW50MjRfdF90b191aW50MzJfdChsZW5ndGgpLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+aWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3VucGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8udmVyc2lvbiwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV91bnBhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLnJhbmRvbSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfdW5wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5zZXNzaW9uX2lkLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF91bnBhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLmNpcGhlcl9zdWl0ZXMsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X3VucGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8uY29tcHJlc3Npb25fbWV0aG9kcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT51LnNlcnZlcl9oZWxsby52ZXJzaW9uLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3VucGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8ucmFuZG9tLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF91bnBhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLnNlc3Npb25faWQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV91bnBhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLmNpcGhlcnN1aXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZF91bnBhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLmNvbXByZXNzaW9uX21ldGhvZCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNlcnRpZmljYXRlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF91bnBhY2soJnRoaXMtPnUuY2VydGlmaWNhdGVfcmVxdWVzdC5jZXJ0aWZpY2F0ZV90eXBlcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNlcnRpZmljYXRlX3JlcXVlc3QuY2VydGlmaWNhdGVfYXV0aG9yaXRpZXMsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPX0RPTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1ZFUklGWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplID4gMCkgJiYgKHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5LmVuY3J5cHRlZF9oYXNoID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW5jcnlwdGVkX2hhc2hcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9jZXJ0aWZpY2F0ZV92ZXJpZnlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuZW5jcnlwdGVkX2hhc2ggPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5lbmNyeXB0ZWRfaGFzaCwgdGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemUgPiAwKSAmJiAodGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2NsaWVudF9rZXlfZXhjaGFuZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldCwgdGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfRklOSVNIRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2ZpbmlzaGVkX2NvdW50X3ZlcmlmeV9kYXRhKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlcmlmeV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhLCB0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0hFTExPX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfS0VZX0VYQ0hBTkdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCB1aW50MjRfdF90b191aW50MzJfdChsZW5ndGgpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSBpZDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDI0X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZV91bnBhY2soJmlkLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgdWludDI0X3RfdG9fdWludDMyX3QobGVuZ3RoKSwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGlkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMT19ET05FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURV9WRVJJRlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaGFzaF9zaXplOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJmhhc2hfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGhhc2hfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGhhc2hfc2l6ZSAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBzaXplOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1Ziwgc2l6ZSAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfRklOSVNIRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmVyaWZ5X2RhdGFfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmVyaWZ5X2RhdGFfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2ZXJpZnlfZGF0YV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfSEVMTE9fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVpbnQyNF90X3RvX3VpbnQzMl90KGxlbmd0aCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRfY291bnRfdmVyaWZ5X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfcGFjayh0aGlzLT5jb250ZW50X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaGFuZHNoYWtlX3JlY29yZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9oYW5kc2hha2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3BhY2soJnRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQVBQTElDQVRJT05fREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaGFuZHNoYWtlX3JlY29yZHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQVBQTElDQVRJT05fREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfdW5wYWNrKCZ0aGlzLT5jb250ZW50X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5jb250ZW50X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0hBTkRTSEFLRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2hhbmRzaGFrZV9jb3VudF9oYW5kc2hha2VfcmVjb3JkcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImhhbmRzaGFrZV9yZWNvcmRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfaGFuZHNoYWtlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzID0gKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3VucGFjaygmdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQVBQTElDQVRJT05fREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIGNvbnRlbnRfdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfdW5wYWNrKCZjb250ZW50X3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhbmRzaGFrZV9yZWNvcmRzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZV9yZWNvcmRzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoaGFuZHNoYWtlX3JlY29yZHNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQVBQTElDQVRJT05fREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9oYW5kc2hha2VfY291bnRfaGFuZHNoYWtlX3JlY29yZHMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFnc19wYWNrKHRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwODApID09IDB4MDA4MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwODApID09IDB4MDA4MCkgJiYgKCgodWludDY0X3QpIHRoaXMtPmZsYWdzICYgMHgwMDQwKSA9PSAwKSkpCisgICAgeworICAgICAgICBpZiAoKHRoaXMtPnRsc19yZWNvcmRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnRsc19yZWNvcmRzID09IE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGxzX3JlY29yZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT50bHNfcmVjb3Jkc19jb3VudDsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9wYWNrKCZ0aGlzLT50bHNfcmVjb3Jkc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+dGxzX3JlY29yZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dGxzX3JlY29yZHMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGxzX3JlY29yZHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dGxzX3JlY29yZHNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dGxzX3JlY29yZHNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfdW5wYWNrKCZ0aGlzLT5mbGFncywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPmZsYWdzICYgMHgwMDgwKSA9PSAweDAwODApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCgodWludDY0X3QpIHRoaXMtPmZsYWdzICYgMHgwMDgwKSA9PSAweDAwODApICYmICgoKHVpbnQ2NF90KSB0aGlzLT5mbGFncyAmIDB4MDA0MCkgPT0gMCkpKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGxzX3JlY29yZHNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX2NvdW50X3Rsc19yZWNvcmRzKGJ1Zik7CisgICAgICAgIGlmICgodGhpcy0+dGxzX3JlY29yZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dGxzX3JlY29yZHMgPT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGxzX3JlY29yZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dGxzX3JlY29yZHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT50bHNfcmVjb3Jkc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnRsc19yZWNvcmRzX2NvdW50OyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3VucGFjaygmdGhpcy0+dGxzX3JlY29yZHNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgdGxzX3JlY29yZHNfZWxlbV9jb3VudCA9IDA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0bHNfcmVjb3Jkc19lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHRsc19yZWNvcmRzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQpKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfY291bnRfdGxzX3JlY29yZHMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV9wYWNrKHRoaXMtPnN1Yl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3ViX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfU1VCVFlQRV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfcGFjaygmdGhpcy0+dS5hdXRoZW50aWNhdGlvbi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5zdWJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19TVUJUWVBFX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYXV0aGVudGljYXRpb24udmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfdW5wYWNrKCZ0aGlzLT5zdWJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX1NVQlRZUEVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX3VucGFjaygmdGhpcy0+dS5hdXRoZW50aWNhdGlvbi52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUgc3ViX3R5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfdW5wYWNrKCZzdWJfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX1NVQlRZUEVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3BhY2sodGhpcy0+Y29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9wYWNrKCZ0aGlzLT51LnJlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3BhY2soJnRoaXMtPnUucmVzcG9uc2UudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1NVQ0NFU1M6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA0OworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlcXVlc3QudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZXNwb25zZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3VucGFjaygmdGhpcy0+Y29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSA0LCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfdW5wYWNrKCZ0aGlzLT51LnJlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl91bnBhY2soJnRoaXMtPnUucmVzcG9uc2UudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9TVUNDRVNTOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgY29kZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3VucGFjaygmY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gNCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1NVQ0NFU1M6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX1BBQ0tFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfcGFjaygmdGhpcy0+dS5wYWNrZXQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfQVNGX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9MT0dPRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTUtBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX1NUQVJUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfUEFDS0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucGFja2V0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0FTRl9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTE9HT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX01LQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9TVEFSVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfUEFDS0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV91bnBhY2soJnRoaXMtPnUucGFja2V0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9BU0ZfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0xPR09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9NS0E6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfU1RBUlQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfUEFDS0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0FTRl9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTE9HT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX01LQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9TVEFSVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl9wYWNrKHRoaXMtPnZlcnNpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT52ZXJzaW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVkVSU0lPTl9WRVJTSU9OMjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfcGFjaygmdGhpcy0+dS5kZWYudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnZlcnNpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9WRVJTSU9OX1ZFUlNJT04yOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZGVmLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3VucGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnZlcnNpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9WRVJTSU9OX1ZFUlNJT04yOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV91bnBhY2soJnRoaXMtPnUuZGVmLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbiB2ZXJzaW9uOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb25fdW5wYWNrKCZ2ZXJzaW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodmVyc2lvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1ZFUlNJT05fVkVSU0lPTjI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgcmV0ID0gMDsKKyAgICByZXQgfD0gKCh0aGlzLT5wY3AgJiAweDAwMDcpIDw8IDEzKTsKKyAgICByZXQgfD0gKCh0aGlzLT5jZmkgJiAweDAwMDEpIDw8IDEyKTsKKyAgICByZXQgfD0gKHRoaXMtPnZpZCAmIDB4MEZGRik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHJldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IHZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB0aGlzLT5wY3AgPSAoKHZhbCA+PiAxMykgJiAweDAwMDcpOworICAgIHRoaXMtPmNmaSA9ICgodmFsID4+IDEyKSAmIDB4MDAwMSk7CisgICAgdGhpcy0+dmlkID0gKHZhbCAmIDB4MEZGRik7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCByZXQgPSAwOworICAgIHJldCB8PSAoKHRoaXMtPnBjcCAmIDB4MDAwNykgPDwgMjkpOworICAgIHJldCB8PSAoKHRoaXMtPmRlaSAmIDB4MDAwMSkgPDwgMjgpOworICAgIHJldCB8PSAoKHRoaXMtPnVjYSAmIDB4MDAwMSkgPDwgMjcpOworICAgIHJldCB8PSAoKHRoaXMtPnJlcyAmIDB4MDAwNykgPDwgMjQpOworICAgIHJldCB8PSAodGhpcy0+aXNpZCAmIDB4MDBGRkZGRkZVTCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHJldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IHZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB0aGlzLT5wY3AgPSAoKHZhbCA+PiAyOSkgJiAweDAwMDcpOworICAgIHRoaXMtPmRlaSA9ICgodmFsID4+IDI4KSAmIDB4MDAwMSk7CisgICAgdGhpcy0+dWNhID0gKCh2YWwgPj4gMjcpICYgMHgwMDAxKTsKKyAgICB0aGlzLT5yZXMgPSAoKHZhbCA+PiAyNCkgJiAweDAwMDcpOworICAgIHRoaXMtPmlzaWQgPSAodmFsICYgMHgwMEZGRkZGRlVMKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfQUxBUk1fUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmV4dGVuc2lvbl9zdXBwb3J0LnZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfcGFjayh0aGlzLT51LmV4dGVuc2lvbl9zdXBwb3J0LnJlcG9ydF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfcGFjayh0aGlzLT51LmV4dGVuc2lvbl9zdXBwb3J0LnByZWZlcnJlZF9yZXBvcnRfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9MSU5LOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0FMQVJNX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfRVhURU5TSU9OX1NVUFBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0xJTks6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfQUxBUk1fUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmV4dGVuc2lvbl9zdXBwb3J0LnZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfdW5wYWNrKCZ0aGlzLT51LmV4dGVuc2lvbl9zdXBwb3J0LnJlcG9ydF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfdW5wYWNrKCZ0aGlzLT51LmV4dGVuc2lvbl9zdXBwb3J0LnByZWZlcnJlZF9yZXBvcnRfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9MSU5LOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlIHR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0FMQVJNX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfRVhURU5TSU9OX1NVUFBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfTElOSzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfcGFjayh0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3BhY2soJnRoaXMtPnUudGVrLnRsdnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmN0Yy5leHRlbnNpb25fc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jdGMudmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN1cHBfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfcGFjaygmdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl9wYWNrKCZ0aGlzLT51LmRwb2UuZHBvZV9pbmZvX3RsdiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDQ7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS50ZWsudGx2cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoNCAqIHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kcG9lLmRwb2VfaW5mb190bHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBidWYtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3VucGFjaygmdGhpcy0+dS50ZWsudGx2cywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY3RjLmV4dGVuc2lvbl9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY3RjLnZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNfY291bnRfc3VwcF92ZXJzaW9uKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdXBwX3ZlcnNpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fY3RjXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbiA9IChiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyX3VucGFjaygmdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdW5wYWNrKCZ0aGlzLT51LmRwb2UuZHBvZV9pbmZvX3RsdiwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMiwgcGFja2VkLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgJnBvc3RMZW5CdWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VwcF92ZXJzaW9uX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3VwcF92ZXJzaW9uX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc3VwcF92ZXJzaW9uX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoIC0gMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fY3RjX2NvdW50X3N1cHBfdmVyc2lvbihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5vYW1fdmVyc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnJldmlzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZ19wYWNrKHRoaXMtPm9hbV9jb25maWcsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1heF9wZHVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfcGFjayh0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMiwgYnVmLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPm9hbV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZ191bnBhY2soJnRoaXMtPm9hbV9jb25maWcsICZwb3N0TGVuQnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT5tYXhfcGR1X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvbiwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fcGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3BhY2soJnRoaXMtPnUucmVtb3RlLmluZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfTE9DQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fcGFjaygmdGhpcy0+dS5sb2NhbC5pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfTE9DQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb191bnBhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fdW5wYWNrKCZ0aGlzLT51LnJlbW90ZS5pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfTE9DQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fdW5wYWNrKCZ0aGlzLT51LmxvY2FsLmluZm8sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX1JFTU9URToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfcGFjayh0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfcGFjayh0aGlzLT51LnRlay5hbGFybV9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS50ZWsucmFpc2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50ZWsucG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudGVrLmxpbmspKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRlay5xdWV1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfcGFjayh0aGlzLT51LnRlay5hbGFybV9jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV9wYWNrKCZ0aGlzLT51LmRwb2UudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfcGFjaygmdGhpcy0+dS5jdGMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNDsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kcG9lLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jdGMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMiwgYnVmLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJnRoaXMtPm91aSwgJnBvc3RMZW5CdWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjaygmdGhpcy0+dS50ZWsuYWxhcm1fY29kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRlay5yYWlzZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudGVrLnBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudGVrLmxpbmspKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudGVrLnF1ZXVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF91bnBhY2soJnRoaXMtPnUudGVrLmFsYXJtX2NvbnRleHQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmRwb2UudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X3VucGFjaygmdGhpcy0+dS5jdGMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMiwgcGFja2VkLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgJnBvc3RMZW5CdWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoIC0gMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3BhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfUEVSSU9EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9TRUNPTkRTX1NVTU1BUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX1NZTUJPTF9QRVJJT0Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9QRVJJT0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1NFQ09ORFNfU1VNTUFSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfU1lNQk9MX1BFUklPRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3VucGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1BFUklPRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfU0VDT05EU19TVU1NQVJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9TWU1CT0xfUEVSSU9EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfUEVSSU9EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9TRUNPTkRTX1NVTU1BUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX1NZTUJPTF9QRVJJT0Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3RfcGFjayh0aGlzLT51Lm9iamVjdC5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZV9wYWNrKHRoaXMtPnUucGFja2FnZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmdfcGFjayh0aGlzLT51Lm5hbWVfYmluZGluZy5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF91bnBhY2soJnRoaXMtPnUub2JqZWN0LmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3VucGFjaygmdGhpcy0+dS5wYWNrYWdlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ191bnBhY2soJnRoaXMtPnUubmFtZV9iaW5kaW5nLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF9wYWNrKHRoaXMtPnUub2JqZWN0LmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub2JqZWN0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9iamVjdC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vYmplY3QudmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vYmplY3QudmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX29iamVjdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9iamVjdC52YWx1ZSwgdGhpcy0+dS5vYmplY3QudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZV9wYWNrKHRoaXMtPnUucGFja2FnZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBhY2thZ2Uud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2FnZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucGFja2FnZS52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfcGFja2FnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnBhY2thZ2UudmFsdWUsIHRoaXMtPnUucGFja2FnZS52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ19wYWNrKHRoaXMtPnUubmFtZV9iaW5kaW5nLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm5hbWVfYmluZGluZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX25hbWVfYmluZGluZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZSwgdGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hdHRyaWJ1dGUud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hdHRyaWJ1dGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWUsIHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hY3Rpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWN0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFjdGlvbi52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmFjdGlvbi52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYWN0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuYWN0aW9uLnZhbHVlLCB0aGlzLT51LmFjdGlvbi52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMyArIHRoaXMtPnUub2JqZWN0LnZhbHVlX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMyArIHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0X3VucGFjaygmdGhpcy0+dS5vYmplY3QubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9iamVjdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub2JqZWN0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub2JqZWN0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vYmplY3Qud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vYmplY3QudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX29iamVjdF9jb3VudF92YWx1ZSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm9iamVjdC52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9vYmplY3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vYmplY3QudmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vYmplY3QudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub2JqZWN0LnZhbHVlLCB0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vYmplY3Qud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9iamVjdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZV91bnBhY2soJnRoaXMtPnUucGFja2FnZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucGFja2FnZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGFja2FnZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBhY2thZ2Uud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBhY2thZ2Uud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrYWdlX2NvdW50X3ZhbHVlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucGFja2FnZS52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LnBhY2thZ2UudmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfcGFja2FnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnBhY2thZ2UudmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnBhY2thZ2UudmFsdWUsIHRoaXMtPnUucGFja2FnZS52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wYWNrYWdlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wYWNrYWdlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ191bnBhY2soJnRoaXMtPnUubmFtZV9iaW5kaW5nLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm5hbWVfYmluZGluZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm5hbWVfYmluZGluZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9uYW1lX2JpbmRpbmdfY291bnRfdmFsdWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfbmFtZV9iaW5kaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZSwgdGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYXR0cmlidXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuYXR0cmlidXRlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hdHRyaWJ1dGUud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2F0dHJpYnV0ZV9jb3VudF92YWx1ZSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hdHRyaWJ1dGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hdHRyaWJ1dGUudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlLCB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hdHRyaWJ1dGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWN0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hY3Rpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hY3Rpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFjdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmFjdGlvbi52YWx1ZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYWN0aW9uX2NvdW50X3ZhbHVlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWN0aW9uLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2FjdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFjdGlvbi52YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmFjdGlvbi52YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5hY3Rpb24udmFsdWUsIHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmFjdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYWN0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YWx1ZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YWx1ZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX29iamVjdF9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2thZ2VfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9uYW1lX2JpbmRpbmdfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hdHRyaWJ1dGVfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hY3Rpb25fY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxpbmtfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWVfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxpbmtfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWVfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGVfcGFjayh0aGlzLT5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9iamVjdF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0xPR0lDQUxfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9sb2dpY2FsX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXIsIHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1FVRVVFX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3BhY2soJnRoaXMtPnUucXVldWVfbmFtZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBvcnQucG9ydF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucG9ydC5wb3J0X251bWJlciwgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0FMTF9RVUVVRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3BhY2soJnRoaXMtPnUuYWxsX3F1ZXVlcy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb25fbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9uZXR3b3JrX3BvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXIsIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9VU0VSX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9uX251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyLCB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfRkxPV19ESVJFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayh0aGlzLT51LmZsb3dfZGlyZWN0aW9uLmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJicmlkZ2VfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlciwgdGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfYnJpZGdlX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlciwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPmxlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPm9iamVjdF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTE9HSUNBTF9MSU5LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1FVRVVFX05BTUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9QT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9BTExfUVVFVUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9GTE9XX0RJUkVDVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRV9QT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV91bnBhY2soJnRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT5sZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9MT0dJQ0FMX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua19jb3VudF9saW5rX251bWJlcigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9sb2dpY2FsX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyLCB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9RVUVVRV9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV91bnBhY2soJnRoaXMtPnUucXVldWVfbmFtZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcG9ydF9jb3VudF9wb3J0X251bWJlcigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBvcnQucG9ydF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyLCB0aGlzLT51LnBvcnQucG9ydF9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQUxMX1FVRVVFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfdW5wYWNrKCZ0aGlzLT51LmFsbF9xdWV1ZXMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9uZXR3b3JrX3Bvbl9jb3VudF9wb25fbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb25fbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9uZXR3b3JrX3BvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXIsIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9VU0VSX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VzZXJfcG9uX2NvdW50X3Bvbl9udW1iZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvbl9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VzZXJfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlciwgdGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0ZMT1dfRElSRUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5mbG93X2RpcmVjdGlvbi5kaXJlY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VfY291bnRfYnJpZGdlX251bWJlcigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJicmlkZ2VfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyLCB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9wb3J0X2NvdW50X3BvcnRfbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXIsIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIG9iamVjdF90eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGVfdW5wYWNrKCZvYmplY3RfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob2JqZWN0X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTE9HSUNBTF9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmtfbnVtYmVyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxpbmtfbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobGlua19udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1FVRVVFX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3J0X251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb3J0X251bWJlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBvcnRfbnVtYmVyX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9BTExfUVVFVUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvbl9udW1iZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9uX251bWJlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBvbl9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvbl9udW1iZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9uX251bWJlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBvbl9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0ZMT1dfRElSRUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBicmlkZ2VfbnVtYmVyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyaWRnZV9udW1iZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChicmlkZ2VfbnVtYmVyX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3J0X251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb3J0X251bWJlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBvcnRfbnVtYmVyX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9sb2dpY2FsX2xpbmtfY291bnRfbGlua19udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wb3J0X2NvdW50X3BvcnRfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfbmV0d29ya19wb25fY291bnRfcG9uX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VzZXJfcG9uX2NvdW50X3Bvbl9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VfY291bnRfYnJpZGdlX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9wb3J0X2NvdW50X3BvcnRfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LmF0dHJpYnV0ZS5sZWFmID09IDB4N0ZFNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF91bnBhY2soJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LmF0dHJpYnV0ZS5sZWFmID09IDB4N0ZFNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ3aWR0aCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1Ziwgd2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUuYXR0cmlidXRlLmxlYWYgPT0gMHg3RkU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUuYWxhcm1fY29kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIHdpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggYnJhbmNoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sYXllcl9zZWxlY3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmR3b3JkX29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZmllbGRfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5iaXRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGF5ZXJfc2VsZWN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kd29yZF9vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmZpZWxkX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Yml0X29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdF9wYWNrKHRoaXMtPmZpZWxkX3NlbGVjdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bG9va3VwX3ZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3JfcGFjayh0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3RfdW5wYWNrKCZ0aGlzLT5maWVsZF9zZWxlY3QsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmxvb2t1cF92YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yX3VucGFjaygmdGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZGlyZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3NfcGFjayh0aGlzLT5mbGFncywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3J0X2xpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmlkX2NvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByZWNlZGVuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2xhdXNlc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5jbGF1c2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPmNsYXVzZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2xhdXNlc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfcGFjaygmdGhpcy0+Y2xhdXNlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICp0aGlzKQoreworICAgIHJldHVybiAxMCArICgxMCAqIHRoaXMtPmNsYXVzZXNfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc191bnBhY2soJnRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvcnRfbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT52aWRfY29zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJlY2VkZW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jbGF1c2VzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmNsYXVzZXNfY291bnQgPiAwKSAmJiAodGhpcy0+Y2xhdXNlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmNsYXVzZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmNsYXVzZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmNsYXVzZXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3VucGFjaygmdGhpcy0+Y2xhdXNlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBjbGF1c2VzX2NvdW50OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZjbGF1c2VzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlKSAqIGNsYXVzZXNfY291bnQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgY2xhdXNlc19jb3VudCAqIDEwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+ZXBvbl92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT51c2VyX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1heF9hbGxvd2VkX2dyb3VwcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+ZXBvbl92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT51c2VyX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1heF9hbGxvd2VkX2dyb3VwcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+dmxhbl90YWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxpbmtfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+dmxhbl90YWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxpbmtfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT55ZWFyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tb250aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5ob3VyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5taW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnNlYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT55ZWFyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tb250aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5ob3VyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5taW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNlYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVhcm5pbmdfZG9tYWluKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zdGF0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yaWdodF9tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGVfcGFjayh0aGlzLT5iaW5zZWxlY3QsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5iaW5zZWxlY3QpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hY19wYWNrKCZ0aGlzLT51LnNhLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hY19wYWNrKCZ0aGlzLT51LmRhLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1NNX1BMVVNfSVBEQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwX3BhY2soJnRoaXMtPnUuc3NtX3BsdXNfaXBkYS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1BST0dfRklFTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZV9wYWNrKCZ0aGlzLT51LnByb2dfZmllbGQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9DVkxBTl9WSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfcGFjaygmdGhpcy0+dS5jdmxhbl92aWQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuX3BhY2soJnRoaXMtPnUuc3ZsYW5fdmlkX2N2bGFuX3ZpZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHN3aXRjaCAodGhpcy0+Ymluc2VsZWN0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0RBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NTTV9QTFVTX0lQREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfUFJPR19GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9DVkxBTl9WSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1ZMQU5fVklEX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZWFybmluZ19kb21haW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnN0YXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJpZ2h0X21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV91bnBhY2soJnRoaXMtPmJpbnNlbGVjdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJpbnNlbGVjdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3VucGFjaygmdGhpcy0+dS5zYS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hY191bnBhY2soJnRoaXMtPnUuZGEudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NTTV9QTFVTX0lQREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF91bnBhY2soJnRoaXMtPnUuc3NtX3BsdXNfaXBkYS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfUFJPR19GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3VucGFjaygmdGhpcy0+dS5wcm9nX2ZpZWxkLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9DVkxBTl9WSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfdW5wYWNrKCZ0aGlzLT51LmN2bGFuX3ZpZC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1ZMQU5fVklEX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl91bnBhY2soJnRoaXMtPnUuc3ZsYW5fdmlkX2N2bGFuX3ZpZC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgYmluc2VsZWN0OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV91bnBhY2soJmJpbnNlbGVjdCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJpbnNlbGVjdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NTTV9QTFVTX0lQREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1BST0dfRklFTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1ZMQU5fVklEX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaGVhZGVyLnByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdF9wYWNrKHRoaXMtPnUuY2xhdXNlLmZpZWxkX3NlbGVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXVzZS5maWVsZF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGF1c2UubXNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2xhdXNlLmxzYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3BhY2sodGhpcy0+dS5jbGF1c2Uub3BlcmF0b3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYXRjaF92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfY2xhdXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlLCB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fcGFjayh0aGlzLT51LnJlc3VsdC5yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBhcmFtZXRlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfcmVzdWx0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucmVzdWx0LnBhcmFtZXRlciwgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfcGFjaygmdGhpcy0+dS5lbnRyeS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1ICsgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lbnRyeS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZV91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmhlYWRlci5wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3RfdW5wYWNrKCZ0aGlzLT51LmNsYXVzZS5maWVsZF9zZWxlY3QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jbGF1c2UuZmllbGRfaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhdXNlLm1zYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmNsYXVzZS5sc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuY2xhdXNlLm9wZXJhdG9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9jbGF1c2VfY291bnRfbWF0Y2hfdmFsdWUoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWF0Y2hfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2NsYXVzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlLCB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnJlc3VsdC5yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9yZXN1bHRfY291bnRfcGFyYW1ldGVyKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGFyYW1ldGVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9yZXN1bHRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVzdWx0LnBhcmFtZXRlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUucmVzdWx0LnBhcmFtZXRlciwgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfdW5wYWNrKCZ0aGlzLT51LmVudHJ5LnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIGxlYWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbWF0Y2hfdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtYXRjaF92YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG1hdGNoX3ZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1ldGVyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBhcmFtZXRlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9jbGF1c2VfY291bnRfbWF0Y2hfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9yZXN1bHRfY291bnRfcGFyYW1ldGVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5xdWV1ZV9iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zaGFwZV9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YnVyc3Rfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5xdWV1ZV9iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zaGFwZV9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YnVyc3Rfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wYXRjaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWFqb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pbm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cGF0Y2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfcGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eV9wYWNrKHRoaXMtPm1hdHVyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyX3BhY2soJnRoaXMtPnZlcnNpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eV91bnBhY2soJnRoaXMtPm1hdHVyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyX3VucGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZWdhY3lfdmVyc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9wYWNrKCZ0aGlzLT5uZXdfdmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c3RyZWFtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmV2aXNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jcmMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfcGFjaygmdGhpcy0+dGltZXN0YW1wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlZ2FjeV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3VucGFjaygmdGhpcy0+bmV3X3ZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3RyZWFtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmV2aXNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jcmMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfdW5wYWNrKCZ0aGlzLT50aW1lc3RhbXAsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDI2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3BhY2sodGhpcy0+ZmlsZV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0JPT1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3BhY2soJnRoaXMtPnUuYm9vdC5pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX01BSU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3BhY2soJnRoaXMtPnUuYXBwX21haW4uaW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9CQUNLVVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3BhY2soJnRoaXMtPnUuYXBwX2JhY2t1cC5pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmZpbGVfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9CT09UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfTUFJTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX0JBQ0tVUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZV91bnBhY2soJnRoaXMtPmZpbGVfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmZpbGVfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9CT09UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZV91bnBhY2soJnRoaXMtPnUuYm9vdC5pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfTUFJTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfdW5wYWNrKCZ0aGlzLT51LmFwcF9tYWluLmluZm8sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9CQUNLVVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3VucGFjaygmdGhpcy0+dS5hcHBfYmFja3VwLmluZm8sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZSBmaWxlX3R5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3VucGFjaygmZmlsZV90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZmlsZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0JPT1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfTUFJTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDI2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9CQUNLVVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aWR4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aWR4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCAzMjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3BhY2soJnRoaXMtPmxvYWRbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCAzMjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3VucGFjaygmdGhpcy0+bG9hZFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDY0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pZHgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dmFsdWUgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT52YWx1ZSwgdGhpcy0+dmFsdWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyB0aGlzLT52YWx1ZV9jb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlkeCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgdGhpcy0+dmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9jb3VudF92YWx1ZShidWYpOworICAgIGlmICgodGhpcy0+dmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dmFsdWUgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsdWUsIHRoaXMtPnZhbHVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWVfZWxlbV9jb3VudCArPSAxOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YWx1ZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnF1ZXVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnF1ZXVlX3NpemVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NpemVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5xdWV1ZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZV9zaXplc1tpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqdGhpcykKK3sKKyAgICByZXR1cm4gMyArICgyICogdGhpcy0+cXVldWVfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZXZlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5xdWV1ZV9jb3VudCA+IDApICYmICh0aGlzLT5xdWV1ZV9zaXplcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NpemVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5xdWV1ZV9zaXplcyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cXVldWVfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnF1ZXVlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlX3NpemVzW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgcXVldWVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIHF1ZXVlX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHF1ZXVlX2NvdW50ICogMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3BhY2sodGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlX3BhY2sodGhpcy0+dS5oZWFkZXIucmVwb3J0X2NvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saW5rLnByaW9yaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJpb3JpdGllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV9saW5rXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9wYWNrKCZ0aGlzLT51LmxpbmsucHJpb3JpdGllc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydC5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LnBvcnQucHJpb3JpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcmlvcml0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3BhY2soJnRoaXMtPnUucG9ydC5wcmlvcml0aWVzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5zdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubGluay5wcmlvcml0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXR5X2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5saW5rLnByaW9yaXRpZXNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucG9ydC5wcmlvcml0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXR5X2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5wb3J0LnByaW9yaXRpZXNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3VucGFjaygmdGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlX3VucGFjaygmdGhpcy0+dS5oZWFkZXIucmVwb3J0X2NvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saW5rLnByaW9yaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcmlvcml0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5saW5rLnByaW9yaXRpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV91bnBhY2soJnRoaXMtPnUubGluay5wcmlvcml0aWVzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucG9ydC5wcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0LnByaW9yaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcmlvcml0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5wb3J0LnByaW9yaXRpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUucG9ydC5wcmlvcml0eV9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV91bnBhY2soJnRoaXMtPnUucG9ydC5wcmlvcml0aWVzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGUgc3VidHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZV91bnBhY2soJnN1YnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChzdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkpICogcHJpb3JpdHlfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHByaW9yaXR5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5X2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSkgKiBwcmlvcml0eV9jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgcHJpb3JpdHlfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IHJldCA9IDA7CisgICAgcmV0IHw9ICgodGhpcy0+ZW5kX29mX3NlcXVlbmNlICYgMHgwMDAxKSA8PCAxNSk7CisgICAgcmV0IHw9ICh0aGlzLT5zZXF1ZW5jZV9udW1iZXIgJiAweDdGRkYpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCByZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCB2YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgdGhpcy0+ZW5kX29mX3NlcXVlbmNlID0gKCh2YWwgPj4gMTUpICYgMHgwMDAxKTsKKyAgICB0aGlzLT5zZXF1ZW5jZV9udW1iZXIgPSAodmFsICYgMHg3RkZGKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleV9wYWNrKHRoaXMtPmtleSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJlX2luaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dG9kX2VuYWJsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbmVfcHBzX2VuYWJsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3MzMihidWYsIHRoaXMtPm9uZV9wcHNfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cm91bmRfdHJpcF90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b25lX3Bwc19oYWxmX3BlcmlvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleV91bnBhY2soJnRoaXMtPmtleSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlX2luaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dG9kX2VuYWJsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbmVfcHBzX2VuYWJsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfczMyKGJ1ZiwgJnRoaXMtPm9uZV9wcHNfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cm91bmRfdHJpcF90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b25lX3Bwc19oYWxmX3BlcmlvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG9ydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Z3JvdXBfbGltaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZjX2xpbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51cF9lcG9uX3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVwX3VuaV92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnVwX2xpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmRucSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dXBxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5ncm91cF9saW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZmNfbGltaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmFjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVwX2Vwb25fdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXBfdW5pX3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dXBfbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZG5xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51cHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZG5fbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbl9wYWNrKHRoaXMtPm9wdGlvbnMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXJfcGFjayh0aGlzLT5md2RfcXVhbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+ZG5fZXBvbl92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5kbl91bmlfdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5udW1fcG9ydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5udW1fcG9ydCA+IDApICYmICh0aGlzLT5wb3J0X2luZm8gPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9pbmZvXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5udW1fcG9ydDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3BhY2soJnRoaXMtPnBvcnRfaW5mb1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICp0aGlzKQoreworICAgIHJldHVybiAxMiArICgxMSAqIHRoaXMtPm51bV9wb3J0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmRuX2xpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb25fdW5wYWNrKCZ0aGlzLT5vcHRpb25zLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyX3VucGFjaygmdGhpcy0+ZndkX3F1YWwsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmFjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmRuX2Vwb25fdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZG5fdW5pX3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtX3BvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bnVtX3BvcnQgPiAwKSAmJiAodGhpcy0+cG9ydF9pbmZvID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9pbmZvXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5wb3J0X2luZm8gPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5udW1fcG9ydCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm51bV9wb3J0OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fdW5wYWNrKCZ0aGlzLT5wb3J0X2luZm9baTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbnVtX3BvcnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJm51bV9wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbykgKiBudW1fcG9ydCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBudW1fcG9ydCAqIDExKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5udW1fZG9tYWlucykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5udW1fZG9tYWlucyA+IDApICYmICh0aGlzLT5kb21haW4gPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG9tYWluXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm51bV9kb21haW5zOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX3BhY2soJnRoaXMtPmRvbWFpbltpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5udW1fZG9tYWlucyA+IDApICYmICh0aGlzLT5kb21haW4gPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibnVtX2RvbWFpbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5udW1fZG9tYWluczsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmRvbWFpbltpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm51bV9kb21haW5zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm51bV9kb21haW5zID4gMCkgJiYgKHRoaXMtPmRvbWFpbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvbWFpblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5kb21haW4gPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bnVtX2RvbWFpbnMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bnVtX2RvbWFpbnM7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fdW5wYWNrKCZ0aGlzLT5kb21haW5baTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBudW1fZG9tYWluczsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJm51bV9kb21haW5zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8pICogbnVtX2RvbWFpbnMpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IG51bV9kb21haW5zOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2lkdGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmx1ZV9maWVsZF9zZWxlY3QuaWR4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3BhY2soJnRoaXMtPnUubHVlX2ZpZWxkX3NlbGVjdC5kZWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2ZyYW1lc190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX3NpbmdsZV9jb2xsX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfbXVsdGlwbGVfY29sbF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19mcmFtZXNfcnhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfZmNzX2Vyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2FsaWduX2Vyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX29jdGV0c190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2xhdGVfY29sbGlzaW9ucy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfZXhjZXNzaXZlX2NvbGxpc2lvbnMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19vY3RldHNfcnhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19tY2FzdF9mcmFtZXNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19iY2FzdF9mcmFtZXNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19tY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19iY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfaW5fcmFuZ2VfbGVuX2Vyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfZnJhbWVfdG9vX2xvbmcudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc3RkX21hY19lbmFibGVfc3RhdHVzLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9waHlfc3ltYm9sX2Vycl9kdXJpbmdfY2Fycmllci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19jdHJsX3BhdXNlX3R4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2N0cmxfcGF1c2VfcngudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfb2FtX2xvY2FsX2Vycl9mcmFtZV9zZWNzX2V2ZW50LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9vYW1fZW11bF9jcmM4ZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbXBjcF9tYWNfY3RybF9mcmFtZXNfdHgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tcGNwX21hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tcGNwX3R4X3JlZ19hY2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfdHhfcmVnX3JlcXVlc3QudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tcGNwX3R4X3JlcG9ydC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tcGNwX3J4X2dhdGUudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfcnhfcmVnaXN0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmR5bl9sZWFybl90Ymxfc2l6ZS50YWJsZV9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZHluX2xlYXJuX2FnZV9saW1pdC5hZ2VfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfdW5pY2FzdF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfdW5pY2FzdF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lX3Rvb19zaG9ydC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lNjQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NVRPMTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lNjV0bzEyNy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTI4dG8yNTUudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTI1NnRvNTExLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lNTEydG8xMDIzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTEwMjR0bzE1MTgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTE1MTlwbHVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWU2NC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWU2NXRvMTI3LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxMjh0bzI1NS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMjU2dG81MTEudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWU1MTJ0bzEwMjMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMTAyNHRvMTUxOC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMTUxOXBsdXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudHhfZGVsYXlfdGhyZXNob2xkLmRlbGF5X3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9kZWxheS5kZWxheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2J5dGVzX2Ryb3BwZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9ieXRlc19kZWxheWVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9ieXRlc191bnVzZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucnhfZGVsYXlfdGhyZXNob2xkLmRlbGF5X3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9kZWxheS5kZWxheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2J5dGVzX2Ryb3BwZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9ieXRlc19kZWxheWVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnBvcnRfc3RhdF90aHJlc2hvbGQucmlzaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5mYWxsaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQuc3RhdGlzdGljX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5saW5rX3N0YXRfdGhyZXNob2xkLnJpc2luZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQuZmFsbGluZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZW5jcnlwdF9rZXlfZXhwaXJ5X3RpbWUudGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmxlbl9lcnJvcl9kaXNjYXJkLmxlbl9lcnJvcl9kaXNjYXJkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkc19jb3VudCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGhyZXNob2xkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS52bGFuX2V0aGVydHlwZS52bGFuX2V0aGVyX3R5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS52bGFuX2V0aGVydHlwZS51c2VfZm9yX3Vwc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUudmxhbl9ldGhlcnR5cGUudXNlX2Zvcl9kb3duc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X2NhcGFiaWxpdHkuY3VycmVudF9jYXBzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X2NhcGFiaWxpdHkucGh5c2ljYWxfY2FwcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld19kbl9maWx0ZXJfdGJsXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfdXBfZmlsdGVyX3RibFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3BhY2soJnRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hcnBfcmVwbGljYXRlX2Rlc3QuZGVzdGluYXRpb25fYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5sYWNwX2Rlc3QuZGVzdGluYXRpb25fYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9JR01QX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9pZ21wX3ZsYW4uYWN0aW9uX2Zvcl91bm1hbl9ncnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfb251X2lnbXBfdmxhblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbl9wYWNrKCZ0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZHluX2xlYXJuaW5nX21vZGUubGVhcm5pbmdfbW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1pbl9tYWNfbGltaXQubGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9hZ2dyZWdhdGVfbGltaXQubGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9udnNfc2NyYXRjaHBhZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGEsIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmxvb2RfdW5rbm93bi5mbG9vZF91bmtub3duX29wdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sb2NhbF9zd2l0Y2hpbmcubG9jYWxfc3dpdGNoX29wdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kb3duX2J1cnN0X3RvbGwuZG93bl9idXJzdF90b2xsX29wdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZlY19tb2RlLmRvd25zdHJlYW1fZmVjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZlY19tb2RlLnVwc3RyZWFtX2ZlYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucG93ZXJfbW9uX3RlbXBlcmF0dXJlLnRlbXBlcmF0dXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9WQ0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucG93ZXJfbW9uX3ZjYy52Y2MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX0JJQVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucG93ZXJfbW9uX3R4X2JpYXMuYmlhcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucG93ZXJfbW9uX3R4X3Bvd2VyLnBvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fcnhfcG93ZXIucG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5ldHdvcmtfZXBvbl9wb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ldHdvcmtfcG9uX21hcFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHMsIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3BhY2sodGhpcy0+dS5wc3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0xFX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zbGVfbW9kZS5maWVsZF9zZWxlY3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZV9wYWNrKHRoaXMtPnUubGVhcm5fdGFibGVfbW9kZS5sZWFybl90YWJsZV9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUudHJhbnNjZWl2ZXJfc2lnbmFsX2RldGVjdC5zaWduYWxfZGV0ZWN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NST1NTQkFSX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfY3Jvc3NiYXJfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnQsIHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnRyYW5zY2VpdmVyX2J1cnN0X2FjdGl2aXR5LmJ1cnN0X2FjdGl2aXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNvbnRyb2xfcG9ydC5uZXR3b3JrX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlX3BhY2sodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXRjaF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3BhY2sodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmRlZmF1bHRfbGlua19pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5kZWZhdWx0X3F1ZXVlX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5ncyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYXBwaW5nc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3ZsYW5fZGVzdGluYXRpb25zXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50ID4gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmdfcGFjaygmdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGVfcGFjayh0aGlzLT51LmVuY3J5cHRpb25fbW9kZS5tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfcGFjayh0aGlzLT51LmVuY3J5cHRpb25fbW9kZS5vcHRpb25zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5URVJOQUxfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pbnRlcm5hbF92ZXJzaW9uLnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuaW50ZXJuYWxfdmVyc2lvbi5yZXZpc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF9wYWNrKCZ0aGlzLT51LmZpcm13YXJlX3RpbWVzdGFtcC50aW1lc3RhbXAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfcGFjaygmdGhpcy0+dS5vbnVfcnVsZS5ydWxlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl9wYWNrKHRoaXMtPnUucG9saWNlci5kaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb2xpY2VyLnBvbGljZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnBvbGljZXIuYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucG9saWNlci50cmFmZmljX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnVuaV9zaGFwZXIubnVtYmVyX29mX3NoYXBlcnMgPiAwKSAmJiAodGhpcy0+dS51bmlfc2hhcGVyLnVuaV9zaGFwZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5pX3NoYXBlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3VuaV9zaGFwZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzOyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcl9wYWNrKCZ0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlcltpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhUX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9wYWNrKCZ0aGlzLT51LmV4dF9maXJtd2FyZV92ZXJzaW9uLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fcGFjayh0aGlzLT51LmVuY3J5cHRpb25fa2V5LmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2xlbmd0aCA+IDApICYmICh0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfZW5jcnlwdGlvbl9rZXlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfZGF0YSwgdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJTEVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9wYWNrKCZ0aGlzLT51LmZpbGVfaW5mby5maWxlX2luZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TWVNURU1fUlVMRV9PUFRJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc3lzdGVtX3J1bGVfb3B0aW9ucy5zeXN0ZW1fcnVsZV9vcHRpb25zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tdHUubXR1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGVfcGFjayh0aGlzLT51Lm52c19zdGF0ZS5zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X21hcCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcmlvcml0eV9tYXBcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9xdWV1ZXByaW1hcFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X21hcCwgdGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfcGFjaygmdGhpcy0+dS5lcG9jX2Rvd25fYml0X2xvYWRpbmcudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nX3BhY2soJnRoaXMtPnUuZXBvY191cF9iaXRfbG9hZGluZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3NkbV9waGFzZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soJnRoaXMtPnUuZXBvY19zZG1fYW1wbGl0dWRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3NkbV9xdWFudGl6ZXIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkMC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soJnRoaXMtPnUuZXBvY191bnVzZWQxLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkMy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soJnRoaXMtPnUuZXBvY191bnVzZWQ0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3BhY2soJnRoaXMtPnUucXVldWVfY29uZmlnX3YyLnF1ZXVlX2NvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF9wYWNrKHRoaXMtPnUuZmVhdHVyZV9zZXQuZmVhdHVyZV9zZXQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlX3BhY2sodGhpcy0+dS5zdGRfcGh5X3R5cGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl9wYWNrKCZ0aGlzLT51LnNlcXVlbmNlX251bWJlci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUubXBjcF9jbG9jay5wdWxzZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ19wYWNrKCZ0aGlzLT51Lm1wY3BfY2xvY2tfY29tcGVuc2F0ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLnJvYnVzdG5lc3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubWNhc3RfZ2xvYmFsX2NvbmZpZy5sbXFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLmZhc3RfbGVhdmVfZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlX3BhY2sodGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9uc19wYWNrKHRoaXMtPnUubWNhc3RfZ2xvYmFsX2NvbmZpZy5vcHRpb25zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9wYWNrKCZ0aGlzLT51Lm1jYXN0X2RvbWFpbl9jb25maWcudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfaG9sZG92ZXIudGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3BhY2sodGhpcy0+dS5vbnVfaG9sZG92ZXIuZmxhZ3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfcGFjayh0aGlzLT51LmFsYXJtX3RocmVzaG9sZC5hbGFybV9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC5yYWlzZV90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC5jbGVhcl90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5mYWlsc2FmZS5jb3VudF9vZl9mYWlsc2FmZV9tZWNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZmFpbHNhZmUuZmFpbHNhZmVfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucG9ydF9zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWwuc3RhdGlzdGljX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5saW5rX3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lmxpbmtfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c19wYWNrKHRoaXMtPnUuc3RkX21hY19kdXBsZXhfc3RhdHVzLnN0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3BhY2sodGhpcy0+dS5zdGRfYXV0b19uZWdfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGVfcGFjayh0aGlzLT51LnN0ZF9tYXVfbWVkaWFfYXZhaWwuc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTURJX0NST1NTT1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZV9wYWNrKHRoaXMtPnUubWRpX2Nyb3Nzb3Zlci5tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc3RkX21hY19hZGRyLmFkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NUTF9WTEFOX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HUk9VUF9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9QT0xJQ1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QUklfRU5RVUVVSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0FCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+d2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEJMX1NJWkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzW2kwXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc1tpMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9JR01QX1ZMQU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDUgKiB0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGFfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9WQ0M6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA1ICsgKDQgKiB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5URVJOQUxfVkVSU0lPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vbnVfcnVsZS5ydWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgxMCAqIHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfbGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZmlsZV9pbmZvLmZpbGVfaW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VUF9CSVRfTE9BRElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmVwb2Nfc2RtX3BoYXNlLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY19zZG1fYW1wbGl0dWRlLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY19zZG1fcXVhbnRpemVyLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY191bnVzZWQwLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY191bnVzZWQxLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY191bnVzZWQyLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY191bnVzZWQzLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY191bnVzZWQ0LnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZ192Mi5xdWV1ZV9jb25maWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubWNhc3RfZG9tYWluX2NvbmZpZy52YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZBSUxTQUZFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfVkVSU0lPTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9KRURFQ19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QUklfRU5RVUVVSU5HOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFQVJDSF9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9URUNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfVFhfRU5BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmx1ZV9maWVsZF9zZWxlY3QuaWR4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3VucGFjaygmdGhpcy0+dS5sdWVfZmllbGRfc2VsZWN0LmRlZiwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfZnJhbWVzX3R4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19zaW5nbGVfY29sbF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfbXVsdGlwbGVfY29sbF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2Zjc19lcnIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BTElHTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2FsaWduX2Vyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfb2N0ZXRzX3R4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19sYXRlX2NvbGxpc2lvbnMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfZXhjZXNzaXZlX2NvbGxpc2lvbnMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX29jdGV0c19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfbWNhc3RfZnJhbWVzX3R4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19iY2FzdF9mcmFtZXNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX21jYXN0X2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfYmNhc3RfZnJhbWVzX3J4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfaW5fcmFuZ2VfbGVuX2Vyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19mcmFtZV90b29fbG9uZy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfZW5hYmxlX3N0YXR1cy5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9waHlfc3ltYm9sX2Vycl9kdXJpbmdfY2Fycmllci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2N0cmxfcGF1c2VfdHgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19jdHJsX3BhdXNlX3J4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfb2FtX2xvY2FsX2Vycl9mcmFtZV9zZWNzX2V2ZW50LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX29hbV9lbXVsX2NyYzhlcnIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfbWFjX2N0cmxfZnJhbWVzX3R4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tcGNwX21hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfdHhfcmVnX2Fjay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tcGNwX3R4X3JlZ19yZXF1ZXN0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tcGNwX3R4X3JlcG9ydC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfcnhfZ2F0ZS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tcGNwX3J4X3JlZ2lzdGVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmR5bl9sZWFybl90Ymxfc2l6ZS50YWJsZV9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5keW5fbGVhcm5fYWdlX2xpbWl0LmFnZV9saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X3VuaWNhc3RfZnJhbWVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfdW5pY2FzdF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWVfdG9vX3Nob3J0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTY0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lNjV0bzEyNy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUxMjh0bzI1NS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUyNTZ0bzUxMS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lNTEydG8xMDIzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lMTAyNHRvMTUxOC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUxNTE5cGx1cy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWU2NC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTY1dG8xMjcudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMTI4dG8yNTUudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMjU2dG81MTEudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTUxMnRvMTAyMy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTEwMjR0bzE1MTgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMTUxOXBsdXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9kZWxheV90aHJlc2hvbGQuZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZGVsYXkuZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfYnl0ZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfYnl0ZXNfZGVsYXllZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9ieXRlc191bnVzZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9kZWxheV90aHJlc2hvbGQuZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZGVsYXkuZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfYnl0ZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfYnl0ZXNfZGVsYXllZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5yaXNpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfc3RhdF90aHJlc2hvbGQuZmFsbGluZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQuc3RhdGlzdGljX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQucmlzaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5saW5rX3N0YXRfdGhyZXNob2xkLmZhbGxpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5jcnlwdF9rZXlfZXhwaXJ5X3RpbWUudGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGVuX2Vycm9yX2Rpc2NhcmQubGVuX2Vycm9yX2Rpc2NhcmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3JlcG9ydF90aHJlc2hvbGRzX2NvdW50X3RocmVzaG9sZHMoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRocmVzaG9sZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHMgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkc19jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzW2kwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52bGFuX2V0aGVydHlwZS52bGFuX2V0aGVyX3R5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnVzZV9mb3JfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnVzZV9mb3JfZG93bnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X2NhcGFiaWxpdHkuY3VycmVudF9jYXBzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5waHlzaWNhbF9jYXBzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfZG5fZmlsdGVyX3RibF9jb3VudF9ydWxlcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld19kbl9maWx0ZXJfdGJsXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjaygmdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc1tpMV0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfdXBfZmlsdGVyX3RibF9jb3VudF9ydWxlcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld191cF9maWx0ZXJfdGJsXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjaygmdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc1tpMl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFycF9yZXBsaWNhdGVfZGVzdC5kZXN0aW5hdGlvbl9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGFjcF9kZXN0LmRlc3RpbmF0aW9uX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9pZ21wX3ZsYW4uYWN0aW9uX2Zvcl91bm1hbl9ncnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX29udV9pZ21wX3ZsYW5cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW5fdW5wYWNrKCZ0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNbaTNdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZHluX2xlYXJuaW5nX21vZGUubGVhcm5pbmdfbW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWluX21hY19saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfYWdncmVnYXRlX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TQ1JBVENIUEFEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX252c19zY3JhdGNocGFkX2NvdW50X2RhdGEoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9udnNfc2NyYXRjaHBhZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGEsIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mbG9vZF91bmtub3duLmZsb29kX3Vua25vd25fb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubG9jYWxfc3dpdGNoaW5nLmxvY2FsX3N3aXRjaF9vcHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kb3duX2J1cnN0X3RvbGwuZG93bl9idXJzdF90b2xsX29wdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmVjX21vZGUuZG93bnN0cmVhbV9mZWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mZWNfbW9kZS51cHN0cmVhbV9mZWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG93ZXJfbW9uX3RlbXBlcmF0dXJlLnRlbXBlcmF0dXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9WQ0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3dlcl9tb25fdmNjLnZjYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvd2VyX21vbl90eF9iaWFzLmJpYXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG93ZXJfbW9uX3R4X3Bvd2VyLnBvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvd2VyX21vbl9yeF9wb3dlci5wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5ldHdvcmtfZXBvbl9wb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ldHdvcmtfcG9uX21hcFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHMgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHMsIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3VucGFjaygmdGhpcy0+dS5wc3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2xlX21vZGUuZmllbGRfc2VsZWN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGVfdW5wYWNrKCZ0aGlzLT51LmxlYXJuX3RhYmxlX21vZGUubGVhcm5fdGFibGVfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50cmFuc2NlaXZlcl9zaWduYWxfZGV0ZWN0LnNpZ25hbF9kZXRlY3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfY3Jvc3NiYXJfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCwgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50cmFuc2NlaXZlcl9idXJzdF9hY3Rpdml0eS5idXJzdF9hY3Rpdml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNvbnRyb2xfcG9ydC5uZXR3b3JrX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlX3VucGFjaygmdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXRjaF9tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3NfdW5wYWNrKCZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmZsYWdzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmRlZmF1bHRfbGlua19pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmRlZmF1bHRfcXVldWVfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYXBwaW5nc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3ZsYW5fZGVzdGluYXRpb25zXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3MgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50ID4gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmdfdW5wYWNrKCZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzW2k0XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51LmVuY3J5cHRpb25fbW9kZS5tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9uc191bnBhY2soJnRoaXMtPnUuZW5jcnlwdGlvbl9tb2RlLm9wdGlvbnMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5pbnRlcm5hbF92ZXJzaW9uLnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5pbnRlcm5hbF92ZXJzaW9uLnJldmlzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3VucGFjaygmdGhpcy0+dS5maXJtd2FyZV90aW1lc3RhbXAudGltZXN0YW1wLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV91bnBhY2soJnRoaXMtPnUub251X3J1bGUucnVsZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5wb2xpY2VyLmRpcmVjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb2xpY2VyLnBvbGljZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9saWNlci5idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvbGljZXIudHJhZmZpY19yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnVuaV9zaGFwZXIubnVtYmVyX29mX3NoYXBlcnMgPiAwKSAmJiAodGhpcy0+dS51bmlfc2hhcGVyLnVuaV9zaGFwZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmlfc2hhcGVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdW5pX3NoYXBlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlciA9IChiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnVuaV9zaGFwZXIubnVtYmVyX29mX3NoYXBlcnM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyX3VucGFjaygmdGhpcy0+dS51bmlfc2hhcGVyLnVuaV9zaGFwZXJbaTVdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3VucGFjaygmdGhpcy0+dS5leHRfZmlybXdhcmVfdmVyc2lvbi52ZXJzaW9uLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPnUuZW5jcnlwdGlvbl9rZXkuZGlyZWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJrZXlfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX2VuY3J5cHRpb25fa2V5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9kYXRhLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX3VucGFjaygmdGhpcy0+dS5maWxlX2luZm8uZmlsZV9pbmZvLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN5c3RlbV9ydWxlX29wdGlvbnMuc3lzdGVtX3J1bGVfb3B0aW9ucykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tdHUubXR1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGVfdW5wYWNrKCZ0aGlzLT51Lm52c19zdGF0ZS5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9tYXAgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcmlvcml0eV9tYXBcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9xdWV1ZXByaW1hcFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X21hcCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X21hcCwgdGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfdW5wYWNrKCZ0aGlzLT51LmVwb2NfZG93bl9iaXRfbG9hZGluZy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nX3VucGFjaygmdGhpcy0+dS5lcG9jX3VwX2JpdF9sb2FkaW5nLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX3BoYXNlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3VucGFjaygmdGhpcy0+dS5lcG9jX3NkbV9hbXBsaXR1ZGUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX3F1YW50aXplci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY191bnVzZWQwLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3VucGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDEudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkMi52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY191bnVzZWQzLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3VucGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3VucGFjaygmdGhpcy0+dS5xdWV1ZV9jb25maWdfdjIucXVldWVfY29uZmlnLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF91bnBhY2soJnRoaXMtPnUuZmVhdHVyZV9zZXQuZmVhdHVyZV9zZXQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGVfdW5wYWNrKCZ0aGlzLT51LnN0ZF9waHlfdHlwZS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfdW5wYWNrKCZ0aGlzLT51LnNlcXVlbmNlX251bWJlci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubXBjcF9jbG9jay5wdWxzZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ191bnBhY2soJnRoaXMtPnUubXBjcF9jbG9ja19jb21wZW5zYXRlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcubG1xX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLmZhc3RfbGVhdmVfZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlX3VucGFjaygmdGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zX3VucGFjaygmdGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLm9wdGlvbnMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X2RvbWFpbl9jb25maWcudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfaG9sZG92ZXIudGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3VucGFjaygmdGhpcy0+dS5vbnVfaG9sZG92ZXIuZmxhZ3MsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV91bnBhY2soJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmFsYXJtX2NvZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsYXJtX3RocmVzaG9sZC5yYWlzZV90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmNsZWFyX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmFpbHNhZmUuY291bnRfb2ZfZmFpbHNhZmVfbWVjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmFpbHNhZmUuZmFpbHNhZmVfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydF9zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWwuaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5saW5rX3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGlua19zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWwuaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzX3VucGFjaygmdGhpcy0+dS5zdGRfbWFjX2R1cGxleF9zdGF0dXMuc3RhdHVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZV91bnBhY2soJnRoaXMtPnUuc3RkX2F1dG9fbmVnX2FkbWluX3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGVfdW5wYWNrKCZ0aGlzLT51LnN0ZF9tYXVfbWVkaWFfYXZhaWwuc3RhdHVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3VucGFjaygmdGhpcy0+dS5tZGlfY3Jvc3NvdmVyLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19hZGRyLmFkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NUTF9WTEFOX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HUk9VUF9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9QT0xJQ1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QUklfRU5RVUVVSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0FCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfR0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEJMX1NJWkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NVRPMTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUk9SX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRocmVzaG9sZHNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHRocmVzaG9sZHNfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnVsZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBydWxlc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHJ1bGVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydWxlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocnVsZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHZsYW5zX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnZsYW5zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbikgKiB2bGFuc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHZsYW5zX2NvdW50ICogNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkYXRhX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZGF0YV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG5ldHdvcmtfZXBvbl9wb3J0c19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIG5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFNTVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9UQUJMRV9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgdXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fREVTVElOQVRJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWFwcGluZ3NfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbWFwcGluZ3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcpICogbWFwcGluZ3NfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBtYXBwaW5nc19jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2Zfc2hhcGVyczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9zaGFwZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyKSAqIG51bWJlcl9vZl9zaGFwZXJzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbnVtYmVyX29mX3NoYXBlcnMgKiAxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBrZXlfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1Ziwga2V5X2xlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TWVNURU1fUlVMRV9PUFRJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcHJpb3JpdHlfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBwcmlvcml0eV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19ET1dOX0JJVF9MT0FESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZBSUxTQUZFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcmVwb3J0X3RocmVzaG9sZHNfY291bnRfdGhyZXNob2xkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfZG5fZmlsdGVyX3RibF9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld191cF9maWx0ZXJfdGJsX2NvdW50X3J1bGVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbnZzX3NjcmF0Y2hwYWRfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnF1ZXVlX3NpemVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NpemVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnF1ZXVlX3NpemVzLCB0aGlzLT5xdWV1ZV9zaXplc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICp0aGlzKQoreworICAgIHJldHVybiAxICsgdGhpcy0+cXVldWVfc2l6ZXNfY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cXVldWVfc2l6ZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cXVldWVfc2l6ZXNfY291bnQgPiAwKSAmJiAodGhpcy0+cXVldWVfc2l6ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zaXplc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5xdWV1ZV9zaXplcyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5xdWV1ZV9zaXplc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnF1ZXVlX3NpemVzLCB0aGlzLT5xdWV1ZV9zaXplc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHF1ZXVlX3NpemVzX2NvdW50OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnF1ZXVlX3NpemVzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcXVldWVfc2l6ZXNfY291bnQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgcXVldWVfc2l6ZXNfY291bnQgKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnVtYmVyX29mX2lnbXBfZ3JvdXBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZWxhdGl2ZV9xdWV1ZV9mb3JfY2xhc3NpZmljYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm51bWJlcl9vZl9pZ21wX2dyb3VwcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVsYXRpdmVfcXVldWVfZm9yX2NsYXNzaWZpY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvcnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPmdyb3VwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wb3J0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuYWRkX3N0YXRpY19lbnRyeS5tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LmRlbF9zdGF0aWNfZW50cnkubWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hZGRfcnVsZS5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZF9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmFkZF9ydWxlLnJ1bGVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3BhY2soJnRoaXMtPnUuYWRkX3J1bGUucnVsZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19BRERfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5uZXdfYWRkX3J1bGUucnVsZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfREVMX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfbmV3X2RlbF9ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3BhY2soJnRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVsZXRlX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9wYWNrKCZ0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5zZXRfZ3Bpb19jb25maWcuZ3Bpb19jb25maWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfcGFjaygmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfcGFjaygmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfcGFjaygmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLm11bHRpY2FzdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfaWdtcF9jb25maWcubGFzdF9tZW1iZXJfcXVlcnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zZXRfaWdtcF9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ19wYWNrKCZ0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5wb3J0c1tpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXJfcGFjayh0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5ncnBfZm9yd2FyZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3BhY2sodGhpcy0+dS5zZXRfaWdtcF9jb25maWcub3B0aW9ucywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3Vwc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3VwcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJncm91cHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2FkZF9pZ21wX2dyb3VwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTYgPSAwOyBpNiA8IHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50OyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZF9wYWNrKCZ0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3Vwc1tpNl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfb2FtX3JhdGUubWF4X29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9vYW1fcmF0ZS5taW5fb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xPQURfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmJjX2xhc2VyX3Bvd2VyX29mZi5vZmZfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zbGVlcC50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zX3BhY2sodGhpcy0+dS5zbGVlcC5vcHRpb25zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VOQUJMRV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3BhY2sodGhpcy0+dS5lbmFibGVfcG9saWNlci5kaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lbmFibGVfcG9saWNlci5wb2xpY2VyX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5lbmFibGVfcG9saWNlci5idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5lbmFibGVfcG9saWNlci50cmFmZmljX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3BhY2sodGhpcy0+dS5kaXNhYmxlX3BvbGljZXIuZGlyZWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGlzYWJsZV9wb2xpY2VyLnBvbGljZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfU0RNX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXNfcGFjayh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF9wYWNrKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnN0YXRfaW5kZXgsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc19wYWNrKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleF9wYWNrKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnN0YXRfaW5kZXgsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc19wYWNrKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF9wYWNrKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnN0YXRfaW5kZXgsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnF1ZXVlX3Blcl9wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3Blcl9wb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zZXRfZG5fYmNhc3RfcXVldWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQsIHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9MVUVfUlVMRV9UQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX0ROX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1BST1RFQ1RJT05fU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfU0VMRl9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+d2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfUlVMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZGRfcnVsZS5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYWRkX3J1bGUucnVsZXNbaTBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm5ld19hZGRfcnVsZS5ydWxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzW2kxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzW2kyXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubXVsdGljYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua3NfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc1tpM10pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c1tpNF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUkFTRV9OVlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2ICsgKDIgKiB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoNSAqIHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xPQURfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0JDX0xBU0VSX1BPV0VSX09GRjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfU0RNX1NUQVRTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ01DX1NUQVRTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1BST1RFQ1RJT05fU1dJVENIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU86CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfREVMX0dST1VQX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfU0VMRl9URVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUE9SVF9BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfUkVTRVQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hZGRfc3RhdGljX2VudHJ5Lm1hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kZWxfc3RhdGljX2VudHJ5Lm1hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmFkZF9ydWxlLnJ1bGVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfcnVsZV9jb3VudF9ydWxlcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFkZF9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWRkX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfYWRkX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hZGRfcnVsZS5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmFkZF9ydWxlLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKCZ0aGlzLT51LmFkZF9ydWxlLnJ1bGVzW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV91bnBhY2soJnRoaXMtPnUubmV3X2FkZF9ydWxlLnJ1bGVzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfbmV3X2RlbF9ydWxlX2NvdW50X3J1bGVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX25ld19kZWxfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV91bnBhY2soJnRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzW2kxXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVsZXRlX3J1bGVfY291bnRfcnVsZXMoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2RlbGV0ZV9ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjaygmdGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlc1tpMl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X2dwaW9fY29uZmlnLmdwaW9fY29uZmlnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3MgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc1tpM10sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNbaTRdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubXVsdGljYXN0LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5yb2J1c3RuZXNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLmxhc3RfbWVtYmVyX3F1ZXJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9pZ21wX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5wb3J0cyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ191bnBhY2soJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzW2k1XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXJfdW5wYWNrKCZ0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5ncnBfZm9yd2FyZCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfdW5wYWNrKCZ0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5vcHRpb25zLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9JR01QX0dST1VQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3Vwc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3VwcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImdyb3Vwc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfYWRkX2lnbXBfZ3JvdXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hZGRfaWdtcF9ncm91cC5ncm91cHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk2ID0gMDsgaTYgPCB0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3Vwc19jb3VudDsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfdW5wYWNrKCZ0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3Vwc1tpNl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfb2FtX3JhdGUubWF4X29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X29hbV9yYXRlLm1pbl9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5iY19sYXNlcl9wb3dlcl9vZmYub2ZmX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zbGVlcC50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zX3VucGFjaygmdGhpcy0+dS5zbGVlcC5vcHRpb25zLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmVuYWJsZV9wb2xpY2VyLmRpcmVjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lbmFibGVfcG9saWNlci5wb2xpY2VyX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuYWJsZV9wb2xpY2VyLmJ1cnN0X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5hYmxlX3BvbGljZXIudHJhZmZpY19yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RJU0FCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPnUuZGlzYWJsZV9wb2xpY2VyLmRpcmVjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kaXNhYmxlX3BvbGljZXIucG9saWNlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc191bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXhfdW5wYWNrKCZ0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5zdGF0X2luZGV4LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc191bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuc3RhdF9pbmRleCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXNfdW5wYWNrKCZ0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF91bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnN0YXRfaW5kZXgsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3Blcl9wb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zZXRfZG5fYmNhc3RfcXVldWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQsIHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9MVUVfUlVMRV9UQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX0ROX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1BST1RFQ1RJT05fU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfU0VMRl9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcnVsZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChydWxlc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcnVsZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChydWxlc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnVsZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBydWxlc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHJ1bGVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGlua3NfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZsaW5rc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpICogbGlua3NfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IGxpbmtzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZykgKiBwb3J0c19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHBvcnRzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBncm91cHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZncm91cHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQpICogZ3JvdXBzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgZ3JvdXBzX2NvdW50ICogNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xPQURfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBwb3J0X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHBvcnRfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBwb3J0X2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2FkZF9ydWxlX2NvdW50X3J1bGVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9uZXdfZGVsX3J1bGVfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2RlbGV0ZV9ydWxlX2NvdW50X3J1bGVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGVmLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYXR0cmlidXRlLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hY3Rpb24uYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdW5wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggYnJhbmNoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2lkdGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfcGFjaygmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfcGFjaygmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfcGFjaygmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLm11bHRpY2FzdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnJvYnVzdG5lc3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLmxhc3RfbWVtYmVyX3F1ZXJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2lnbXBfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfcGFjaygmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3BhY2sodGhpcy0+dS5nZXRfaWdtcF9jb25maWcuZ3JwX2ZvcndhcmQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9uc19wYWNrKHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLm9wdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZ3JvdXBzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfaWdtcF9ncm91cF9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3BhY2soJnRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9vYW1fcmF0ZS5tYXhfb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X29hbV9yYXRlLm1pbl9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYm9vdF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmJvb3RfY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfbG9hZF9pbmZvLnBlcnNvbmFsaXR5X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8ucGVyc29uYWxpdHlfY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmFwcDB2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmFwcDBjcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMXZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMWNyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5kaWFnbm9zdGljX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uZGlhZ25vc3RpY19jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfU0RNX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF9wYWNrKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnN0YXRfaW5kZXgsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRlcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2Nfc2RtX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX3NkbV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2ludGVydmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19zZG1fc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbCwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleF9wYWNrKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnN0YXRfaW5kZXgsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRlcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY21jX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NtY19zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2ludGVydmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbWNfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbCwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF9wYWNrKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnN0YXRfaW5kZXgsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRlcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY251X3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NudV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2ludGVydmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbnVfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbCwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnF1ZXVlX3Blcl9wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3Blcl9wb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZG5fYmNhc3RfcXVldWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQsIHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9MVUVfUlVMRV9UQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUkFTRV9OVlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19BRERfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfREVMX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUE9SVF9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+d2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMiArIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLm11bHRpY2FzdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NbaTBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNbaTFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2ICsgKDIgKiB0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDUgKiB0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xPQURfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDMwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQgKyB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWVfY291bnQgKyB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQgKyB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUkFTRV9OVlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU86CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfREVMX0dST1VQX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfU0VMRl9URVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUE9SVF9BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfUkVTRVQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0cyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3VucGFjaygmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzW2kxXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3VucGFjaygmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLm11bHRpY2FzdCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnJvYnVzdG5lc3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcubGFzdF9tZW1iZXJfcXVlcnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2lnbXBfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3VucGFjaygmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHNbaTJdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl91bnBhY2soJnRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLmdycF9mb3J3YXJkLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9uc191bnBhY2soJnRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLm9wdGlvbnMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZ3JvdXBzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfaWdtcF9ncm91cF9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3VucGFjaygmdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc1tpM10sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X29hbV9yYXRlLm1heF9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9vYW1fcmF0ZS5taW5fb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xPQURfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9sb2FkX2luZm8uYm9vdF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9sb2FkX2luZm8uYm9vdF9jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5wZXJzb25hbGl0eV92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9sb2FkX2luZm8ucGVyc29uYWxpdHlfY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMHZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAwY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMXZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAxY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9sb2FkX2luZm8uZGlhZ25vc3RpY192ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9sb2FkX2luZm8uZGlhZ25vc3RpY19jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfU0RNX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF91bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnN0YXRfaW5kZXgsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRlcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2Nfc2RtX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX3NkbV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWwgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2ludGVydmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19zZG1fc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuc3RhdF9pbmRleCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbWNfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY21jX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NtY19zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWwsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXhfdW5wYWNrKCZ0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5zdGF0X2luZGV4LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNvdW50ZXJfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NudV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbnVfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV9pbnRlcnZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY251X3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbCwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9wZXJfcG9ydFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2RuX2JjYXN0X3F1ZXVlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnF1ZXVlX3Blcl9wb3J0ID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnF1ZXVlX3Blcl9wb3J0LCB0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX0ROX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RJU0FCTEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VOQUJMRV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19BRERfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9PQU1fUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxpbmtzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbGlua3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnKSAqIGxpbmtzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCBsaW5rc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnKSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBwb3J0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnKSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcG9ydHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGdyb3Vwc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCkgKiBncm91cHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBncm91cHNfY291bnQgKiA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xPQURfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBjb3VudGVyX3ZhbHVlX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGNvdW50ZXJfdmFsdWVfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBjb3VudGVyX3ZhbHVlX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmF0ZV92YWx1ZV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJhdGVfdmFsdWVfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiByYXRlX2ludGVydmFsX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmF0ZV9pbnRlcnZhbF9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ01DX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY291bnRlcl92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJhdGVfdmFsdWVfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCByYXRlX2ludGVydmFsX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBjb3VudGVyX3ZhbHVlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgY291bnRlcl92YWx1ZV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJhdGVfdmFsdWVfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByYXRlX3ZhbHVlX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmF0ZV9pbnRlcnZhbF9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJhdGVfaW50ZXJ2YWxfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCByYXRlX3ZhbHVlX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV9pbnRlcnZhbF9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZjb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogY291bnRlcl92YWx1ZV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGNvdW50ZXJfdmFsdWVfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiByYXRlX3ZhbHVlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmF0ZV92YWx1ZV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJhdGVfaW50ZXJ2YWxfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByYXRlX2ludGVydmFsX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBwb3J0X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHBvcnRfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBwb3J0X2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0JDX0xBU0VSX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9VUF9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfREVMX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1BST1RFQ1RJT05fU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfU0VMRl9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5hY3Rpb24uYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VucGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggYnJhbmNoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlX3BhY2sodGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLmZpcm13YXJlX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaW5mby5vdWksIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmluZm8ucHJvZHVjdF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaW5mby52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmluZm8uZXh0ZW5kZWRfaWQsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LmluZm8uYmFzZV9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5tYXhfbGlua3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5udW1fcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5udW1fYXNzaWduYWJsZV91cHN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5tYXhfcXVldWVzX3Blcl9saW5rX3Vwc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmluZm8ucXVldWVfaW5jcmVtZW50X3Vwc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmluZm8ubnVtX2Fzc2lnbmFibGVfZG93bnN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5tYXhfcXVldWVzX3Blcl9saW5rX2Rvd25zdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5xdWV1ZV9pbmNyZW1lbnRfZG93bnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaW5mby51cHN0cmVhbV9idWZmZXJfYXZhaWxhYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLmRvd25zdHJlYW1fYnVmZmVyX2F2YWlsYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaW5mby5qZWRlY19tYW51ZmFjdHVyZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmluZm8uY2hpcF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuaW5mby5jaGlwX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3BhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3NfcGFjayh0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXIubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci51bmljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc19wYWNrKHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlcl9yZXNwb25zZS5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLnVuaWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCA+IDApICYmICh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJrZXlfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2tleV9leGNoYW5nZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlsZV9hY2suYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2sodGhpcy0+dS5maWxlX2Fjay5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlsZV9kYXRhLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCA+IDApICYmICh0aGlzLT51LmZpbGVfZGF0YS5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9maWxlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuZGF0YSwgdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3BhY2sodGhpcy0+dS5maWxlX3JlYWRfcmVxdWVzdC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfcGFjayh0aGlzLT51LmZpbGVfd3JpdGVfcmVxdWVzdC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlX2NvbnRhaW5lcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bmFja2VkX2FjdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9wYWNrKCZ0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFUVVFU1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc1tpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc1tpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc19jb3VudCA+IDApICYmICh0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyaWFibGVfY29udGFpbmVyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNbaTRdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFUVVFU1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmluZm8uZmlybXdhcmVfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmluZm8ub3VpLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pbmZvLnByb2R1Y3RfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmluZm8udmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmluZm8uZXh0ZW5kZWRfaWQsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT51LmluZm8uYmFzZV9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5tYXhfbGlua3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5udW1fcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5udW1fYXNzaWduYWJsZV91cHN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5tYXhfcXVldWVzX3Blcl9saW5rX3Vwc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmluZm8ucXVldWVfaW5jcmVtZW50X3Vwc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmluZm8ubnVtX2Fzc2lnbmFibGVfZG93bnN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5tYXhfcXVldWVzX3Blcl9saW5rX2Rvd25zdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5xdWV1ZV9pbmNyZW1lbnRfZG93bnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby51cHN0cmVhbV9idWZmZXJfYXZhaWxhYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pbmZvLmRvd25zdHJlYW1fYnVmZmVyX2F2YWlsYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby5qZWRlY19tYW51ZmFjdHVyZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmluZm8uY2hpcF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuaW5mby5jaGlwX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXNwb25zZV9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjaygmdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3NfdW5wYWNrKCZ0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXIubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci51bmljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc191bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlcl9yZXNwb25zZS5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLnVuaWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCA+IDApICYmICh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfa2V5X2V4Y2hhbmdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZmlsZV9hY2suYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjaygmdGhpcy0+dS5maWxlX2Fjay5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZmlsZV9kYXRhLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCA+IDApICYmICh0aGlzLT51LmZpbGVfZGF0YS5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2ZpbGVfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZpbGVfZGF0YS5kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEsIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZV91bnBhY2soJnRoaXMtPnUuZmlsZV9yZWFkX3JlcXVlc3QuZmlsZV90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3VucGFjaygmdGhpcy0+dS5maWxlX3dyaXRlX3JlcXVlc3QuZmlsZV90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1VOQUNLRURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3VuYWNrZWRfYWN0aW9uX2NvdW50X3ZhcmlhYmxlX2NvbnRhaW5lcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc19jb3VudCA+IDApICYmICh0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZV9jb250YWluZXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5hY2tlZF9hY3Rpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfdW5wYWNrKCZ0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNbaTRdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSBvcDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlX3VucGFjaygmb3AsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAma2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGtleV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwga2V5X2xlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1VOQUNLRURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcmlhYmxlX2NvbnRhaW5lcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9jb250YWluZXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyaWFibGVfY29udGFpbmVyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0xPT1BfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRVFVRVNUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3VuYWNrZWRfYWN0aW9uX2NvdW50X3ZhcmlhYmxlX2NvbnRhaW5lcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3BhY2sodGhpcy0+ZmlsZV9vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmZpbGVfb3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9IRUFEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmhlYWQuZmlsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuaGVhZC5ub3RfZmlsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaGVhZC5jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kYXRhLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGF0YS5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGF0YS5kYXRhLCB0aGlzLT51LmRhdGEuZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9JRFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaWR4LmlkeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF9wYWNrKHRoaXMtPnUuYWNrLmZyYW1lX3R5cGVfYWNrLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5hY2suZXJyb3JfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hY2suYmxvY2tfcngpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5maWxlX29wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSEVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmRhdGEuZGF0YV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSURYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfdW5wYWNrKCZ0aGlzLT5maWxlX29wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV9vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0hFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuaGVhZC5maWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5oZWFkLm5vdF9maWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5oZWFkLmNyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfZGF0YV9jb3VudF9kYXRhKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRhdGEuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmRhdGEuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGF0YS5kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5kYXRhLmRhdGEsIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0lEWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pZHguaWR4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3VucGFjaygmdGhpcy0+dS5hY2suZnJhbWVfdHlwZV9hY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmFjay5lcnJvcl9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmFjay5ibG9ja19yeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIGZpbGVfb3A7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfdW5wYWNrKCZmaWxlX29wLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZmlsZV9vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0hFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRhdGFfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChkYXRhX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9JRFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9kYXRhX2NvdW50X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3BhY2sodGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0ZJUk1XQVJFX1VQREFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX3BhY2soJnRoaXMtPnUuZmlybXdhcmVfdXBkYXRlLmZpbGVfaW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQUNLTk9XTEVER0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FVVEhFTlRJQ0FURV9PTlU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0VOQ1JZUFRJT05fRU5BQkxFX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0lHTVBfU05PT1BJTkdfUEFDS0VUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfTUFHSUNfTlVNQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSFlfTE9PUF9CQUNLX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFTU9URV9BQ0NFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1NFVF9BTEFSTV9USFJFU0hPTERTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9USFJFU0hPTERfUkVQT1JUX1ZBTFVFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVFVSTl9PTlVfSU5fVE9fT0ZGX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX0NPTkZJR1VSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRklSTVdBUkVfVVBEQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmZpcm13YXJlX3VwZGF0ZS5maWxlX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FDS05PV0xFREdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BVVRIRU5USUNBVEVfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9JR01QX1NOT09QSU5HX1BBQ0tFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX01BR0lDX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUEhZX0xPT1BfQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRU1PVEVfQUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9TRVRfQUxBUk1fVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVEhSRVNIT0xEX1JFUE9SVF9WQUxVRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RVUk5fT05VX0lOX1RPX09GRl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9DT05GSUdVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZV91bnBhY2soJnRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9GSVJNV0FSRV9VUERBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV91bnBhY2soJnRoaXMtPnUuZmlybXdhcmVfdXBkYXRlLmZpbGVfaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BQ0tOT1dMRURHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQVVUSEVOVElDQVRFX09OVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfSUdNUF9TTk9PUElOR19QQUNLRVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9NQUdJQ19OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BIWV9MT09QX0JBQ0tfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRV9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVNT1RFX0FDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfU0VUX0FMQVJNX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RIUkVTSE9MRF9SRVBPUlRfVkFMVUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9UVVJOX09OVV9JTl9UT19PRkZfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfQ09ORklHVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlIG9wOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3VucGFjaygmb3AsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0ZJUk1XQVJFX1VQREFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BQ0tOT1dMRURHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQVVUSEVOVElDQVRFX09OVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfSUdNUF9TTk9PUElOR19QQUNLRVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9NQUdJQ19OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BIWV9MT09QX0JBQ0tfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRV9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVNT1RFX0FDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfU0VUX0FMQVJNX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RIUkVTSE9MRF9SRVBPUlRfVkFMVUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9UVVJOX09OVV9JTl9UT19PRkZfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfQ09ORklHVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfcGFjayh0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soJnRoaXMtPnUuY3RjLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9wYWNrKCZ0aGlzLT51LnRlay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKCZ0aGlzLT51LnBtYy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soJnRoaXMtPnUua3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3BhY2soJnRoaXMtPnUuZGFzYW4uY29uZmlnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmJyY20udmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYnJjbS5zZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmJyY20ubnVtX3RvdGFsX2V4cGVjdGVkX3BhY2tldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3BhY2soJnRoaXMtPnUuYnJjbS5wZHUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjaygmdGhpcy0+dS5zaWVwb25fYS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZWYudW5rbm93biwgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY3RjLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudGVrLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5wbWMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZHBvZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5rdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRhc2FuLmNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2ICsgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmJyY20ucGR1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zaWVwb25fYS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRlZi51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjaygmdGhpcy0+dS5jdGMudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5wYWNrKCZ0aGlzLT51LnRlay52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjaygmdGhpcy0+dS5wbWMudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjaygmdGhpcy0+dS5kcG9lLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV91bnBhY2soJnRoaXMtPnUua3QudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmRhc2FuLmNvbmZpZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5icmNtLnZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmJyY20uc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5icmNtLm51bV90b3RhbF9leHBlY3RlZF9wYWNrZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3VucGFjaygmdGhpcy0+dS5icmNtLnBkdSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjaygmdGhpcy0+dS5zaWVwb25fYS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2RlZl9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5kZWYudW5rbm93biwgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfcGFjayh0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaW5mby50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaW5mby50bHZzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRsdnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5pbmZvLnRsdnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3BhY2soJnRoaXMtPnUuaW5mby50bHZzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi5zZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c19jb3VudCA+IDApICYmICh0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRsdnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2V2ZW50X25vdGlmaWNhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9wYWNrKCZ0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS52YXJfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfcGFjaygmdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3BhY2sodGhpcy0+dS5sb29wYmFja19jb250cm9sLmNvbW1hbmQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmluZm8udGx2c19jb3VudCA+IDApICYmICh0aGlzLT51LmluZm8udGx2cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHZzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuaW5mby50bHZzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuaW5mby50bHZzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGx2c19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzW2kyXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNbaTNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlX3VucGFjaygmdGhpcy0+Y29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5pbmZvLnRsdnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2luZm9fY291bnRfdGx2cyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5pbmZvLnRsdnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5pbmZvLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHZzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuaW5mby50bHZzID0gKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmluZm8udGx2c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5pbmZvLnRsdnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3VucGFjaygmdGhpcy0+dS5pbmZvLnRsdnNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24uc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9ldmVudF9ub3RpZmljYXRpb25fY291bnRfdGx2cyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c19jb3VudCA+IDApICYmICh0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGx2c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZXZlbnRfbm90aWZpY2F0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnMgPSAoYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX3VucGFjaygmdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVxdWVzdF9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS52YXJfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzID0gKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVzcG9uc2VfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjaygmdGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfTE9PUEJBQ0tfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZF91bnBhY2soJnRoaXMtPnUubG9vcGJhY2tfY29udHJvbC5jb21tYW5kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlX3VucGFjaygmY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGx2c19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGx2c19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHRsdnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRsdnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGx2c19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHRsdnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9pbmZvX2NvdW50X3RsdnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9ldmVudF9ub3RpZmljYXRpb25fY291bnRfdGx2cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfcGFjaygmdGhpcy0+b2FtX2NvbnRlbnQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm9hbV9jb250ZW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF91bnBhY2soJnRoaXMtPm9hbV9jb250ZW50LCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+b3VpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmdGhpcy0+b3VpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZ19jb3VudCA+IDApICYmICh0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuZG9yX291aV9yZWdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZ19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpX3BhY2soJnRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZ1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg2ICogdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZ19jb3VudCA+IDApICYmICh0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3Jfb3VpX3JlZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHZlbmRvcl9vdWlfcmVnX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdmVuZG9yX291aV9yZWdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpKSAqIHZlbmRvcl9vdWlfcmVnX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgdmVuZG9yX291aV9yZWdfY291bnQgKiA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHX0lORk9fVFlQRV9WRU5ET1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9wYWNrKCZ0aGlzLT51LnZlbmRvci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPnUuZGVmLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVuZ3RoX3Jlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHX0lORk9fVFlQRV9WRU5ET1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudmVuZG9yLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHX0lORk9fVFlQRV9WRU5ET1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl91bnBhY2soJnRoaXMtPnUudmVuZG9yLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZGVmLmFjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGUgdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHX0lORk9fVFlQRV9WRU5ET1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmluZm9fcmVnX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmluZm9fcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPmluZm9fcmVnID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImluZm9fcmVnXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmluZm9fcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl9wYWNrKCZ0aGlzLT5pbmZvX3JlZ1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5pbmZvX3JlZ19jb3VudCA+IDApICYmICh0aGlzLT5pbmZvX3JlZyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbmZvX3JlZ19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmluZm9fcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmluZm9fcmVnW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW5mb19yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW5mb19yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+aW5mb19yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbmZvX3JlZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pbmZvX3JlZyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+aW5mb19yZWdfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmluZm9fcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl91bnBhY2soJnRoaXMtPmluZm9fcmVnW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaW5mb19yZWdfY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbmZvX3JlZ19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdikgKiBpbmZvX3JlZ19jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgaW5mb19yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3BhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF91bnBhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2NfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayh0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fcGFjayh0aGlzLT51Lmt0YWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5leHRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5leHRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUua3RhdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5rdGFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2NfcGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY191bnBhY2soJnRoaXMtPmRlc2NyaXB0b3IsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52YXJpYWJsZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyAoNiAqIHRoaXMtPnZhcmlhYmxlX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52YXJpYWJsZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52YXJpYWJsZV9jb3VudCA+IDApICYmICh0aGlzLT52YXJpYWJsZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YXJpYWJsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT52YXJpYWJsZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT52YXJpYWJsZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHZhcmlhYmxlX2NvdW50OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSkgKiB2YXJpYWJsZV9jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB2YXJpYWJsZV9jb3VudCAqIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb250LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3VucGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9LVE9OVV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NPRlRXQVJFX0RPV05MT0FEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3VucGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmRlZi5hY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSBvcGNvZGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9LVE9OVV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NPRlRXQVJFX0RPV05MT0FEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9wYWNrKCZ0aGlzLT5vcGNvZGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5vcGNvZGVfY291bnQgPiAwKSAmJiAodGhpcy0+b3Bjb2RlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm9wY29kZXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+b3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm9wY29kZXMgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+b3Bjb2RlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IG9wY29kZV9jb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJm9wY29kZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlKSAqIG9wY29kZV9jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgb3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3BhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfcGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfcGFjaygmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3VucGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJmFjdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2NfcGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY191bnBhY2soJnRoaXMtPmRlc2NyaXB0b3IsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52YXJpYWJsZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyAoNiAqIHRoaXMtPnZhcmlhYmxlX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52YXJpYWJsZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52YXJpYWJsZV9jb3VudCA+IDApICYmICh0aGlzLT52YXJpYWJsZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YXJpYWJsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT52YXJpYWJsZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT52YXJpYWJsZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHZhcmlhYmxlX2NvdW50OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSkgKiB2YXJpYWJsZV9jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB2YXJpYWJsZV9jb3VudCAqIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb250LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3VucGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0xPT1BfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVJfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1VOQUNLRURfQUNUSU9OOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3VucGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmRlZi5hY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSBvcGNvZGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0xPT1BfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVJfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1VOQUNLRURfQUNUSU9OOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9wYWNrKCZ0aGlzLT5vcGNvZGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5vcGNvZGVfY291bnQgPiAwKSAmJiAodGhpcy0+b3Bjb2RlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm9wY29kZXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+b3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm9wY29kZXMgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+b3Bjb2RlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IG9wY29kZV9jb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJm9wY29kZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlKSAqIG9wY29kZV9jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgb3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3BhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfcGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfcGFjaygmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3VucGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJmFjdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuc3RhbmRhcmRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5leHRlbmRlZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuc3RhbmRhcmRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5leHRlbmRlZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3BhY2soJnRoaXMtPmRlc2NyaXB0b3IsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbmd0aF9yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfdW5wYWNrKCZ0aGlzLT5kZXNjcmlwdG9yLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbmd0aF9yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT52YXJpYWJsZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52YXJpYWJsZV9jb3VudCA+IDApICYmICh0aGlzLT52YXJpYWJsZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyaWFibGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICg2ICogdGhpcy0+dmFyaWFibGVfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmFyaWFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dmFyaWFibGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyaWFibGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhcmlhYmxlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT52YXJpYWJsZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52YXJpYWJsZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV91bnBhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHZhcmlhYmxlX2NvdW50OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUpICogdmFyaWFibGVfY291bnQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdmFyaWFibGVfY291bnQgKiA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb250LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3VucGFjaygmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfcGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcmVxdWVzdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+dS5kZWYuYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kZWYubGVuZ3RoX3Jlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSBvcGNvZGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soJm9wY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+b3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm9wY29kZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9wYWNrKCZ0aGlzLT5vcGNvZGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm9wY29kZV9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vcGNvZGVzW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+b3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5vcGNvZGVzID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5vcGNvZGVfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm9wY29kZV9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGVzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmb3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlKSAqIG9wY29kZV9jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgb3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfcGFjaygmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3VucGFjaygmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3BhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9wYWNrKCZ0aGlzLT51LmRwb2UudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPnUuZGVmLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmN0Yy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS50ZWsudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kcG9lLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3VucGFjaygmdGhpcy0+dS5jdGMudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3VucGFjaygmdGhpcy0+dS50ZWsudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdW5wYWNrKCZ0aGlzLT51LmRwb2UudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBvdWk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZvdWksIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZlbmRvcl9vdWlfcmVnID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbmRvcl9vdWlfcmVnXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfcGFjaygmdGhpcy0+dmVuZG9yX291aV9yZWdbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZlbmRvcl9vdWlfcmVnID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbmRvcl9vdWlfcmVnX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52ZW5kb3Jfb3VpX3JlZ19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnZlbmRvcl9vdWlfcmVnW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZlbmRvcl9vdWlfcmVnID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuZG9yX291aV9yZWdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52ZW5kb3Jfb3VpX3JlZyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT52ZW5kb3Jfb3VpX3JlZ19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52ZW5kb3Jfb3VpX3JlZ19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV91bnBhY2soJnRoaXMtPnZlbmRvcl9vdWlfcmVnW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCB2ZW5kb3Jfb3VpX3JlZ19jb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnZlbmRvcl9vdWlfcmVnX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkpICogdmVuZG9yX291aV9yZWdfY291bnQpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IHZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3BhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjaygmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3VucGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJmFjdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19wYWNrKCZ0aGlzLT51LmluZm8udmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX3BhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPnUuZGVmLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVuZ3RoX3Jlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuaW5mby52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfTE9PUEJBQ0tfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb191bnBhY2soJnRoaXMtPnUuaW5mby52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX3VucGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZGVmLmFjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgb3Bjb2RlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV91bnBhY2soJm9wY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfTE9PUEJBQ0tfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWFzdGVyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZWdpc3RyYXRpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9wYWNrKCZ0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA0OworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvbl9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbltpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1hc3Rlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbiA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfdW5wYWNrKCZ0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJlZ2lzdHJhdGlvbl9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcmVnaXN0cmF0aW9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSkgKiByZWdpc3RyYXRpb25fY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHJlZ2lzdHJhdGlvbl9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZWdpc3RyYXRpb25zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+cmVnaXN0cmF0aW9ucyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZWdpc3RyYXRpb25zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5yZWdpc3RyYXRpb25zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25zW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT5yZWdpc3RyYXRpb25zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvbnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5yZWdpc3RyYXRpb25zW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZWdpc3RyYXRpb25zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+cmVnaXN0cmF0aW9ucyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnJlZ2lzdHJhdGlvbnMgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3VucGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCByZWdpc3RyYXRpb25zX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcmVnaXN0cmF0aW9uc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbikgKiByZWdpc3RyYXRpb25zX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCByZWdpc3RyYXRpb25zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvcnRfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5saW5rLmxpbmtfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9VU0VSX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm5ldHdvcmtfcG9uLnBvcnRfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5saW5rLmxpbmtfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlIHR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9VU0VSX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fcGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfcGFjayh0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5uZWdvdGlhdGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fcGFjayh0aGlzLT51LmN0Yy52ZXJzaW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbl9wYWNrKHRoaXMtPnUuZHBvZS52ZXJzaW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCB2ZXJzaW9uX2xlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bmVnb3RpYXRlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdmVyc2lvbl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgdmVyc2lvbl9sZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uX3VucGFjaygmdGhpcy0+dS5jdGMudmVyc2lvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbl91bnBhY2soJnRoaXMtPnUuZHBvZS52ZXJzaW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgdmVyc2lvbl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZvdWksIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmNvdW50ID4gMCkgJiYgKHRoaXMtPm5lZ290aWF0ZWRfb2FtcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuZWdvdGlhdGVkX29hbXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX3BhY2soJnRoaXMtPm5lZ290aWF0ZWRfb2Ftc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+Y291bnQgPiAwKSAmJiAodGhpcy0+bmVnb3RpYXRlZF9vYW1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+bmVnb3RpYXRlZF9vYW1zW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmNvdW50ID4gMCkgJiYgKHRoaXMtPm5lZ290aWF0ZWRfb2FtcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5lZ290aWF0ZWRfb2Ftc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm5lZ290aWF0ZWRfb2FtcyA9IChiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmNvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV91bnBhY2soJnRoaXMtPm5lZ290aWF0ZWRfb2Ftc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZjb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0pICogY291bnQpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IGNvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfcGFjayh0aGlzLT5jb21tYW5kLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9FTkFCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9ESVNBQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09OVV9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9wYWNrKCZ0aGlzLT51LnNldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9wYWNrKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3BhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3BhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLm5lZ290aWF0ZWRfb2FtLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfVEVSTUlOQVRPUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNDsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQpICsgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLm5lZ290aWF0ZWRfb2FtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfVEVSTUlOQVRPUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF91bnBhY2soJnRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5jb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3VucGFjaygmdGhpcy0+dS5zZXRfb2FtX3JlZ2lzdHJhdGlvbi5vYW1fcmVnaXN0cmF0aW9ucywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3VucGFjaygmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfdW5wYWNrKCZ0aGlzLT51LnNldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnNldF9uZWdvdGlhdGVkX29hbS5uZWdvdGlhdGVkX29hbSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQgY29tbWFuZDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF91bnBhY2soJmNvbW1hbmQsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfVEVSTUlOQVRPUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfcGFjayh0aGlzLT5jb21tYW5kLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZV9wYWNrKHRoaXMtPnJlc3BvbnNlX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZV9wYWNrKHRoaXMtPnUuZ2V0X29udV9zdGF0ZS5zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9wYWNrKCZ0aGlzLT51LmdldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjaygmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfcGFjaygmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubmVnb3RpYXRlZF9vYW0sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3BhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1RFUk1JTkFUT1I6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfb2FtX3JlZ2lzdHJhdGlvbi5vYW1fcmVnaXN0cmF0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0KSArIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5uZWdvdGlhdGVkX29hbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfdW5wYWNrKCZ0aGlzLT5jb21tYW5kLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZV91bnBhY2soJnRoaXMtPnJlc3BvbnNlX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5jb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZV91bnBhY2soJnRoaXMtPnUuZ2V0X29udV9zdGF0ZS5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3VucGFjaygmdGhpcy0+dS5nZXRfb2FtX3JlZ2lzdHJhdGlvbi5vYW1fcmVnaXN0cmF0aW9ucywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl91bnBhY2soJnRoaXMtPnUuZ2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF91bnBhY2soJnRoaXMtPnUuZ2V0X25lZ290aWF0ZWRfb2FtLm5lZ290aWF0ZWRfb2FtLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfdW5wYWNrKCZ0aGlzLT51LnNldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfVEVSTUlOQVRPUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCBjb21tYW5kOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjaygmY29tbWFuZCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9FTkFCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9ESVNBQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09OVV9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfVEVSTUlOQVRPUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfQ09NTUFORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfcGFjaygmdGhpcy0+dS5jb21tYW5kLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX3BhY2soJnRoaXMtPnUucmVzcG9uc2UudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfQ09NTUFORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbW1hbmQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTVVOSUNBVElPTl9UWVBFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlc3BvbnNlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTVVOSUNBVElPTl9UWVBFX0NPTU1BTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX3VucGFjaygmdGhpcy0+dS5jb21tYW5kLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTVVOSUNBVElPTl9UWVBFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfdW5wYWNrKCZ0aGlzLT51LnJlc3BvbnNlLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfQ09NTUFORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTVVOSUNBVElPTl9UWVBFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfcGFjayh0aGlzLT5wcm90b2NvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Y29ycmVsYXRpb25fdGFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnByb3RvY29sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9QSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFnc19wYWNrKHRoaXMtPnUucGluZy5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9FTkNBUFNVTEFURURfRlJBTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9wYWNrKCZ0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5kbWVwLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfcGFjaygmdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuc21lcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2xlbmd0aCA+IDApICYmICh0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZyYW1lX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fZW5jYXBzdWxhdGVkX2ZyYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2RhdGEsIHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfT0FNX0NPTlRFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9wYWNrKCZ0aGlzLT51Lm9hbV9jb250ZW50LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1JFR0lTVEVSRURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfcGFjaygmdGhpcy0+dS5yZWdpc3RlcmVkX29hbS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9NQVNURVJfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fcGFjaygmdGhpcy0+dS5tYXN0ZXJfY29tbXVuaWNhdGlvbi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9CUk9BRENPTV9TREs6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX1BST1RPQ09MX1RFS19VTktOT1dOOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNjsKKyAgICBzd2l0Y2ggKHRoaXMtPnByb3RvY29sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9QSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9FTkNBUFNVTEFURURfRlJBTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNiArIHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX09BTV9DT05URU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9hbV9jb250ZW50LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1JFR0lTVEVSRURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyZWRfb2FtLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubWFzdGVyX2NvbW11bmljYXRpb24udmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfQlJPQURDT01fU0RLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9QUk9UT0NPTF9URUtfVU5LTk9XTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sX3VucGFjaygmdGhpcy0+cHJvdG9jb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmNvcnJlbGF0aW9uX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5wcm90b2NvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3NfdW5wYWNrKCZ0aGlzLT51LnBpbmcuZmxhZ3MsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9FTkNBUFNVTEFURURfRlJBTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF91bnBhY2soJnRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmRtZXAsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdW5wYWNrKCZ0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5zbWVwLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmcmFtZV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX2VuY2Fwc3VsYXRlZF9mcmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfZGF0YSwgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9PQU1fQ09OVEVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3VucGFjaygmdGhpcy0+dS5vYW1fY29udGVudC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUkVHSVNURVJFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJlZF9vYW0udmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl91bnBhY2soJnRoaXMtPnUubWFzdGVyX2NvbW11bmljYXRpb24udmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0JST0FEQ09NX1NESzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9NQVNURVJfUFJPVE9DT0xfVEVLX1VOS05PV046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfdW5wYWNrKCZwcm90b2NvbCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAocHJvdG9jb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1BJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0VOQ0FQU1VMQVRFRF9GUkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBmcmFtZV9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZmcmFtZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBmcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBmcmFtZV9sZW5ndGggKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9PQU1fQ09OVEVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUkVHSVNURVJFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0JST0FEQ09NX1NESzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9NQVNURVJfUFJPVE9DT0xfVEVLX1VOS05PV046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2sodGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3BhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnRlay52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fdW5wYWNrKCZ0aGlzLT51LnRlay52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV9wYWNrKHRoaXMtPnN1YnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfcGFjayh0aGlzLT51Lm9hbS5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfcGFjaygmdGhpcy0+dS5vYW0uY29udGVudCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBQ1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQU1QOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5zdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vYW0uY29udGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFDUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV91bnBhY2soJnRoaXMtPnN1YnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfdW5wYWNrKCZ0aGlzLT51Lm9hbS5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdW5wYWNrKCZ0aGlzLT51Lm9hbS5jb250ZW50LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFDUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSBzdWJ0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV91bnBhY2soJnN1YnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChzdWJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBQ1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQU1QOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfcGFjayh0aGlzLT5ldGhlcnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5ldGhlcnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1pFUk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lnplcm8ucGFkZGluZ19jb3VudCA+IDApICYmICh0aGlzLT51Lnplcm8ucGFkZGluZyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwYWRkaW5nXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3plcm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS56ZXJvLnBhZGRpbmcsIHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3BhY2soJnRoaXMtPnUuY3ZsYW4udmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV9wYWNrKCZ0aGlzLT51LnN2bGFuLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lUQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV9wYWNrKCZ0aGlzLT51Lml0YWcudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3BhY2soJnRoaXMtPnUuc2xvd19wcm90b2NvbC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9FQVBPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9wYWNrKCZ0aGlzLT51LmVhcG9sLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0FSUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JUFY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfTVBDUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+ZXRoZXJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9aRVJPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQ1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NWTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JVEFHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNsb3dfcHJvdG9jb2wudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfRUFQT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmVhcG9sLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0FSUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JUFY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfTVBDUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRlZi51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfdW5wYWNrKCZ0aGlzLT5ldGhlcnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5ldGhlcnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1pFUk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS56ZXJvLnBhZGRpbmdfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfemVyb19jb3VudF9wYWRkaW5nKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lnplcm8ucGFkZGluZ19jb3VudCA+IDApICYmICh0aGlzLT51Lnplcm8ucGFkZGluZyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBhZGRpbmdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfemVyb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lnplcm8ucGFkZGluZyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lnplcm8ucGFkZGluZ19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuemVyby5wYWRkaW5nLCB0aGlzLT51Lnplcm8ucGFkZGluZ19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQ1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV91bnBhY2soJnRoaXMtPnUuY3ZsYW4udmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5zdmxhbi52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lUQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV91bnBhY2soJnRoaXMtPnUuaXRhZy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF91bnBhY2soJnRoaXMtPnUuc2xvd19wcm90b2NvbC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0VBUE9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3VucGFjaygmdGhpcy0+dS5lYXBvbC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0FSUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JUFY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfTVBDUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2RlZl9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIGV0aGVydHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlX3VucGFjaygmZXRoZXJ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZXRoZXJ0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9aRVJPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhZGRpbmdfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwYWRkaW5nX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQ1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lUQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfRUFQT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3plcm9fY291bnRfcGFkZGluZyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmRhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5zYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5wcm90b2NvbHNfY291bnQgPiAwKSAmJiAodGhpcy0+cHJvdG9jb2xzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByb3RvY29sc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5wcm90b2NvbHNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9wYWNrKCZ0aGlzLT5wcm90b2NvbHNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxMjsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPnByb3RvY29sc19jb3VudCA+IDApICYmICh0aGlzLT5wcm90b2NvbHMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJvdG9jb2xzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cHJvdG9jb2xzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5wcm90b2NvbHNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+ZGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnNhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB0aGlzLT5wcm90b2NvbHNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfY291bnRfcHJvdG9jb2xzKGJ1Zik7CisgICAgaWYgKCh0aGlzLT5wcm90b2NvbHNfY291bnQgPiAwKSAmJiAodGhpcy0+cHJvdG9jb2xzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJvdG9jb2xzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnByb3RvY29scyA9IChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnByb3RvY29sc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnByb3RvY29sc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3VucGFjaygmdGhpcy0+cHJvdG9jb2xzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IHByb3RvY29sc19lbGVtX2NvdW50ID0gMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwcm90b2NvbHNfZWxlbV9jb3VudCArPSAxOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwcm90b2NvbHNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wpKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9jb3VudF9wcm90b2NvbHMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5kYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+c2EpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfcGFjayh0aGlzLT5wcm90b2NvbF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV9wYWNrKHRoaXMtPnN1YnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3BhY2sodGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3BhY2soJnRoaXMtPmNvbnRlbnQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgKnRoaXMpCit7CisgICAgcmV0dXJuIDE3ICsgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y29udGVudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5kYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+c2EpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfdW5wYWNrKCZ0aGlzLT5wcm90b2NvbF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV91bnBhY2soJnRoaXMtPnN1YnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3VucGFjaygmdGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3VucGFjaygmdGhpcy0+Y29udGVudCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Z3Bpb19zdGF0ZTFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Z3Bpb19zdGF0ZTEwZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ncGlvX3N0YXRlMWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ncGlvX3N0YXRlMTBnKSkKKyAgICB7CisgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3BhY2sodGhpcy0+YWxhcm1fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJhaXNlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0X3BhY2sodGhpcy0+YWxhcm1fY29udGV4dCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFUX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuc3RhdF9hbGFybS5zdGF0X2lkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0xJTktfRkFVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3BhY2soJnRoaXMtPnUuZ3Bpb19saW5rX2ZhdWx0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0RZSU5HX0dBU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3BhY2soJnRoaXMtPnUuZ3Bpb19keWluZ19nYXNwLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0NSSVRJQ0FMX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19wYWNrKCZ0aGlzLT51LmdwaW9fY3JpdGljYWxfZXZlbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fT1RIRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3BhY2soJnRoaXMtPnUuZ3Bpb19vdGhlci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUSF9VTkFWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9CT09UX0lOVkFMSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NSSVRJQ0FMX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19ESVNDT1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRElBR19MT0FEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9EWUlOR19HQVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GQU5fRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMQVNIX0JVU1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMT1dfQ09OVFJPTF9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HQVRFX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0lQTl9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEFTRVJfQUxXQVlTX09OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MRUFSTl9UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19GQVVMVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19PQU1fRElTQ19DT01QTEVURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1RBUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NVQ0NFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT1NTX09GX1NJR05BTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT0FNX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9QT05fRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1JFQURZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1JUX0RJU0FCTEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9URU1QX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9URU1QX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUFJPVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1FVRVVFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFUE9SVF9GQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFOREJZX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1lTVEVNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFJBTlNNSVRfREVHUkFERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFhfRkFJTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA5OworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQVRfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0xJTktfRkFVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19EWUlOR19HQVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19PVEhFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRIX1VOQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0JPT1RfSU5WQUxJRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0RJU0NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9ESUFHX0xPQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RZSU5HX0dBU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZBTl9GQVVMVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxBU0hfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxPV19DT05UUk9MX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dBVEVfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfSVBOX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MQVNFUl9BTFdBWVNfT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xFQVJOX1RBQkxFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX09BTV9ESVNDX0NPTVBMRVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19GQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVEFSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1VDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xPU1NfT0ZfU0lHTkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PQU1fVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1BPTl9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUkVBRFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QUk9UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUVVFVUVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVQT1JUX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQU5EQllfTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TWVNURU06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RFTVBFUkFUVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UUkFOU01JVF9ERUdSQURFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UWF9GQUlMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV91bnBhY2soJnRoaXMtPmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yYWlzZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF91bnBhY2soJnRoaXMtPmFsYXJtX2NvbnRleHQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBVF9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LnN0YXRfYWxhcm0uc3RhdF9pZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19MSU5LX0ZBVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb191bnBhY2soJnRoaXMtPnUuZ3Bpb19saW5rX2ZhdWx0LnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fRFlJTkdfR0FTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fdW5wYWNrKCZ0aGlzLT51LmdwaW9fZHlpbmdfZ2FzcC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0NSSVRJQ0FMX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb191bnBhY2soJnRoaXMtPnUuZ3Bpb19jcml0aWNhbF9ldmVudC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX09USEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb191bnBhY2soJnRoaXMtPnUuZ3Bpb19vdGhlci52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRIX1VOQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0JPT1RfSU5WQUxJRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0RJU0NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9ESUFHX0xPQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RZSU5HX0dBU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZBTl9GQVVMVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxBU0hfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxPV19DT05UUk9MX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dBVEVfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfSVBOX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MQVNFUl9BTFdBWVNfT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xFQVJOX1RBQkxFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX09BTV9ESVNDX0NPTVBMRVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19GQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVEFSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1VDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xPU1NfT0ZfU0lHTkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PQU1fVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1BPTl9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUkVBRFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QUk9UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUVVFVUVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVQT1JUX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQU5EQllfTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TWVNURU06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RFTVBFUkFUVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UUkFOU01JVF9ERUdSQURFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UWF9GQUlMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSBhbGFybV9jb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjaygmYWxhcm1fY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChhbGFybV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBVF9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0xJTktfRkFVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0RZSU5HX0dBU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0NSSVRJQ0FMX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19PVEhFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVEhfVU5BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUT19ORUdfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQk9PVF9JTlZBTElEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DUklUSUNBTF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfRElTQ09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RJQUdfTE9BRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRFlJTkdfR0FTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkFOX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTEFTSF9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTE9XX0NPTlRST0xfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR0FURV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9JUE5fTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xBU0VSX0FMV0FZU19PTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEVBUk5fVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfT0FNX0RJU0NfQ09NUExFVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NUQVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9TU19PRl9TSUdOQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09BTV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUE9OX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9SRUFEWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BST1RfU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9RVUVVRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRVBPUlRfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBTkRCWV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NZU1RFTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RSQU5TTUlUX0RFR1JBREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RYX0ZBSUw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzc19wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmFkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdHRyaWJ1dGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LnBvcnRfc3RhdF90aHJlc2hvbGQuc3RhdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5saW5rX3N0YXRfdGhyZXNob2xkLnN0YXQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BUlBfUkVQTElDQVRFX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1FVQU5USVpFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfRFlOQU1JQ19FTlRSSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9QT0xJQ1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9WQ0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QUklfRU5RVUVVSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFNTVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTkZJR19WMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFQVJDSF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0FCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+YXR0cmlidXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BUlBfUkVQTElDQVRFX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1FVQU5USVpFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfRFlOQU1JQ19FTlRSSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9QT0xJQ1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9WQ0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QUklfRU5RVUVVSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFNTVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTkZJR19WMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFQVJDSF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0FCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+YXR0cmlidXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YXR0cmlidXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLnN0YXQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5zdGF0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NST1NTQkFSX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NUTF9WTEFOX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEJMX1NJWkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19ET1dOX0JJVF9MT0FESU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhUX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZBSUxTQUZFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJTEVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5URVJOQUxfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lQTUNfVU5LTk9XTl9MRUFWRV9GV0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9KRURFQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9UQUJMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUk9SX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HUk9VUF9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTURJX0NST1NTT1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TQ1JBVENIUEFEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9JR01QX1ZMQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fUE9MSUNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX0JJQVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVkNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFJJX0VOUVVFVUlORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfREVMQVlFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0xFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19BQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TWVNURU1fUlVMRV9PUFRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfREVMQVlFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fREVTVElOQVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9FVEhFUlRZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBhdHRyaWJ1dGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjaygmYXR0cmlidXRlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYXR0cmlidXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VUF9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3BhY2sodGhpcy0+Y29udGVudF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3BhY2soJnRoaXMtPnZlcnNpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb250ZW50X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQ0hBTkdFX0NJUEhFUl9TUEVDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0hBTkRTSEFLRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi5kYXRhLCB0aGlzLT51LmRlZi5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHN3aXRjaCAodGhpcy0+Y29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5kZWYuZGF0YV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3VucGFjaygmdGhpcy0+Y29udGVudF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3VucGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+Y29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYuZGF0YV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9kZWZfY291bnRfZGF0YSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi5kYXRhX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi5kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLmRhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZGVmLmRhdGEsIHRoaXMtPnUuZGVmLmRhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIGNvbnRlbnRfdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfdW5wYWNrKCZjb250ZW50X3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQVBQTElDQVRJT05fREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGRhdGFfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfZGVmX2NvdW50X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG1fcGFjayh0aGlzLT5oYXNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtX3BhY2sodGhpcy0+c2lnbmF0dXJlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobV91bnBhY2soJnRoaXMtPmhhc2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG1fdW5wYWNrKCZ0aGlzLT5zaWduYXR1cmUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIHVpbnQzMl90IGkwOworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50ID4gNjU1MzRMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3BhY2soJnRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMiAqIHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X2NvdW50X3N1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcygmcG9zdExlbkJ1Zik7CisgICAgaWYgKCh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQgPiAwKSAmJiAodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zID0gKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudCA+IDY1NTM0TCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV91bnBhY2soJnRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgdWludDMyX3Qgc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2VsZW1fY291bnQgPSAwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X2NvdW50X3N1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL2JjbW9sdF9lcG9uX29hbV90eXBlcy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9iY21vbHRfZXBvbl9vYW1fdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDI5NDJlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9iY21vbHRfZXBvbl9vYW1fdHlwZXMuaApAQCAtMCwwICsxLDIzOTA2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgQkNNT0xUX0VQT05fT0FNX1RZUEVTX0hfCisjZGVmaW5lIEJDTU9MVF9FUE9OX09BTV9UWVBFU19IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb3NfY29tbW9uLmgiCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiY21vbHRfYnVmLmgiCisKK3R5cGVkZWYgYmNtb2x0X2J1ZiBiY21vbHRfZXBvbl9vYW1fYnVmOworCisvKiogXGFkZHRvZ3JvdXAgZXBvbl9vYW0KKyAqIEB7CisgKi8KKworLyoqIEFsYXJtIENvbmZpZyBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9BTEFSTV9DT05GSUdfTU9ERV9DTE9TRSA9IDAsICAgIC8qKjwgQ2xvc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FMQVJNX0NPTkZJR19NT0RFX09QRU4gID0gMSAgICAgLyoqPCBPcGVuLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGU7CisKKy8qKiBBdXRvbmVnb3RpYXRlIEFkbWluIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9ORUdPVElBVEVfQURNSU5fU1RBVEVfT0FNX0FVVE9fQURNSU5fRElTQUJMRUQgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT0FNIEF1dG8gQWRtaW4gRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9ORUdPVElBVEVfQURNSU5fU1RBVEVfT0FNX0FVVE9fQURNSU5fRU5BQkxFRCAgICA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT0FNIEF1dG8gQWRtaW4gRW5hYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGU7CisKKy8qKiBBdXRvIE5lZ290aWF0aW9uIEF1dG8gQ29uZmlnLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQVVUT19DT05GSUdfT1RIRVIgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3RoZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQVVUT19DT05GSUdfQ09ORklHVVJJTkcgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29uZmlndXJpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQVVUT19DT05GSUdfQ09NUExFVEUgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29tcGxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQVVUT19DT05GSUdfRElTQUJMRUQgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQVVUT19DT05GSUdfUEFSQUxMRUxfRkFJTCAgICAgICAgICA9IDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUGFyYWxsZWwgRmFpbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWc7CisKKy8qKiBBdXRvLU5lZ290aWF0aW9uIENhcGFiaWxpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eQoreworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX05FR09USUFUSU9OX0NBUEFCSUxJVFlfTk9ORSAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX05FR09USUFUSU9OX0NBUEFCSUxJVFlfSEFMRl9EVVBMRVggICAgICAgICAgICAgPSAweDAwMDEsICAgICAgICAgICAgICAgICAgICAgICAvKio8IEhhbGYgRHVwbGV4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX05FR09USUFUSU9OX0NBUEFCSUxJVFlfRlVMTF9EVVBMRVggICAgICAgICAgICAgPSAweDAwMDIsICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZ1bGwgRHVwbGV4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX05FR09USUFUSU9OX0NBUEFCSUxJVFlfVEVOX01CUFMgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgICAgICAgICAgICAgICAgICAgICAvKio8IDEwIE1icHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9IVU5EUkVEX01CUFMgICAgICAgICAgICA9IDB4MDAwOCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTAwIE1icHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9USE9VU0FORF9NQlBTICAgICAgICAgICA9IDB4MDAxMCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTAwMCBNYnBzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX05FR09USUFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCUFMgICAgICAgICAgICAgICAgPSAweDAwMjAsICAgICAgICAgICAgICAgICAgICAgICAvKio8IDEwIEdicHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9GTE9XX0NPTlRST0wgICAgICAgICAgICA9IDB4MDA0MCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmxvdyBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX05FR09USUFUSU9OX0NBUEFCSUxJVFlfQVVUT19NRElfTURJX1ggICAgICAgICAgPSAweDAwODAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEF1dG8gTURJL01ESS1YLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5OworCisvKiogQXV0byBSZW1vdGUgU2lnLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWcKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19SRU1PVEVfU0lHX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEZXRlY3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19SRU1PVEVfU0lHX05PVF9ERVRFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOb3QgRGV0ZWN0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWc7CisKKy8qKiBBdXRvIFNlbGVjdG9yLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fU0VMRUNUT1JfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3RoZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fU0VMRUNUT1JfRVRIRVJORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXRoZXJuZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fU0VMRUNUT1JfSVNPX0VUSEVSTkVUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSVNPIEV0aGVybmV0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3RvcjsKKworLyoqIEJpbmFyeSBGaWVsZCBTZWxlY3QgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9EQSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TQSAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TU01fUExVU19JUERBICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU1NNICsgSVAgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9QUk9HX0ZJRUxEICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUHJvZyBGaWVsZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRCAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDVkxBTiBWSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEICAgICAgICA9IDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU1ZMQU4gVklEICYgQ1ZMQU4gVklELiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlOworCisvKiogQ01DIE9BTSBSZXF1ZXN0IE9wdGlvbiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19SRVFVRVNUX09QVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFkZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfUkVRVUVTVF9PUFRJT05fUkVNT1ZFICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZW1vdmUuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbjsKKworLyoqIENNQyBPQU0gcmVzdWx0IGNvZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1JFU1VMVF9DT0RFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfUkVTVUxUX0NPREVfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGYWlsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19SRVNVTFRfQ09ERV9JTlZBTElEX1BBUkFNRVRFUlMgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEludmFsaWQgUGFyYW1ldGVycy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlOworCisvKiogQ01DIE9BTSBhbm5leCBtb2RlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leAoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19BTk5FWF9BTk5FWF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFubmV4IEEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0FOTkVYX0FOTkVYX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQW5uZXggQi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4OworCisvKiogVHlwZSBvZiBDTUMgSW50ZXJmYWNlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRGX1RZUEVfRVRIRVJORVRfQ1NNQUNEICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV0aGVybmV0IENzbWFjZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URl9UWVBFX1NPRlRXQVJFX0xPT1BCQUNLICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTb2Z0d2FyZSBMb29wYmFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URl9UWVBFX0RPQ1NfQ0FCTEVfTUFDX0xBWUVSICAgICAgICAgICAgID0gMTI3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzIENhYmxlIE1hYyBMYXllci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URl9UWVBFX0RPQ1NfQ0FCTEVfRE9XTlNUUkVBTSAgICAgICAgICAgID0gMTI4LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzIENhYmxlIERvd25zdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEZfVFlQRV9ET0NTX0NBQkxFX1VQU1RSRUFNICAgICAgICAgICAgICA9IDEyOSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRG9jcyBDYWJsZSBVcHN0cmVhbS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZTsKKworLyoqIEludGVyZmFjZSBzdGF0dXMsIHVzZWQgZm9yIGlmQWRtaW5TdGF0dXMgYW5kIGlmT3BlclN0YXR1cyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSRkFDRV9TVEFUVVNfVVAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgdXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSRkFDRV9TVEFUVVNfRE9XTiAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZG93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19URVNUSU5HICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB0ZXN0aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkZBQ0VfU1RBVFVTX1VOS05PV04gICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSRkFDRV9TVEFUVVNfRE9STUFOVCAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZG9ybWFudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19OT1RfUFJFU0VOVCAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBub3QgcHJlc2VudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19MT1dFUl9MQVlFUl9ET1dOICAgICAgICAgID0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBsb3dlciBsYXllciBkb3duLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1czsKKworLyoqIENNQyBPQU0gaW50ZXJsZWF2ZXIgbW9kZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7MTI4LDF9LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsMn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezY0LDJ9LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsM30uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezMyLDR9LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsNH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezE2LDh9LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsNX0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezgsMTZ9LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsNn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezQsMzJ9LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsN30uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezIsNjR9LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsOH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEsMTI4fS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyOworCisvKiogQ01DIE9BTSBMb2FkIEJhbGFuY2luZyBNZXRob2RzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfTE9BRF9CQUxBTkNFX01FVEhPRF9TVEFUICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCYXNlZCBvbiBzdW1zIG9mIE1pbiBHdWFyYW50ZWVkIFJhdGVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0xPQURfQkFMQU5DRV9NRVRIT0RfRFlOQU1JQyAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmFzZWQgb24gY2hhbm5lbCB1dGlsaXphdGlvbiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZDsKKworLyoqIENNQyBPQU0gbW9kdWxhdGlvbiBtb2RlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX01PRFVMQVRJT05fUUFNNjQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUUFNNjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX01PRFVMQVRJT05fUUFNMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUUFNMjU2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19NT0RVTEFUSU9OX1FBTTEwMjQgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFFBTTEwMjQuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uOworCisvKiogQ01DIE9BTSBVUyBtb2R1bGF0aW9uIHR5cGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19NT0RVTEFUSU9OX1RZUEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1VTX01PRFVMQVRJT05fVFlQRV9URE1BICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVERNQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfTU9EVUxBVElPTl9UWVBFX0FURE1BICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBVERNQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfTU9EVUxBVElPTl9UWVBFX1NDRE1BICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTQ0RNQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfTU9EVUxBVElPTl9UWVBFX1RETUFfQVRETUEgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBURE1BLUFURE1BLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlOworCisvKiogQ01DIE9BTSBVUyBwcm9maWxlIHR5cGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19QUk9GSUxFX1RZUEVfRkFJUiAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZhaXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1VTX1BST0ZJTEVfVFlQRV9HT09EICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR29vZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfUFJPRklMRV9UWVBFX0JFU1QgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCZXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlOworCisvKiogQ05VIENvbm5lY3Rpdml0eSBTdGF0ZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX0lOSVRJQUxfUkFOR0lORyAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgLyoqPCBJbml0aWFsIFJhbmdpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9SQU5HSU5HX0FVVE9fQURKX0NPTVBMRVRFICAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgIC8qKjwgUmFuZ2luZyBBdXRvIEFkaiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX0RIQ1BfVjRDT01QTEVURSAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgICAgICAgICAgLyoqPCBEaGNwIFY0IENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfUkVHSVNUUkFUSU9OX0NPTVBMRVRFICAgICAgICAgICA9IDYsICAgICAgICAgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX09QRVJBVElPTkFMICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgICAgICAgICAgLyoqPCBPcGVyYXRpb25hbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX0JQSV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgICAgICAgICAgLyoqPCBCcGkgSW5pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX0VBRSAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBFQUUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9TVEFSVF9ESENQX1Y0ICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhcnQgRGhjcCBWNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX0RIQ1BfVjYgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBEaGNwIFY2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfREhDUF9WNkNPTVBMRVRFICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgICAgICAgICAvKio8IERoY3AgVjYgQ29tcGxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9TVEFSVF9DT05GSUdfRklMRV9ET1dOTE9BRCAgICAgID0gMTQsICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhcnQgQ29uZmlnIEZpbGUgRG93bmxvYWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9DT05GSUdfRklMRV9ET1dOTE9BRF9DT01QTEVURSAgID0gMTUsICAgICAgICAgICAgICAgICAgIC8qKjwgQ29uZmlnIEZpbGUgRG93bmxvYWQgQ29tcGxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9TVEFSVF9SRUdJU1RSQVRJT04gICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhcnQgUmVnaXN0cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfRk9SV0FSRElOR19ESVNBQkxFRCAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgICAgICAgICAvKio8IEZvcndhcmRpbmcgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9SRl9NVVRFX0FMTCAgICAgICAgICAgICAgICAgICAgID0gMTggICAgICAgICAgICAgICAgICAgIC8qKjwgUmYgTXV0ZSBBbGwuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGU7CisKKy8qKiBWZXJzaW9uIG9mIERPQ1NJUyB0aGF0IENOVSBpcyBvcGVyYXRpbmcgaW4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfRE9DU0lTX1ZFUlNJT05fRE9DU0lTMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzaXMxMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfRE9DU0lTX1ZFUlNJT05fRE9DU0lTMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzaXMxMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfRE9DU0lTX1ZFUlNJT05fRE9DU0lTMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzaXMyMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfRE9DU0lTX1ZFUlNJT05fRE9DU0lTMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzaXMzMC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uOworCisvKiogQ05VIElQIEFkZHJlc3MgVHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfSVBBRERSX1RZUEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9JUFY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAvKio8IElQdjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0lQQUREUl9UWVBFX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgIC8qKjwgSVB2Ni4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfSVBBRERSX1RZUEVfSVBWNFogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgLyoqPCBJUHY0ei4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfSVBBRERSX1RZUEVfSVBWNlogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgICAgICAgICAgLyoqPCBJUHY2ei4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfSVBBRERSX1RZUEVfRE5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiAgICAgICAgICAgICAgICAgICAgLyoqPCBETlMuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZTsKKworLyoqIENNQyBPQU0gUERVIG9wY29kZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFJlcXVlc3QgdG8gY29uZmlndXJlIGRvd25zdHJlYW0gY2hhbm5lbChzKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFJlc3BvbnNlIHRvIGNvbmZpZ3VyZSBkb3duc3RyZWFtIGNoYW5uZWwocykgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGN1cnJlbnQgZG93bnN0cmVhbSBjaGFubmVsKHMpIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBjdXJyZW50IGRvd25zdHJlYW0gY2hhbm5lbChzKSBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgIC8qKjwgUmVxdWVzdCB0byBjb25maWd1cmUgdXBzdHJlYW0gY2hhbm5lbChzKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IFJlc3BvbnNlIHRvIGNvbmZpZ3VyZSB1cHN0cmVhbSBjaGFubmVsKHMpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBjdXJyZW50IHVwc3RyZWFtIGNoYW5uZWwocykgY29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIGN1cnJlbnQgdXBzdHJlYW0gY2hhbm5lbChzKSBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgIC8qKjwgUmVxdWVzdCB0byBjb25maWd1cmUgQ05VIHdpdGggYSBwYXJ0aWN1bGFyIHByaW1hcnkgZG93bnN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJlIENOVSB3aXRoIGEgcGFydGljdWxhciBwcmltYXJ5IGRvd25zdHJlYW0gY2hhbm5lbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgQ05V4oCZcyBjdXJyZW50IHByaW1hcnkgZG93bnN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ05V4oCZcyBjdXJyZW50IHByaW1hcnkgZG93bnN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgIC8qKjwgUmVxdWVzdCB0byBjb25maWd1cmUgQ05VIHdpdGggYSBwYXJ0aWN1bGFyIHByaW1hcnkgdXBzdHJlYW0gY2hhbm5lbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGNvbmZpZ3VyZSBDTlUgd2l0aCBhIHBhcnRpY3VsYXIgcHJpbWFyeSB1cHN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBDTlXigJlzIGN1cnJlbnQgcHJpbWFyeSB1cHN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ05V4oCZcyBjdXJyZW50IHByaW1hcnkgdXBzdHJlYW0gY2hhbm5lbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUICAgICAgICAgICAgICA9IDE3LCAgICAgICAvKio8IFJlcXVlc3QgdG8gc2V0IG1heGltdW0gUkYgYXR0ZW51YXRpb24gbGV2ZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0UgICAgICAgICAgICAgPSAxOCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBzZXQgbWF4aW11bSBSRiBhdHRlbnVhdGlvbiBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUICAgICAgICAgICAgICA9IDE5LCAgICAgICAvKio8IFJlcXVlc3QgdG8gZ2V0IG1heGltdW0gUkYgYXR0ZW51YXRpb24gbGV2ZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0UgICAgICAgICAgICAgPSAyMCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBnZXQgbWF4aW11bSBSRiBhdHRlbnVhdGlvbiBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVCAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IFJlcXVlc3QgZm9yIGNyZWF0aW5nIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFICAgICAgICAgICAgPSAyMiwgICAgICAgLyoqPCBSZXNwb25zZSBmb3IgY3JlYXRpbmcgYSBsb2FkIGJhbGFuY2luZyBncm91cCByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVFVRVNUICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgYSBsaXN0IG9mIGxvYWQgYmFsYW5jaW5nIGdyb3VwcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUFNfUkVTUE9OU0UgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBsb2FkIGJhbGFuY2luZyBncm91cHMgcmVxdWVzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVCA9IDI1LCAgICAgICAvKio8IFJlcXVlc3QgdG8gYWRkIGRvd25zdHJlYW1zIHRvIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFPSAyNiwgICAgICAgLyoqPCBSZXNwb25zZSB0byBhZGQgZG93bnN0cmVhbXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFUVVFU1QgICAgICAgID0gMjcsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgbGlzdCBvZiBkb3duc3RyZWFtcyBpbiBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFU1BPTlNFICAgICAgID0gMjgsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZ2V0IGxpc3Qgb2YgZG93bnN0cmVhbXMgaW4gYSBsb2FkIGJhbGFuY2luZyBncm91cCByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVCAgID0gMjksICAgICAgIC8qKjwgUmVxdWVzdCB0byBhZGQgdXBzdHJlYW1zIHRvIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRSAgPSAzMCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBhZGQgdXBzdHJlYW1zIHRvIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgcmVxdWVzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVRVUVTVCAgICAgICAgICA9IDMxLCAgICAgICAvKio8IFJlcXVlc3QgdG8gZ2V0IGxpc3Qgb2YgdXBzdHJlYW1zIGluIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFU1BPTlNFICAgICAgICAgPSAzMiwgICAgICAgLyoqPCBSZXNwb25zZSB0byBnZXQgbGlzdCBvZiB1cHN0cmVhbXMgaW4gYSBsb2FkIGJhbGFuY2luZyBncm91cCByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1QgICAgICAgID0gMzMsICAgICAgIC8qKjwgUmVxdWVzdCB0byBhZGQgQ05VcyB0byBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFICAgICAgID0gMzQsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gYWRkIENOVXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFUVVFU1QgID0gMzUsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgQ05VIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVTUE9OU0UgPSAzNiwgICAgICAgLyoqPCBSZXNwb25zZSB0byBnZXQgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgQ05VIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVFVRVNUICAgICAgICA9IDM3LCAgICAgICAvKio8IFJlcXVlc3QgdG8gZ2V0IHRoZSBhY3RpdmUgbGlzdCBvZiBDTlVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxvYWQgYmFsYW5jaW5nIGdyb3VwICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0FDVElWRV9DTlVTX1JFU1BPTlNFICAgICAgID0gMzgsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gdGhlIGdldCBhY3RpdmUgbGlzdCBvZiBDTlVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxvYWQgYmFsYW5jaW5nIGdyb3VwICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFUVVFU1QgICAgICAgID0gMzksICAgICAgIC8qKjwgUmVxdWVzdCB0byBleGNsdWRlIENOVXMgZnJvbSBsb2FkIGJhbGFuY2luZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9FWENMVURFX0NOVVNfRlJPTV9MT0FEX0JBTEFOQ0lOR19SRVNQT05TRSAgICAgICA9IDQwLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGV4Y2x1ZGUgQ05VcyBmcm9tIGxvYWQgYmFsYW5jaW5nIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VU19DT05GSUdVUkFUSU9OX1JFUVVFU1QgICAgICAgICAgICAgPSA0MSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCBleGNsdWRlZCBDTlVzIGZyb20gbG9hZCBiYWxhbmNpbmcgY29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRSAgICAgICAgICAgICA9IDQyLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBleGNsdWRlZCBDTlVzIGZyb20gbG9hZCBiYWxhbmNpbmcgY29uZmlndXJhdGlvbiByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgID0gNDMsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgdGhlIGFjdGl2ZSBleGNsdWRlZCBDTlVzIGZyb20gbG9hZCBiYWxhbmNpbmcgbGlzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9BQ1RJVkVfQ05VU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICA9IDQ0LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBhY3RpdmUgZXhjbHVkZWQgQ05VcyBmcm9tIGxvYWQgYmFsYW5jaW5nIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUICAgICAgICAgICAgICAgPSA0NSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGNvbmZpZ3VyZSB0aGUgc3BlY2lmaWVkIExvYWQgQmFsYW5jaW5nIGdyb3VwcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFICAgICAgICAgICAgICA9IDQ2LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCBmb3IgTG9hZCBCYWxhbmNpbmcgZ3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVCAgICAgICAgICAgICAgID0gNDcsICAgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBkZXRhaWxlZCBhY3RpdmUgTG9hZCBCYWxhbmNpbmcgR3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0UgICAgICAgICAgICAgID0gNDgsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgZGV0YWlsZWQgYWN0aXZlIExvYWQgQmFsYW5jaW5nIEdyb3VwcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgICAgICAvKio8IFJlcXVlc3QgdG8gY29uZmlndXJlIHVwc3RyZWFtIGNoYW5uZWwgaW5wdXQgcG93ZXIgbGV2ZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgPSA1MCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBjb25maWd1cmUgdXBzdHJlYW0gY2hhbm5lbCBpbnB1dCBwb3dlciBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUICAgICAgICAgICAgICAgICAgICA9IDUxLCAgICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgdXBzdHJlYW0gaW5wdXQgcG93ZXIgbGV2ZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgPSA1MiwgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSB1cHN0cmVhbSBpbnB1dCBwb3dlciBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTMsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgQ05VIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTQsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIENOVSBzdGF0dXMgaW5mb3JtYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzk1LCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIENNQyBpbnRlcmZhY2UgYXR0cmlidXRlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTYsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIENNQyBpbnRlcmZhY2UgYXR0cmlidXRlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfTUFDX1NUQVRJU1RJQ1NfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICA9IDE3OTcsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgQ01DIE1BQyBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgID0gMTc5OCwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ01DIE1BQyBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5OSwgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBVcHN0cmVhbSBzZXJ2aWNlIGF0dHJpYnV0ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODAwLCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBVcHN0cmVhbSBzZXJ2aWNlIGF0dHJpYnV0ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODAxLCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIFVwc3RyZWFtIFBIWSBTaWduYWwgUXVhbGl0eSBkYXRhICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgwMiwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgVXBzdHJlYW0gUEhZIFNpZ25hbCBRdWFsaXR5IGRhdGEgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVFVRVNUICAgICAgICAgICAgICAgPSAxODAzLCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIENNQyBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFU1BPTlNFICAgICAgICAgICAgICA9IDE4MDQsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIENNQyBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1QgICAgICAgICA9IDE4MDUsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgRG93bnN0cmVhbSBCb25kaW5nIEdyb3VwIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFICAgICAgICA9IDE4MDYsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIERvd25zdHJlYW0gQm9uZGluZyBHcm91cCBzdGF0dXMgaW5mb3JtYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVCAgICAgICAgICAgPSAxODA3LCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIFVwc3RyZWFtIEJvbmRpbmcgR3JvdXAgc3RhdHVzIGluZm9ybWF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFICAgICAgICAgID0gMTgwOCwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgVXBzdHJlYW0gQm9uZGluZyBHcm91cCBzdGF0dXMgaW5mb3JtYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgPSAxODA5LCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGRhdGEgZm9yIGNvbmZpZ3VyZWQgUW9TIHNlcnZpY2UgZmxvd3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVTUE9OU0UgICAgICAgICAgICAgICAgPSAxODEwLCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBkYXRhIGZvciBjb25maWd1cmVkIFFvUyBzZXJ2aWNlIGZsb3dzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVFVRVNUICAgICAgICAgICAgID0gMTgxMSwgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBzZXJ2aWNlIGZsb3cgc3RhdGlzdGljcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX1NUQVRJU1RJQ1NfUkVTUE9OU0UgICAgICAgICAgICA9IDE4MTIsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIHNlcnZpY2UgZmxvdyBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVRVUVTVCAgICAgICAgICAgID0gMTgxMywgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBkYXRhIGZvciBwYWNrZXQgY2xhc3NpZmljYXRpb24gcnVsZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgPSAxODE0LCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBkYXRhIGZvciBwYWNrZXQgY2xhc3NpZmljYXRpb24gcnVsZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9SRUdfUlNQX0VWRU5UX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDk2LCAgICAgLyoqPCBBdXRvbm9tb3VzIGV2ZW50IHRvIHJlcG9ydCBhIFJFRy1SU1AgYXNzb2NpYXRlZCB3aXRoIGEgQ05VICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfQ01DX1NZU1RFTV9FVkVOVF9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDA5NyAgICAgIC8qKjwgQXV0b25vbW91cyBldmVudCB0byByZXBvcnQgYSBDTUMgU3lzdGVtIG1lc3NhZ2UgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGU7CisKKy8qKiBDbG9jayBUcmFuc3BvcnQgS2V5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgQWxsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DTE9DS19UUkFOU1BPUlRfS0VZX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IEluaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfVE9EX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgVE9EIEVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9QUFNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCAxUFBTIEVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9BREpVU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBBZGp1c3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfUE9OX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgIC8qKjwgUE9OIFJhbmdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DTE9DS19UUkFOU1BPUlRfS0VZX0ZBS0VfTVBDUF9KVU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IEZha2UgTVBDUCBKdW1wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DTE9DS19UUkFOU1BPUlRfS0VZX0hBTEZfUEVSSU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAvKio8IEhhbGYgUGVyaW9kLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleTsKKworLyoqIFZhciBMZWFmIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgTUFDIEluaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgTUFDIEFkZCBHcm91cCBBZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX0RFTF9HUk9VUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IE1BQyBEZWwgR3JvdXAgQWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBNQUMgU2VsZiBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IFBIWSBBZG1pbiBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IFJlcG9ydCBSZXNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9JTl9TRVJWSUNFX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgLyoqPCBSZXBvcnQgSW4gU2VydmljZSBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUE9SVF9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAvKio8IFBvcnQgQWRtaW4gQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgLyoqPCBNQVUgUmVzZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgIC8qKjwgTUFVIEFkbWluIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX1JFTkVHT1RJQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgIC8qKjwgQXV0byBSZW5lZ290aWF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fQURNSU5fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiAgICAgICAgLyoqPCBBdXRvIEFkbWluIENvbnRyb2wuICovCit9IGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb247CisKKy8qKiBDVEMgRW5hYmxlZCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VOQUJMRURfU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VOQUJMRURfU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgLyoqPCBFbmFibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGU7CisKKy8qKiBDVEMgQWN0aXZhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0FDVElWQVRJT05fREVBQ1RJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBEZWFjdGl2YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQUNUSVZBVElPTl9BQ1RJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAvKio8IEFjdGl2YXRlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb247CisKKy8qKiBDVEMgTGVhZiBNYW5hZ2VtZW50IE9iamVjdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3QKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IENhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9OX0lGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBQT04gSS9GLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1NTM1VSAgICAvKio8IE9OVS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0OworCisvKiogQ1RDIE9OVSBBbGFybSBJRCAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0VRVUlQTUVOVF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgT05VIEVxdWlwbWVudCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT1dFUl9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IE9OVSBQb3dlciBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX01JU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IE9OVSBCYXR0ZXJ5IE1pc3NpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBPTlUgQmF0dGVyeSBGYWlsdXJlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfVk9MVF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgIC8qKjwgT05VIEJhdHRlcnkgVm9sdCBMb3cgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUEhZU0lDQUxfSU5TVFJVQ1RJT05fQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgLyoqPCBPbnUgUGh5c2ljYWwgSW5zdHJ1Y3Rpb24gQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfU0VMRl9URVNUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgLyoqPCBPbnUgU2VsZiBUZXN0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9ISUdIX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgLyoqPCBPbnUgVGVtcCBIaWdoIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgIC8qKjwgT251IFRlbXAgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0lBRF9DT05ORUNUSU9OX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgIC8qKjwgT251IElhZCBDb25uZWN0aW9uIEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9OX0lGX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgLyoqPCBPbnUgUG9uIElmIFN3aXRjaCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TTEVFUF9TVEFUVVNfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAvKio8IE9udSBTbGVlcCBTdGF0dXMgVXBkYXRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU3LCAgICAgIC8qKjwgUG9uIElmIFJ4IFBvd2VyIEhpZ2ggQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTgsICAgICAgLyoqPCBQb24gSWYgUnggUG93ZXIgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0hJR0hfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU5LCAgICAgIC8qKjwgUG9uIElmIFR4IFBvd2VyIEhpZ2ggQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjAsICAgICAgLyoqPCBQb24gSWYgVHggUG93ZXIgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYxLCAgICAgIC8qKjwgUG9uIElmIFR4IEJpYXMgSGlnaCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MiwgICAgICAvKio8IFBvbiBJZiBUeCBCaWFzIExvdyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MywgICAgICAvKio8IFBvbiBJZiBWY2MgSGlnaCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NCwgICAgICAvKio8IFBvbiBJZiBWY2MgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfSElHSF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY1LCAgICAgIC8qKjwgUG9uIElmIFRlbXAgSGlnaCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NiwgICAgICAvKio8IFBvbiBJZiBUZW1wIExvdyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NywgICAgICAvKio8IFBvbiBJZiBSeCBQb3dlciBIaWdoIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjgsICAgICAgLyoqPCBQb24gSWYgUnggUG93ZXIgTG93IFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjksICAgICAgLyoqPCBQb24gSWYgVHggUG93ZXIgSGlnaCBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcwLCAgICAgIC8qKjwgUG9uIElmIFR4IFBvd2VyIExvdyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcxLCAgICAgIC8qKjwgUG9uIElmIFR4IEJpYXMgSGlnaCBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcyLCAgICAgIC8qKjwgUG9uIElmIFR4IEJpYXMgTG93IFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0hJR0hfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzMsICAgICAgLyoqPCBQb24gSWYgVmNjIEhpZ2ggV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3NCwgICAgICAvKio8IFBvbiBJZiBWY2MgTG93IFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzUsICAgICAgLyoqPCBQb24gSWYgVGVtcCBIaWdoIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzYsICAgICAgLyoqPCBQb24gSWYgVGVtcCBMb3cgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNICAgICAgICAgICAgICAgICAgICA9IDI3NywgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIERyb3AgRXZlbnRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgID0gMjc4LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIERyb3AgRXZlbnRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgID0gMjc5LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICA9IDI4MCwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgID0gMjgxLCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICA9IDI4MiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgID0gMjgzLCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gT3ZlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgID0gMjg0LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICA9IDI4NSwgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIEZyYWdtZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICA9IDI4NiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBGcmFnbWVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgPSAyODcsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBKYWJiZXJzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgID0gMjg4LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIEphYmJlcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgPSAyODksICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBEaXNjYXJkcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MCwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBEaXNjYXJkcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MSwgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIEVycm9ycyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBFcnJvcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFUk5UU19XQVJOSU5HICAgICAgICAgICAgICAgICA9IDI5MywgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIERyb3AgRXZlcm50cyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgID0gMjk0LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIERyb3AgRXZlbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgPSAyOTUsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgPSAyOTYsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgID0gMjk3LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORyAgICAgICAgICAgICAgID0gMjk4LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICA9IDI5OSwgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgID0gMzAwLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgID0gMzAxLCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRnJhZ21lbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgPSAzMDIsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gRnJhZ21lbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgPSAzMDMsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBKYWJiZXJzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgPSAzMDQsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gSmFiYmVycyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRElTQ0FSRFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgID0gMzA1LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRGlzY2FyZHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICA9IDMwNiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBEaXNjYXJkcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgID0gMzA3LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRXJyb3JzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMDgsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gRXJyb3MgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMywgICAgICAvKio8IENhcmQgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX1NFTEZfVEVTVF9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTQsICAgICAgLyoqPCBDYXJkIFNlbGYgVGVzdCBGYWlsdXJlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQVVUT19ORUdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzY5LCAgICAgIC8qKjwgRXRoIFBvcnQgQXV0byBOZWcgRmFpbHVyZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MCwgICAgICAvKio8IEV0aCBQb3J0IExvcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MSwgICAgICAvKio8IEV0aCBQb3J0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NzIsICAgICAgLyoqPCBFdGggUG9ydCBMb29wYmFjayAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0NPTkdFU1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MywgICAgICAvKio8IEV0aCBQb3J0IENvbmdlc3Rpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgPSA3NzQsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gRHJvcCBFdmVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgPSA3NzUsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIERyb3AgRXZlbnRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgID0gNzc2LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIENSQyBFcnJvciBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgICAgPSA3NzcsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIENSQyBFcnJvciBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgPSA3NzgsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgICA9IDc3OSwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgICA9IDc4MCwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgICAgPSA3ODEsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICA9IDc4MiwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBGcmFnbWVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODMsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIEZyYWdtZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4NCwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBKYWJiZXJzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg1LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBKYWJiZXJzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg2LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIERpc2NhcmRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg3LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBEaXNjYXJkcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4OCwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBFcnJvcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODksICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIEVycm9ycyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDc5MCwgICAgICAvKio8IFBvcnQgU3RhdHVzIENoYW5nZSBUaW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICA9IDc5MSwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBEcm9wIEV2ZW50cyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgID0gNzkyLCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBEcm9wIEV2ZW50cyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORyAgICAgICAgICAgICAgID0gNzkzLCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIENSQyBFcnJvciBGcmFtZXMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgICA9IDc5NCwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORyAgICAgICAgICAgICAgID0gNzk1LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgICA9IDc5NiwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgID0gNzk3LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORyAgICAgICAgICAgICAgICAgID0gNzk4LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICA9IDc5OSwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBGcmFnbWVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMCwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRnJhZ21lbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDEsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gSmFiYmVycyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgID0gODAyLCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBKYWJiZXJzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgPSA4MDMsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gRGlzY2FyZHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwNCwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRGlzY2FyZHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwNSwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBFcnJvcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwNiwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRXJyb3JzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgPSA4MDcsICAgICAgLyoqPCBQb3J0IFN0YXR1cyBDaGFuZ2UgVGltZXMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPVFNfUE9SVF9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMjUsICAgICAvKio8IFAgTyBUIFMgUG9ydCBGYWlsdXJlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFQT1JUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MSwgICAgIC8qKjwgRTEgUG9ydCBGYWlsdXJlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFUSU1JTkdfVU5MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MiwgICAgIC8qKjwgRTEgVGltaW5nIFVubG9jayAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODMgICAgICAvKio8IEUxIExvcyAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZDsKKworLyoqIENUQyBPTlUgUG93ZXIgQWxhcm0gQ29kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9XRVJfQUxBUk1fQ09ERV9ORVZFUl9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IE5ldmVyIG1hdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1dFUl9BTEFSTV9DT0RFX1BPV0VSX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUG93ZXIgZG93biAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9XRVJfQUxBUk1fQ09ERV9QT1dFUl9WT0xUX09WRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFBvd2VyIFZvbHRhZ2UgT3ZlciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9XRVJfQUxBUk1fQ09ERV9QT1dFUl9WT0xUX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IFBvd2VyIFZvbHRhZ2UgTGVzcyAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGU7CisKKy8qKiBDVEMgUE9OIElGIFN3aXRjaCBDb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPTl9JRl9TV0lUQ0hfQ09ERV9ORVZFUl9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBOZXZlciBtYXRjaCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9OX0lGX1NXSVRDSF9DT0RFX1NJR05BTF9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFNpZ25hbCBMb3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPTl9JRl9TV0lUQ0hfQ09ERV9TSUdOQUxfREVHUkFERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBTaWduYWwgRGVncmFkZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9OX0lGX1NXSVRDSF9DT0RFX0hBUkRXQVJFX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IEhhcmR3YXJlIEZhdWx0ICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlOworCisvKiogVmFyIExlYWYgQXR0cmlidXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBNQUMgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgTUFDIEZyYW1lcyBUeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBNQUMgU2luZ2xlIENvbGwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IE1BQyBNdWx0aXBsZSBDb2xsIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBNQUMgRnJhbWVzIFJ4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IE1BQyBGQ1MgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FMSUdOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAvKio8IE1BQyBBbGlnbiBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgIC8qKjwgTUFDIE9jdGV0cyBUeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfREVGRVJSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgLyoqPCBNQUMgRnJhbWVzIERlZmVycmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0xBVEVfQ09MTElTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAvKio8IE1BQyBMYXRlIENvbGxpc2lvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgIC8qKjwgTUFDIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAvKio8IE1BQyBGcmFtZXMgTG9zdCBNQUMgVHggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUlJJRVJfU0VOU0VfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAvKio8IE1BQyBDYXJyaWVyIFNlbnNlIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgLyoqPCBNQUMgT2N0ZXRzIFJ4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAvKio8IE1BQyBGcmFtZXMgTG9zdCBNQUMgUnggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAvKio8IE1BQyBQcm9taXNjdW91cyBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgIC8qKjwgTUFDIE1jYXN0IEFkZHIgTGlzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgLyoqPCBNQUMgTWNhc3QgRnJhbWVzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAvKio8IE1BQyBCY2FzdCBGcmFtZXMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgIC8qKjwgTUFDIEZyIEV4Y2Vzc2l2ZSBEZWZlcnJhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgLyoqPCBNQUMgTWNhc3QgRnJhbWVzIFJ4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAvKio8IE1BQyBCY2FzdCBGcmFtZXMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgIC8qKjwgTUFDIEluIFJhbmdlIExlbiBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgIC8qKjwgTUFDIE91dCBPZiBSYW5nZSBMZW4gRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAvKio8IE1BQyBGcmFtZSBUb28gTG9uZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgLyoqPCBNQUMgRW5hYmxlIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgLyoqPCBNQUMgVHggRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAvKio8IE1BQyBNY2FzdCBSeCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgICAgIC8qKjwgTUFDIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgIC8qKjwgTUFDIENvbGxpc2lvbiBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgICAgIC8qKjwgUEhZIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAvKio8IFBIWSBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEVfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAvKio8IFBIWSBUeXBlIExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgIC8qKjwgUEhZIFNRRSBUZXN0IEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAgICAgLyoqPCBQSFkgU3ltYm9sIEVyciBEdXJpbmcgQ2Fycmllci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9NSUlfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgLyoqPCBQSFkgTUlJIERldGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgLyoqPCBQSFkgQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzgsICAgICAgIC8qKjwgUmVwb3J0IElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5LCAgICAgICAvKio8IFJlcG9ydCBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwLCAgICAgICAvKio8IFJlcG9ydCBHcm91cCBDYXBhY2l0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAgICAgLyoqPCBSZXBvcnQgR3JvdXAgTWFwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyLCAgICAgICAvKio8IFJlcG9ydCBIZWFsdGggU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDMsICAgICAgIC8qKjwgUmVwb3J0IEhlYWx0aCBUZXh0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0LCAgICAgICAvKio8IFJlcG9ydCBIZWFsdGggRGF0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAgICAgLyoqPCBSZXBvcnQgVHggQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NiwgICAgICAgLyoqPCBHcm91cCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAgICAgLyoqPCBHcm91cCBQb3J0IENhcGFjaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4LCAgICAgICAvKio8IEdyb3VwIFBvcnQgTWFwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgICAgICAvKio8IFBvcnQgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAsICAgICAgIC8qKjwgUG9ydCBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MSwgICAgICAgLyoqPCBQb3J0IEF1dG8gUGFydCBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MiwgICAgICAgLyoqPCBQb3J0IFJlYWRhYmxlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MywgICAgICAgLyoqPCBQb3J0IFJlYWRhYmxlIE9jdGV0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NCwgICAgICAgLyoqPCBQb3J0IEZDUyBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUsICAgICAgIC8qKjwgUG9ydCBBbGlnbiBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZSQU1FU19UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYsICAgICAgIC8qKjwgUG9ydCBGcmFtZXMgVG9vIExvbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTcsICAgICAgIC8qKjwgUG9ydCBTaG9ydCBFdmVudHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgICAgIC8qKjwgUG9ydCBSdW50cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQ09MTElTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OSwgICAgICAgLyoqPCBQb3J0IENvbGxpc2lvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjAsICAgICAgIC8qKjwgUG9ydCBMYXRlIEV2ZW50cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAgICAgLyoqPCBQb3J0IFZlcnkgTG9uZyBFdmVudHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0RBVEFfUkFURV9NSVNNQVRDSEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjIsICAgICAgIC8qKjwgUG9ydCBEYXRhIFJhdGUgTWlzbWF0Y2hlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MywgICAgICAgLyoqPCBQb3J0IEF1dG8gUGFydGl0aW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAgICAgLyoqPCBQb3J0IElzb2xhdGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TWU1fRVJSX0RVUklOR19QS1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1LCAgICAgICAvKio8IFBvcnQgU3ltIEVyciBEdXJpbmcgUGt0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVNUX1NPVVJDRV9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgICAgICAvKio8IFBvcnQgTGFzdCBTb3VyY2UgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAgICAgLyoqPCBQb3J0IFNvdXJjZSBBZGRyIENoYW5nZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwLCAgICAgIC8qKjwgUG9ydCBCdXJzdHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgsICAgICAgIC8qKjwgTUFVIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAvKio8IE1BVSBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcwLCAgICAgICAvKio8IE1BVSBUeXBlIExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEsICAgICAgIC8qKjwgTUFVIE1lZGlhIEF2YWlsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0xPU0VfTUVESUFfQ1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyLCAgICAgICAvKio8IE1BVSBMb3NlIE1lZGlhIEN0ci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9KQUJCRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MywgICAgICAgLyoqPCBNQVUgSmFiYmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0LCAgICAgICAvKio8IE1BVSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NSwgICAgICAgLyoqPCBNQVUgQmFuZCBTcGxpdCBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2LCAgICAgICAvKio8IE1BVSBCYW5kIFNwbGl0IEZyZXEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfRkFMU0VfQ0FSUklFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcsICAgICAgIC8qKjwgTUFVIEZhbHNlIENhcnJpZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4LCAgICAgICAvKio8IEF1dG8gTmVnIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc5LCAgICAgICAvKio8IEF1dG8gTmVnIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwLCAgICAgICAvKio8IEF1dG8gTmVnIFJlbW90ZSBTaWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODEsICAgICAgIC8qKjwgQXV0byBOZWcgQXV0byBDZmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgID0gODIsICAgICAgIC8qKjwgQXV0byBOZWcgTG9jYWwgVGVjaCBBYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFkgICAgICAgICAgICAgICAgICAgICA9IDgzLCAgICAgICAvKio8IEF1dG8gTmVnIEFkdmVydGlzZWQgVGVjaCBBYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg0LCAgICAgICAvKio8IEF1dG8gTmVnIFJ4IFRlY2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODUsICAgICAgIC8qKjwgQXV0byBOZWcgTG9jYWwgU2VsZWN0IEFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODYsICAgICAgIC8qKjwgQXV0byBOZWcgQWQgU2VsZWN0IEFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODcsICAgICAgIC8qKjwgQXV0byBOZWcgUnggU2VsZWN0IEFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODksICAgICAgIC8qKjwgTUFDIENhcGFiaWxpdGllcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19EVVBMRVhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MCwgICAgICAgLyoqPCBNQUMgRHVwbGV4IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MSwgICAgICAgLyoqPCBNQVUgSWRsZSBFcnJvciBDb3VudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MiwgICAgICAgLyoqPCBNQUMgQ3RybCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MywgICAgICAgLyoqPCBNQUMgQ3RybCBGdW5jcyBTdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTQsICAgICAgIC8qKjwgTUFDIEN0cmwgRnJhbWVzIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk1LCAgICAgICAvKio8IE1BQyBDdHJsIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwgICAgICAgLyoqPCBNQUMgQ3RybCBVbnN1cHBvcnRlZCBPcCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX0RFTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NywgICAgICAgLyoqPCBNQUMgQ3RybCBQYXVzZSBEZWxheS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OCwgICAgICAgLyoqPCBNQUMgQ3RybCBQYXVzZSBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAgICAgLyoqPCBNQUMgQ3RybCBQYXVzZSBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDEsICAgICAgLyoqPCBBZ2cgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAyLCAgICAgIC8qKjwgQWdnIERlc2MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAzLCAgICAgIC8qKjwgQWdnIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA0LCAgICAgIC8qKjwgQWdnIEFjdG9yIFN5cyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsICAgICAgLyoqPCBBZ2cgQWN0b3IgU3lzIFByaS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BR0dfT1JfSU5ESVZJRFVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDYsICAgICAgLyoqPCBBZ2cgQWdnIE9yIEluZGl2aWR1YWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA3LCAgICAgIC8qKjwgQWdnIEFjdG9yIEFkbWluIEtleS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDgsICAgICAgLyoqPCBBZ2cgQWN0b3IgT3BlciBLZXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA5LCAgICAgIC8qKjwgQWdnIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMCwgICAgICAvKio8IEFnZyBQYXJ0bmVyIFN5cyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTEsICAgICAgLyoqPCBBZ2cgUGFydG5lciBTeXMgUHJpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMiwgICAgICAvKio8IEFnZyBQYXJ0bmVyIE9wZXIgS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMywgICAgICAvKio8IEFnZyBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTQsICAgICAgLyoqPCBBZ2cgT3BlciBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTUsICAgICAgLyoqPCBBZ2cgVGltZSBPZiBMYXN0IE9wZXIgQ2hhbmdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNiwgICAgICAvKio8IEFnZyBEYXRhIFJhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfT0NURVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE3LCAgICAgIC8qKjwgQWdnIFR4IE9jdGV0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9PQ1RFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTgsICAgICAgLyoqPCBBZ2cgUnggT2N0ZXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExOSwgICAgICAvKio8IEFnZyBGcmFtZXMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIwLCAgICAgIC8qKjwgQWdnIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjEsICAgICAgLyoqPCBBZ2cgTWNhc3QgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIyLCAgICAgIC8qKjwgQWdnIE1jYXN0IFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyMywgICAgICAvKio8IEFnZyBCY2FzdCBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjQsICAgICAgLyoqPCBBZ2cgQmNhc3QgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI1LCAgICAgIC8qKjwgQWdnIFR4IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI2LCAgICAgIC8qKjwgQWdnIFJ4IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRVJSX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI3LCAgICAgIC8qKjwgQWdnIFR4IEVyciBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4LCAgICAgIC8qKjwgQWdnIFJ4IEVyciBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgIC8qKjwgQWdnIFVuayBQcm90b2NvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgLyoqPCBBZ2cgTGluayBVcCBEb3duIE5vdGlmeSBFbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzEsICAgICAgLyoqPCBBZ2cgUG9ydCBMaXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMiwgICAgICAvKio8IEFnZyBDb2xsZWN0b3IgTWF4IERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwMCwgICAgICAvKio8IE9BTSBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDEsICAgICAgLyoqPCBPQU0gQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAyLCAgICAgIC8qKjwgT0FNIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAzLCAgICAgIC8qKjwgT0FNIFJlbW90ZSBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDQsICAgICAgLyoqPCBPQU0gUmVtb3RlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfUERVX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDUsICAgICAgLyoqPCBPQU0gUmVtb3RlIFBEVSBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA2LCAgICAgIC8qKjwgT0FNIExvY2FsIEZsYWdzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNywgICAgICAvKio8IE9BTSBSZW1vdGUgRmxhZ3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4LCAgICAgIC8qKjwgT0FNIFJlbW90ZSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDksICAgICAgLyoqPCBPQU0gUmVtb3RlIFZlbmRvciBPVUkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEwLCAgICAgIC8qKjwgT0FNIFJlbW90ZSBWZW5kb3IgRGV2aWNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMSwgICAgICAvKio8IE9BTSBSZW1vdGUgVmVuZG9yIFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEyLCAgICAgIC8qKjwgT0FNIFBEVSBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTMsICAgICAgLyoqPCBPQU0gUERVIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNCwgICAgICAvKio8IE9BTSBVbnN1cHBvcnRlZCBPcGNvZGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNSwgICAgICAvKio8IE9BTSBJbmZvIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNiwgICAgICAvKio8IE9BTSBJbmZvIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VWRU5UX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNywgICAgICAvKio8IE9BTSBFdmVudCBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTgsICAgICAgLyoqPCBPQU0gVW5pcXVlIEV2ZW50IFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0RVUF9FVkVOVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOSwgICAgICAvKio8IE9BTSBEdXAgRXZlbnQgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIwLCAgICAgIC8qKjwgT0FNIExvb3AgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIxLCAgICAgIC8qKjwgT0FNIExvb3AgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIyLCAgICAgIC8qKjwgT0FNIFZhciBSZXEgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIzLCAgICAgIC8qKjwgT0FNIFZhciBSZXEgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI0LCAgICAgIC8qKjwgT0FNIFZhciBSZXNwIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNSwgICAgICAvKio8IE9BTSBWYXIgUmVzcCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjYsICAgICAgLyoqPCBPQU0gT3JnIFNwZWNpZmljIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNywgICAgICAvKio8IE9BTSBPcmcgU3BlY2lmaWMgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI4LCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBTeW0gUGVyaW9kIFdpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9USFJFU0ggICAgICAgICAgICAgICAgICAgICAgPSAyMjksICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIFN5bSBQZXJpb2QgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICA9IDIzMCwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgU3ltIFBlcmlvZCBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19XSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzEsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyYW1lIFNlY3MgV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgICA9IDIzMiwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnJhbWUgU2VjcyBUaHJlc2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgID0gMjMzLCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGcmFtZSBTZWNzIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfV0lOICAgICAgICAgICAgICAgICAgICAgICA9IDIzNCwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnJhbWUgUGVyaW9kIFdpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgPSAyMzUsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyYW1lIFBlcmlvZCBUaHJlc2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVCAgICAgICAgICAgICAgICAgICAgID0gMjM2LCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGcmFtZSBQZXJpb2QgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM3LCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGciBTZWMgU3VtIFdpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9USFJFU0ggICAgICAgICAgICAgICAgICAgICAgPSAyMzgsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyIFNlYyBTdW0gVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICA9IDIzOSwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnIgU2VjIFN1bSBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDAsICAgICAgLyoqPCBPQU0gUmVtb3RlIEVyciBGcmFtZSBTZWNzIFdpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgPSAyNDEsICAgICAgLyoqPCBPQU0gUmVtb3RlIEVyciBGcmFtZSBTZWNzIFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgPSAyNDIsICAgICAgLyoqPCBPQU0gUmVtb3RlIEVyciBGcmFtZSBTZWNzIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTiAgICAgICAgICAgICAgICAgICAgICA9IDI0MywgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFBlcmlvZCBXaW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIICAgICAgICAgICAgICAgICAgID0gMjQ0LCAgICAgIC8qKjwgT0FNIFJlbW90ZSBFcnIgRnJhbWUgUGVyaW9kIFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVCAgICAgICAgICAgICAgICAgICAgPSAyNDUsICAgICAgLyoqPCBPQU0gUmVtb3RlIEVyciBGcmFtZSBQZXJpb2QgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ2LCAgICAgIC8qKjwgT0FNIEZyYW1lcyBMb3N0IE9BTSBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ3LCAgICAgIC8qKjwgT0FNIEVtdWwgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ4LCAgICAgIC8qKjwgT0FNIEVtdWwgU3BkIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDksICAgICAgLyoqPCBPQU0gRW11bCBDUkM4IEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTAsICAgICAgLyoqPCBPQU0gRW11bCBCYWQgTExJRCBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgwLCAgICAgIC8qKjwgTVBDUCBNQUMgQ3RybCBGcmFtZXMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgxLCAgICAgIC8qKjwgTVBDUCBNQUMgQ3RybCBGcmFtZXMgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjg4LCAgICAgIC8qKjwgTVBDUCBEaXNjb3ZlcnkgV2luZG93IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MCwgICAgICAvKio8IE1QQ1AgRGlzY292ZXJ5IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkyLCAgICAgIC8qKjwgRkVDIENvcnJlY3RlZCBCbG9ja3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkzLCAgICAgIC8qKjwgRkVDIFVuY29ycmVjdGFibGUgQmxvY2tzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxMywgICAgICAvKio8IEZFQyBBYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNCwgICAgICAvKio8IEZFQyBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNSwgICAgICAvKio8IE1QQ1AgVHggR2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTYsICAgICAgLyoqPCBNUENQIFR4IFJlZyBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE3LCAgICAgIC8qKjwgTVBDUCBUeCBSZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTgsICAgICAgLyoqPCBNUENQIFR4IFJlZyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOSwgICAgICAvKio8IE1QQ1AgVHggUmVwb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMCwgICAgICAvKio8IE1QQ1AgUnggR2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjEsICAgICAgLyoqPCBNUENQIFJ4IFJlZyBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIyLCAgICAgIC8qKjwgTVBDUCBSeCBSZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjMsICAgICAgLyoqPCBNUENQIFJ4IFJlZyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNCAgICAgICAvKio8IE1QQ1AgUnggUmVwb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlOworCisvKiogQ1RDIEZFQyBTdXBwb3J0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZFQ19TVVBQT1JUX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NVUFBPUlRfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZFQ19TVVBQT1JUX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0OworCisvKiogQ1RDIEZFQyBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NUQVRFX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19GRUNfU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZFQ19TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGU7CisKKy8qKiBDVEMgQ2h1cm5pbmcgT3AgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0tFWV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBOZXcgS2V5IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19DSFVSTklOR19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgIC8qKjwgTmV3IENodXJuaW5nIEtleS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlOworCisvKiogQ1RDIENsYXNzaWZpY2F0aW9uIE9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ0xBU1NJRklDQVRJT05fT1BFUkFUSU9OX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IERlbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NMQVNTSUZJQ0FUSU9OX09QRVJBVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBBZGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DTEFTU0lGSUNBVElPTl9PUEVSQVRJT05fQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DTEFTU0lGSUNBVElPTl9PUEVSQVRJT05fTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgTGlzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb247CisKKy8qKiBDVEMgQ29tbWl0IEltYWdlIEFjay4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2sKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9BQ0tfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX0FDS19QQVJBTUVURVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFBhcmFtZXRlciBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9BQ0tfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX0FDS19MT0FESU5HX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IExvYWRpbmcgRmFpbHVyZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrOworCisvKiogQ1RDIENvbW1pdCBJbWFnZSBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgIC8qKjwgQ29tbWl0IEltYWdlIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgICAgIC8qKjwgQ29tbWl0IEltYWdlIFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGU7CisKKy8qKiBDVEMgQ29tbWl0IEltYWdlIEZsYWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX0ZMQUdfU1dBUF9BQ1RJVkVfQkFDS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAvKio8IFN3YXAgQWN0aXZlL0JhY2t1cC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZzsKKworLyoqIENUQyBEQkEgT3AgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgR2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgR2V0IFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfU0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFNldCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfU0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IFNldCBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZTsKKworLyoqIENUQyBFYXJseSBXYWtlIFVwIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VBUkxZX1dBS0VfVVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FQVJMWV9XQUtFX1VQX01PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VBUkxZX1dBS0VfVVBfTU9ERV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZTsKKworLyoqIENUQyBCcmFuY2guIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2gKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NCwgICAgICAgLyoqPCBPbGQgTWFuYWdlbWVudCBPYmplY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUsICAgICAgIC8qKjwgTWFuYWdlbWVudCBPYmplY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk5LCAgICAgIC8qKjwgRXh0IEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDEsICAgICAgLyoqPCBFeHQgQWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NywgICAgICAvKio8IEtUIEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjkgICAgICAgLyoqPCBLVCBBY3Rpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoOworCisvKiogT0FNIEVycm9yIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4LCAgICAgIC8qKjwgTm8gRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1VOREVURVJNSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgIC8qKjwgVW5kZXRlcm1pbmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAvKio8IFVuc3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAvKio8IE92ZXJmbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMiwgICAgICAvKio8IFRvbyBMb25nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9UT19CRV9DT05USU5VRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMywgICAgICAvKio8IFRvIEJlIENvbnRpbnVlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfQkFEX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzQsICAgICAgLyoqPCBCYWQgUGFyYW1ldGVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfTk9fUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzUsICAgICAgLyoqPCBObyBSZXNvdXJjZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NZU1RFTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgICAgIC8qKjwgU3lzdGVtIEJ1c3kuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fQVRUUl9VTkRFVEVSTUlORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgIC8qKjwgU1REIE9hbSBBdHRyIFVuZGV0ZXJtaW5lZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX01BWV9CRV9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgTWF5IEJlIENvcnJ1cHRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjIsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgVW5zdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fQVRUUl9IV19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYzLCAgICAgIC8qKjwgU1REIE9hbSBBdHRyIEh3IEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fQVRUUl9PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY0LCAgICAgIC8qKjwgU1REIE9hbSBBdHRyIE92ZXJmbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX09CSl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MiwgICAgICAvKio8IFNURCBPYW0gT2JqZWN0IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9PQkpfVU5ERVJURVJNSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTMsICAgICAgLyoqPCBTVEQgT2FtIE9iamVjdCBVbmRlcnRlcm1pbmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX09CSl9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NCwgICAgICAvKio8IFNURCBPYW0gT2JqZWN0IFVuc3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX09CSl9NQVlfQkVfQ09SUlVQVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NSwgICAgICAvKio8IFNURCBPYW0gT2JqZWN0IE1heSBCZSBDb3JydXB0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fT0JKX0hXX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk2ICAgICAgIC8qKjwgU1REIE9hbSBPYmplY3QgSHcgRmFpbHVyZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlOworCisvKiogQ1RDIExlYWYgT2xkIE1hbmFnZW1lbnQgT2JqZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3QKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfT0xEX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgLyoqPCBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0OworCisvKiogQ1RDIFBvcnQgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9UWVBFX0VUSEVSTkVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IEV0aGVybmV0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9UWVBFX1ZPSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFZvSVAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfQURTTDJQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgQURTTDIrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9UWVBFX1ZEU0wyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IFZEU0wyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9UWVBFX0UxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUgICAgICAgICAvKio8IEUxLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZTsKKworLyoqIENUQyBMZWFmIEV4dCBBdHRyaWJ1dGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgT05VIFNlcmlhbCBOdW1iZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRklSTVdBUkVfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgRmlybXdhcmUgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DSElQU0VUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBDaGlwc2V0IElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IE9OVSBDYXBhYmlsaXRpZXMtMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PUFRJQ0FMX1RSQU5TQ0VJVkVSX0RJQUdOT1NJUyAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBPcHRpY2FsIFRyYW5zY2VpdmVyIERpYWdub3Npcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TRVJWSUNFX1NMQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgLyoqPCBTZXJ2aWNlIFNMQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgLyoqPCBPTlUgQ2FwYWJpbGl0aWVzLTIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSE9MRE9WRVJfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgIC8qKjwgSG9sZG92ZXIgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfR0xPQkFMX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IE14VSBNYW5hZ2UgR2xvYmFsIFBhcmFtZXRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX1NOTVBfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBNeFUgTWFuYWdlIFNOTVAgUGFyYW1ldGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FDVElWRV9QT05fSUZBRE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAvKio8IEFjdGl2ZSBQT04gSS9GIEFkbWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAvKio8IE9OVSBDYXBhYmlsaXRpZXMtMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgLyoqPCBPTlUgUG93ZXIgU2F2aW5nIENhcGFiaWxpdGllcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgLyoqPCBPTlUgUG93ZXIgU2F2aW5nIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUFJPVEVDVElPTl9QQVJBTUVURVJTICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgLyoqPCBPTlUgUHJvdGVjdGlvbiBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9MSU5LX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAvKio8IEV0aCBMaW5rIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAvKio8IEV0aCBQb3J0IFBhdXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BPTElDSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAvKio8IEV0aCBQb3J0IFBvbGljaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAvKio8IFZvSVAgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FMVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgLyoqPCBFMSBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX0RPV05fUkFURV9MSU1JVElORyAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAvKio8IEV0aCBQb3J0IERvd24gUmF0ZSBMaW1pdGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QT1JUX0xPT1BfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCBQb3J0IExvb3AgRGV0ZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfRElTQUJMRV9PTl9MT09QX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAvKio8IFBvcnQgRGlzYWJsZSBPbiBMb29wIERldGVjdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAvKio8IFZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQ0xBU1NJRklDQVRJT05fQU5EX01BUktJTkcgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgIC8qKjwgQ2xhc3NpZmljYXRpb24gQW5kIE1hcmtpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgIC8qKjwgTXVsdGljYXN0IFZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1RBR19PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgIC8qKjwgTXVsdGljYXN0IFRhZyBPcGVyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcsICAgICAgIC8qKjwgTXVsdGljYXN0IFN3aXRjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAgICAgLyoqPCBNdWx0aWNhc3QgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9HUk9VUF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OSwgICAgICAgLyoqPCBHcm91cCBNYXguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgICAgIC8qKjwgRmFzdCBMZWF2ZSBBYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBU1RfTEVBVkVfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxLCAgICAgICAvKio8IEZhc3QgTGVhdmUgQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTExJRF9RVUVVRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODEsICAgICAgIC8qKjwgTExJRC9RdWV1ZSBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX0lORk9STUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTcsICAgICAgIC8qKjwgSUFEIEluZm9ybWF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfR0xPQkFMX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk4LCAgICAgICAvKio8IFZvSVAgR2xvYmFsIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFBBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTksICAgICAgIC8qKjwgSC4yNDggUGFyYW1ldGVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4VVNFUl9USURfSU5GT1JNQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAsICAgICAgLyoqPCBILjI0OCBVc2VyIFRJRCBJbmZvcm1hdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDEsICAgICAgLyoqPCBILjI0OCBSVFAgVElEIENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfSU5GT1JNQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAyLCAgICAgIC8qKjwgSC4yNDggUlRQIFRJRCBJbmZvcm1hdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDMsICAgICAgLyoqPCBTSVAgUGFyYW1ldGVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDQsICAgICAgLyoqPCBTSVAgVXNlciBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBWF9NT0RFTV9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgICAgICAvKio8IEZheC9Nb2RlbSBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNiwgICAgICAvKio8IEguMjQ4IElBRCBPcGVyYXRpb24gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPVFNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNywgICAgICAvKio8IFBPVFMgU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwOCwgICAgICAvKio8IElBRCBPcGVyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX0RJR0lUX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA5LCAgICAgIC8qKjwgU0lQIERpZ2l0IE1hcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgLyoqPCBBbGFybSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgLyoqPCBBbGFybSBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1RYX1BPV0VSX1NVUFBMWV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgID0gMTYxLCAgICAgIC8qKjwgT251IFR4IFBvd2VyIFN1cHBseSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01BQ19BR0lOR19USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NCwgICAgICAvKio8IE1BQyBBZ2luZyBUaW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfU1RBVFVTICAgICAgICAgICAgICAgICAgICA9IDE3NywgICAgICAvKio8IFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfQ1VSUkVOVF9EQVRBICAgICAgICAgICAgICA9IDE3OCwgICAgICAvKio8IFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgQ3VycmVudCBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfSElTVE9SWV9EQVRBICAgICAgICAgICAgICA9IDE3OSwgICAgICAvKio8IFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgSGlzdG9yeSBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZFUlNJT05fU0VSVkVSX1BBUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzcwVSwgICAvKio8IFZlcnNpb24gU2VydmVyIFBhcmEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NzFVLCAgIC8qKjwgT05VIE1BQyBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FHSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc3MlUsICAgLyoqPCBPTlUgTUFDIEFnaW5nIFRpbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NzNVLCAgIC8qKjwgT05VIFBvcnQgTUFDIEZpbHRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc3NFUsICAgLyoqPCBPTlUgUG9ydCBNQUMgQmluZGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfU1RBVElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc3NVUsICAgLyoqPCBPTlUgUG9ydCBNQUMgU3RhdGljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QRVJGT1JNQU5DRV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzg0VSwgICAvKio8IE9OVSBQZXJmb3JtYW5jZSBTdGF0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0lTT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzc2VSwgICAvKio8IE9OVSBQb3J0IElzb2xhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19BRERSRVNTX1RBQkxFX1FVRVJZICAgICAgICAgICAgICAgICAgICAgID0gMzI3ODZVLCAgIC8qKjwgT05VIE1BQyBBZGRyZXNzIFRhYmxlIFF1ZXJ5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX0RPV05TVFJFQU1fU0hBUElORyAgICAgICAgICAgICAgICAgICA9IDMyNzg3VSwgICAvKio8IE9OVSBQT04gTUFDIERvd25zdHJlYW0gU2hhcGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc4OFUsICAgLyoqPCBPTlUgUE9OIE1BQyBVUy9EUyBCdWZmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfVVNEU0JVRkZFUl9DQVBBQklMSVRZX1FVRVJZICAgICAgICAgID0gMzI3ODlVLCAgIC8qKjwgT05VIFBPTiBNQUMgVVMvRFMgQnVmZmVyIENhcGFiaWxpdHkgUXVlcnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT0xMRUNUX0NPTlRST0wgICAgICAgICAgICAgID0gMzI3OTBVLCAgIC8qKjwgT05VIFBvcnQgU3RhdGlzdGljcyBDb2xsZWN0IENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT1VOVEVSX1JFU0VUICAgICAgICAgICAgICAgID0gMzI3OTFVLCAgIC8qKjwgT05VIFBvcnQgU3RhdGlzdGljcyBDb3VudGVyIFJlc2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSICAgICAgICAgICAgICAgICA9IDMyNzkyVSwgICAvKio8IE9OVSBQb3J0IEZsdXggU3RhdGlzdGljcyBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9MSUdIVF9FWENFUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzkzVSwgICAvKio8IE9OVSBMaWdodCBFeGNlcHRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3OTRVLCAgIC8qKjwgT05VIExpZ2h0IENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMSAgICAgICAgICAgICAgICAgICAgID0gMzI3OTVVLCAgIC8qKjwgT05VIFBPTiBQb3J0IFN0YXRpc3RpY3MgR2V0MS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQyICAgICAgICAgICAgICAgICAgICAgPSAzMjc5NlUsICAgLyoqPCBPTlUgUE9OIFBvcnQgU3RhdGlzdGljcyBHZXQyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzY5VSwgICAvKio8IEFsYXJtIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9ST1VHVUVfT05VX0VYQ0xfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc5N1UsICAgLyoqPCBSb3VndWVPbnVFeGNsQWJpbGl0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjkzMVUsICAgLyoqPCBQUFBvRVRlc3RDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyOTMyVSAgICAvKio8IFBQUG9FVGVzdFJlc3VsdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGU7CisKKy8qKiBDVEMgTGVhZiBFeHQgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUmVzZXQgT05VLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFNsZWVwIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fRkFTVF9MRUFWRV9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzIsICAgICAgIC8qKjwgRmFzdCBMZWF2ZSBBZG1pbiBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX01VTFRJX0xMSURfQURNSU5fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxNCwgICAgICAvKio8IE11bHRpLUxMSUQgQWRtaW4gQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9DQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDI1ICAgICAgLyoqPCBSZXNldCBDYXJkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbjsKKworLyoqIEtUIExlYWYgQXR0cmlidXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfUE9SVF9ET1dOU1RSRUFNX1JBVEVfU0hBUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIFJhdGUgU2hhcGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBPTlUgTUFDIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0JMT0NLX1VOQkxPQ0tfT05VX1RSQUZGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IEJsb2NrL1VuYmxvY2sgT05VIFRyYWZmaWMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX0RJQUdOT1NUSUNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgT05VIERpYWdub3N0aWNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9RVUVVRV9EUk9QX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IE9OVSBRdWV1ZSBEcm9wIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfRVRIRVJORVRfUE9SVF9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgIC8qKjwgRXRoZXJuZXQgUG9ydCBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAvKio8IEV0aGVybmV0IFBvcnQgUlNUUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9MT09QX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgLyoqPCBMb29wIERldGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTVBDUF9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgLyoqPCBPTlUgTVBDUCBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IFN0YXRpYyBNQUMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT1BUSUNBTF9QT1dFUl9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIgICAgICAgIC8qKjwgT3B0aWNhbCBQb3dlciBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlOworCisvKiogQ1RDIEV0aCBQb3J0IFBvbGljaW5nIEVuYWJsZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAvKio8IEVuYWJsZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlOworCisvKiogQ1RDIEV2ZW50IFN1YiBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBTdGF0dXMgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBTdGF0dXMgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IFN0YXR1cyBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBUaHJlc2hvbGQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBUaHJlc2hvbGQgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYgICAgICAgICAvKio8IFRocmVzaG9sZCBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZTsKKworLyoqIENUQyBFdmVudCBTdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NUQVRVU19ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBEaXNhYmxlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1RBVFVTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IEVuYWJsZWQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NUQVRVU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0Mjk0OTY3Mjk1VUwgIC8qKjwgTm90IEZvdW5kICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzOworCisvKiogQ1RDIE9OVSBTbGVlcCBGbGFnLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWcKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9TTEVFUF9GTEFHX0xFQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05VIGxlYXZlcyBmcm9tIHBvd2VyIHNhdmluZyBzdGF0ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1NMRUVQX0ZMQUdfRU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPTlUgZW50ZXJzIHBvd2VyIHNhdmluZyBzdGF0ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1NMRUVQX0ZMQUdfQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBDaGFuZ2UgT05VIHBvd2VyIHNhdmluZyBtb2RlLCBzbGVlcCB0aW1lIGFuZCB3YWtlIHRpbWUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZzsKKworLyoqIEN0YyBPbnUgU2xlZXAgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfTU9ERV9OT1RfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERvbid0IHN1cHBvcnQgc2xlZXAgbW9kZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1NMRUVQX01PREVfVFhfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG9ubHkgc3VwcG9ydCBUeCBzbGVlcCBtb2RlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfTU9ERV9UUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgVHggYW5kIFJ4IGNhbiBvbmx5IHNsZWVwIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9TTEVFUF9NT0RFX1RYX0FORF9UUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCBib3RoIHN1cHBvcnQgVHggc2xlZXAgYW5kIFR4IFJ4IGJvdGggc2xlZXAgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZTsKKworLyoqIFBQIFBvIEUgVGVzdCBTdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfU1RBVFVTX1VOX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFVuU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfU1RBVFVTX1RFU1RJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFRlc3RpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfU1RBVFVTX1RFU1RfT1ZFUl9BTkRfUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFRlc3RPdmVyQW5kUGFzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9TVEFUVVNfVEVTVF9PVkVSX0FORF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgVGVzdE92ZXJBbmRGYWlsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXM7CisKKy8qKiBQUCBQbyBFIFRlc3QgRmFpbCBSZWFzb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTnVsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9IQVJEV0FSRV9OT1RfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgSGFyZHdhcmVOb3RTdXBwb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX1ZMQU5fTk9UX0NPTkZJR1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBWbGFuTm90Q29uZmlndXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX1RJTUVPVVRfRk9SX1BBREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBUaW1lb3V0Rm9yUEFESS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9USU1FT1VUX0ZPUl9QQURSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVGltZW91dEZvclBBRFIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fTENQTkVHX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IExDUE5lZ0ZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fQVVUSF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEF1dGhGYWlsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX0lQTkVHX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDggICAgICAgICAgICAgLyoqPCBJUE5lZ0ZhaWwuICovCit9IGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uOworCisvKiogU3RhcnQgT3IgU3RvcCBJbmRpY2F0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fU1RBUlRfT1JfU1RPUF9JTkRJQ0FUSU9OX1NUT1BfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3RvcFRlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NUQVJUX09SX1NUT1BfSU5ESUNBVElPTl9TVEFSVF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IFN0YXJ0VGVzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbjsKKworLyoqIFBQIFBvIEUgQXV0aCBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FQVVUSF9NT0RFX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQXV0by4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FQVVUSF9NT0RFX1BBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUGFwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VBVVRIX01PREVfQ0hBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBDaGFwLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlOworCisvKiogQ1RDIFN1cHBvcnRlZCBTZXJ2aWNlcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlcworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1VQUE9SVEVEX1NFUlZJQ0VTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TVVBQT1JURURfU0VSVklDRVNfR0VQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IEdFIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TVVBQT1JURURfU0VSVklDRVNfRkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IEZFIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TVVBQT1JURURfU0VSVklDRVNfVk9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IFZvSVAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TVVBQT1JURURfU0VSVklDRVNfVERNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA4ICAgICAgICAvKio8IFRETS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXM7CisKKy8qKiBDVEMgU2VydmljZSBTTEEgT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fREVBQ1RJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERlYWN0aXZhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fQUNUSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEFjdGl2YXRlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbjsKKworLyoqIENUQyAyLjEgT05VIERCQSBTY2hlZHVsaW5nIFNjaGVtZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0RCQV9TQ0hFRFVMSU5HX1NDSEVNRV9TVFJJQ1RfUFJJT1JJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTdHJpY3QgUHJpb3JpdHkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9EQkFfU0NIRURVTElOR19TQ0hFTUVfV0VJR0hURURfUk9VTkRfUk9CSU4gICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgV2VpZ2h0ZWQgUm91bmQtUm9iaW4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9EQkFfU0NIRURVTElOR19TQ0hFTUVfU1BQTFVTX1dSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgU1ArV1JSICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZTsKKworLyoqIENUQyBPTlUgVHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9UWVBFX1NGVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU0ZVICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfVFlQRV9IR1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEhHVSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfU0JVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBTQlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9UWVBFX0JPWF9NRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQm94IE1EVSAoRXRoZXJuZXQgUG9ydCkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9UWVBFX1NNQUxMX0xDTURVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU21hbGwgTEMgTURVIChFdGhlcm5ldCBQb3J0KSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfQk9YX0xDTURVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBCb3ggTEMgTURVIChEU0wgUG9ydCkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9UWVBFX0NIQVNTSVNfTENNRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgQ2hhc3NpcyBMQyBNRFUgKERTTCBQb3J0KSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfTENNRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBML0MgTURVIChzdXBwb3J0IG1peGluZyBpbnNlcnRpb24gb2YgRXRoZXJuZXQgcG9ydCBML0MgYW5kIERTTCBQb3J0IEwvQykgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9UWVBFX0NNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5ICAgICAgICAgICAgIC8qKjwgQ01DICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGU7CisKKy8qKiBDVEMgT05VIFByb3RlY3Rpb24gVHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1BST1RFQ1RJT05fVFlQRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb3QgU3VwcG9ydCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1BST1RFQ1RJT05fVFlQRV9UWVBFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBUeXBlIEMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9QUk9URUNUSU9OX1RZUEVfVFlQRV9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgVHlwZSBEICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZTsKKworLyoqIENUQyAyLjEgT05VIEludGVyZmFjZSBUeXBlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgR2FnYWJpdCBFdGhlcm5ldCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX0ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBGYXN0IEV0aGVybmV0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfVk9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFZvSVAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9URE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVERNICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfQURTTDJQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEFEU0wyKyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX1ZEU0wyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBWRFNMMiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX1dMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBXTEFOICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfVVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFVTQiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX0NBVFZfUkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDggICAgICAgICAgICAgLyoqPCBDQVRWIFJGICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlOworCisvKiogQ1RDIE14VSBHbG9iYWwgUGFyYW1zIFdpZHRoLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGgKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgSVB2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSAgICAgICAgICAgIC8qKjwgSVB2Ni4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aDsKKworLyoqIENUQyBNeFUgU05NUCBQYXJhbXMgV2lkdGguIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGgKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsICAgICAgICAgIC8qKjwgSVB2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTcgICAgICAgICAgIC8qKjwgSVB2Ni4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGg7CisKKy8qKiBDVEMgT05VIFBvd2VyIFN1cHBseSBDb250cm9sIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1BPV0VSX1NVUFBMWV9DT05UUk9MX1RZUEVfTk9UX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEb24ndCBTdXBwb3J0IE9OVSBQb3dlciBTdXBwbHkgQ29udHJvbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1BPV0VSX1NVUFBMWV9DT05UUk9MX1RZUEVfVFhfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIFR4IGFuZCBSeCBwb3dlciBzdXBwbHkgY2FuIG9ubHkgYmUgY29udHJvbGxlZCB0b2dldGhlciB3aGVyZWJ5IHBvd2VyIGZvciBSeCBpcyBhbHNvIHNodXRkb3duIHdoZW4gdGhlIHBvd2VyIHRvIFR4IGlzIHNodXRkb3duICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUE9XRVJfU1VQUExZX0NPTlRST0xfVFlQRV9UWF9SWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgdHggYW5kIHJ4IGNhbiBiZSBjb250cm9sbGVkIHNlcGFyYXRlbHkgd2hlcmVieSBwb3dlciB0byBSeCBpcyBzdGlsbCBvbiB3aGlsZSB0aGUgcG93ZXIgdG8gVHggaXMgc2h1dGRvd24gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZTsKKworLyoqIENUQyBWbGFuIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU1BBUkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVHJhbnNwYXJlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVHJhbnNsYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfQUdHUkVHQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEFnZ3JlZ2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgVHJ1bmsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfU1BFQ0lBTF9UUkFOU1BBUkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU1LCAgICAgICAgICAvKio8IFNwZWNpYWwgVHJhbnNwYXJlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTktfTURVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFRydW5rIE1EVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9IWUJSSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCAgICAgICAgICAgIC8qKjwgSHlicmlkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZTsKKworLyoqIENUQyBjbGFzc2lmaWNhdGlvbiBmaWVsZCBzZWxlY3RvcnMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE1BQyBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE1BQyBzb3VyY2UgYWRkcmVzcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9QUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBWTEFOIHByaW9yaXR5IChDb1MpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFZMQU4gSUQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0VUSF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRXRoZXJUeXBlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9ERVNUX0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IElQIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgSVAgc291cmNlIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgSVAgcHJvdG9jb2wgdHlwZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBJUCBUb1MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1BSRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgSVAgcHJlY2VkZW5jZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBVRFAgc291cmNlIHBvcnQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgVURQIGRlc2ludGF0aW9uIHBvcnQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgSVAgVmVyc2lvbiAodjQgb3IgdjYpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9GTE9XX0xBQkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IElQIEZsb3cgTGFiZWwgKElQdjYpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IERlc3RpbmF0aW9uIElQdjYgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgU291cmNlIElwdjYgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RTVF9JUFY2UFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gSVB2NiBQcmVmaXggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2UFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgU291cmNlIElQdjYgUHJlZml4ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9OWFRfSERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTggICAgICAgICAgICAvKio8IE5leHQgSGVhZGVyIChJUHY2KShzdWNoIGFzIFRDUC9JUC9JQ01QdjQvSUdNUCxldGMpICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQ7CisKKy8qKiBDVEMgY2xhc3NpZmljYXRpb24gb3BlcmF0b3JzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfT1BFUkFUT1JfTkVWRVJfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOZXZlciBtYXRjaCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfT1BFUkFUT1JfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBMSFMgPT0gUkhTICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9OT1RfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExIUyAhPSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX0xURVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTEhTIDw9IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfT1BFUkFUT1JfR1RFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBMSFMgPj0gUkhTICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE1hdGNoIGlmIHRoZSBmaWVsZCBleGlzdHMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTWF0Y2ggaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9BTFdBWVNfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNyAgICAgICAgICAgICAvKio8IEFsd2F5cyBtYXRjaCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yOworCisvKiogQ1RDIE11bHRpY2FzdCBWTEFOIE9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEZWxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFkZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IExpc3QuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uOworCisvKiogQ1RDIE11bHRpY2FzdCBUYWcgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX0RPX05PVF9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEbyBOb3QgU3RyaXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFN0cmlwIERhdGEvUXVlcnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWV9JUFRWICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFN0cmlwIERhdGEvUXVlcnkvSVBUVi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGU7CisKKy8qKiBDVEMgTXVsdGljYXN0IFN3aXRjaCBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfU1dJVENIX01PREVfSUdNUF9NTERfU05PT1BJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IElHTVAvTUxEIFNub29waW5nIGR1YWwgc3RhY2sgbW9kZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1NXSVRDSF9NT0RFX0NUQ19DT05UUk9MTEFCTEVfSUdNUF9NTEQgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBDVEMgY29udHJvbGxhYmxlIElHTVAvTUxEIG1vZGUsIHNub29waW5nIGRpc2FibGVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfU1dJVENIX01PREVfSUdNUF9TTk9PUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IElHTVAgc25vb3BpbmcgbW9kZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1NXSVRDSF9NT0RFX0NUQ19DT05UUk9MTEFCTEVfSUdNUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBDVEMgY29udHJvbGxhYmxlIElHTVAgbW9kZSwgc25vb3BpbmcgZGlzYWJsZWQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9TV0lUQ0hfTU9ERV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjcgICAgICAgICAgIC8qKjwgVW5kZWZpbmVkIG1vZGUsIGhhcyBub3QgYmVlbiBzZXQgeWV0ICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlOworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfQUNUSU9OX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEZWxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9BQ1RJT05fQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFkZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX0FDVElPTl9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9BQ1RJT05fTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IExpc3QuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uOworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEdEQSBNQUMgT25seS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX1ZMQU5fSUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgR0RBIE1BQyArIFZMQU4gSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY0U0EgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEdEQSBNQUMgKyBJUHY0IFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBQTFVTX01DQVNUX1ZMQU5fSUQgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBHREEgSVAgKyBNY2FzdCBWTEFOIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBWNlBMVVNfTUNBU1RfVkxBTl9JRCAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBHREEgSVB2NiArIE1jYXN0IFZMQU4gSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY2U0EgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAvKio8IEdEQSBNQUMgKyBJUHY2IFNBLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGU7CisKKy8qKiBDVEMgMi4xIHBvc3NpYmxlIFZvSVAgcHJvdG9jb2xzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lQX1BST1RPQ09MX0gyNDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEgyNDggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSVBfUFJPVE9DT0xfU0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgU0lQICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbDsKKworLyoqIENUQyAyLjEgVm9pY2UgSVAgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lDRV9JUE1PREVfU1RBVElDX0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFN0YXRpYyBJUCBhZGRyZXNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lDRV9JUE1PREVfREhDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERIQ1AgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0lQTU9ERV9QUFBPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgUFBQb0UvUFBQb0UrICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlOworCisvKiogQ1RDIFBQUG9FIE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BQUE9FX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQXV0byAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BQUE9FX01PREVfQ0hBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQ2hhbGxlbmdlIEhhbmRzaGFrZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUFBQT0VfTU9ERV9QQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBQYXNzd29yZCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGU7CisKKy8qKiBDVEMgMi4xIFZvaWNlIFRhZ2dpbmcgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lDRV9UQUdHSU5HX01PREVfUEFTU19USFJPVUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFBhc3MgVGhyb3VnaCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfVEFHR0lOR19NT0RFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBUYWcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX1RBR0dJTkdfTU9ERV9WTEFOX1NUQUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgVkxBTiBTdGFja2luZyAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZTsKKworLyoqIENUQyAyLjEgSDI0OCBSZWdpc3RyYXRpb24gTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19IMjQ4UkVHX01PREVfSVBBRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IElQIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0gyNDhSRUdfTU9ERV9ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRG9tYWluIG5hbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0gyNDhSRUdfTU9ERV9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRGV2aWNlIG5hbWUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGU7CisKKy8qKiBDVEMgMi4xIEgyNDggSGVhcnRiZWF0IE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSDI0OEhFQVJUQkVBVF9NT0RFX0NMT1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBDbG9zZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSDI0OEhFQVJUQkVBVF9NT0RFX0gyNDhDVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBILjI0OC1DVEMgc3RhbmRhcmQgTm90aWZ5IGNvbW1hbmQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGU7CisKKy8qKiBQb3NzaWJsZSBDVEMgMi4xIFJUUCBUSUQgY29uZmlndXJhdGlvbiBtb2RlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVFBfVElEX01PREVfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEFsaWdubWVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JUUF9USURfTU9ERV9OT05fQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgTm9uLUFsaWdubWVudC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGU7CisKKy8qKiBDVEMgMi4xIFZvaWNlIFQzOCBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lDRV9UMzhNT0RFX1BBU1NUSFJPVUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFZvaWNlIHBhc3N0aHJvdWdoIG1vZGUgKFQzMCkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX1QzOE1PREVfVDM4TU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgVDM4IE1vZGUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlOworCisvKiogQ1RDIDIuMSBWb2ljZS9GYXggTW9kZW0gQ29udHJvbCBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lDRV9GQVhfTU9ERU1fQ09OVFJPTF9NT0RFX05FR09USUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5lZ290aWF0aW9uIE1vZGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0ZBWF9NT0RFTV9DT05UUk9MX01PREVfQVVUT19CVkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgQXV0byBCVkQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlOworCisvKiogQ1RDIDIuMSBJQUQgT3BlcmF0aW9uIFN0YXR1cyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fU1RBVFVTX1JFR0lTVEVSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUmVnaXN0ZXJpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fU1RBVFVTX1JFR19TVUNDRVNTRlVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIFN1Y2Nlc3NmdWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fU1RBVFVTX0lBRF9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgSUFEIEZhdWx0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfT1BFUkFUSU9OX1NUQVRVU19MT0dPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IExvZ291dCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9TVEFUVVNfSUFEX1JFU1RBUlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBJQUQgUmVzdGFydGluZyAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzOworCisvKiogQ1RDIDIuMSBJQUQgUG9ydCBTdGF0dXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX1JFR0lTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBQb3J0IGlzIHJlZ2lzdHJpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBpZGxlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUElDS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFBpY2sgdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19ESUFMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRGlhbGluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX1JJTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBSaW5naW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUklOR0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFJpbmdpbmcgYmFjayAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX0NPTk5FQ1RJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBDb25uZWN0aW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IENvbm5lY3RlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX1JFTEVBU0lOR19DT05ORUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBSZWxlYXNpbmcgQ29ubmVjdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX1JFR0lTVFJBVElPTl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBQb3J0IFJlZ2lzdHJhdGlvbiBGYWlsdXJlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfTk9UX0FDVElWQVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAvKio8IFBvcnQgaXMgbm90IGFjdGl2YXRlZCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1czsKKworLyoqIENUQyAyLjEgSUFEIFBvcnQgU2VydmljZSBTdGF0ZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU0VSVklDRV9TVEFURV9FTkRfTE9DQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBMb2NhbCBlbmQgdGVybWluYXRlcyBzZXJ2aWNlLCBjYXVzZWQgYnkgJ3VzZXIgZGlzYWJsZSBwb3J0JyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU0VSVklDRV9TVEFURV9FTkRfUkVNT1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSZW1vdGUgYW5kIHRlcm1pbmF0ZXMgc2VydmljZSwgY2F1c2VkIGJ5ICdNR0Mgc2VuZHMgZG93biBjb21tYW5kJyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU0VSVklDRV9TVEFURV9FTkRfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBBdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSBzZXJ2aWNlLCBjYXVzZWQgYnkgTUdDIGZhdWx0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TRVJWSUNFX1NUQVRFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IE5vcm1hbCBzZXJ2aWNlIG5vcm1hbCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGU7CisKKy8qKiBDVEMgMi4xIElBRCBQb3J0IENvZGVjIE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX0NPREVDX01PREVfRzcxMUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRy43MTEgQSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfQ09ERUNfTU9ERV9HNzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBHLjcyOSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfQ09ERUNfTU9ERV9HNzExVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBHLjcxMSBVICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9DT0RFQ19NT0RFX0c3MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEcuNzIzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9DT0RFQ19NT0RFX0c3MjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEcuNzI2ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9DT0RFQ19NT0RFX1QzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAvKio8IFQuMzggKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlOworCisvKiogQ1RDIDIuMSBJQUQgT3BlcmF0aW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfT1BFUkFUSU9OX1JFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFJlLVJlZ2lzdGVyIGZvciBzb2Z0c3dpdGNoIHBsYXRmb3JtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfT1BFUkFUSU9OX0xPR09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExvZ291dCBmcm9tIHNvZnRzd2l0Y2ggcGxhdGZvcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgUmVzZXQsIG9ubHkgZm9yIHZvaWNlIG1vZHVsZSAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb247CisKKy8qKiBadGUgT251IFBvcnQgTWFjIE9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX09OVV9QT1JUX01BQ19PUEVSQVRJT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRGVsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfT05VX1BPUlRfTUFDX09QRVJBVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBZGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9PTlVfUE9SVF9NQUNfT1BFUkFUSU9OX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfT05VX1BPUlRfTUFDX09QRVJBVElPTl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBMaXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb247CisKKy8qKiBadGUgSXNvbGF0ZSBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9JU09MQVRFX01PREVfTk9UX0lTT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEV0aGVybmV0IHBvcnQgZG8gbm90IGlzb2xhdGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0lTT0xBVEVfTU9ERV9JU09MQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgRXRoZXJuZXQgcG9ydCBpc29sYXRlICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlOworCisvKiogWnRlIEJ1ZmZlciBNYW5hZ2UgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfQlVGRkVSX01BTkFHRV9NT0RFX05PVFNVUFBPUlRCVUZGRVJNQU5BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb3RTdXBwb3J0QnVmZmVyTWFuYWdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfQlVGRkVSX01BTkFHRV9NT0RFX1NVUFBPUlRCVUZGRVJNQU5BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBTdXBwb3J0QnVmZmVyTWFuYWdlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZTsKKworLyoqIFp0ZSBEUyBCdWYgRGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9EU0JVRl9ESVJFQ1RJT05fVVBTVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFVwc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfRFNCVUZfRElSRUNUSU9OX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfRFNCVUZfRElSRUNUSU9OX0JPVEhfVVBTVFJFQU1fQU5EX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBCb3RoIFVwc3RyZWFtIEFuZCBEb3duc3RyZWFtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbjsKKworLyoqIFp0ZSBTdGF0aXN0aWNzIEFjdGlvbiBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfU1RBVElTVElDU19BQ1RJT05fTU9ERV9PTlVfVU5JX1NUT1BfU1RBVElTVElDUyAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPbnVVTklTdG9wU3RhdGlzdGljcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX1NUQVRJU1RJQ1NfQUNUSU9OX01PREVfT05VX1VOSV9TVEFSVF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgT251VU5JU3RhcnRTdGF0aXN0aWNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGU7CisKKy8qKiBadGUgU3RhdGlzdGljcyBSZXNldCBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9TVEFUSVNUSUNTX1JFU0VUX01PREVfT05VX1JFU0VUX1NUQVRJU1RJQ1NfQ09VTlRFUiAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE9udSBSZXNldCBTdGF0aXN0aWNzIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9TVEFUSVNUSUNTX1JFU0VUX01PREVfS0VFUF9TVEFUSVNUSUNTX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEtlZXAgU3RhdGlzdGljcyBDb3VudGVyLiAqLworfSBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZTsKKworLyoqIFVuaSBGbG93IFN0YXRpc3RpY3MgQ29sbGVjdCBDb250cm9sIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVU5JX0ZMT1dfU1RBVElTVElDU19DT0xMRUNUX0NPTlRST0xfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVU5JX0ZMT1dfU1RBVElTVElDU19DT0xMRUNUX0NPTlRST0xfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgRW5hYmxlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZTsKKworLyoqIExpZ2h0IEluZGljYXRpb24gTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0xJR0hUX0lORElDQVRJT05fTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vcm1hbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTElHSFRfSU5ESUNBVElPTl9NT0RFX0VYQ0VQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgRXhjZXB0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlOworCisvKiogTWF0Y2ggTWFjIEFkZHJlc3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFUQ0hfTUFDX0FERFJFU1NfTU9ERV9JR05PUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSWdub3JlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVRDSF9NQUNfQUREUkVTU19NT0RFX0VYQ1VURV9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFeGN1dGUgTWF0Y2guICovCit9IGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlOworCisvKiogWnRlIExpZ2h0IENvbnRyb2wgQWN0aW9uIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9MSUdIVF9DT05UUk9MX0FDVElPTl9NT0RFX09QRU5fVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE9wZW4gVHJhbnNmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9MSUdIVF9DT05UUk9MX0FDVElPTl9NT0RFX0NMT1NFX1RSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IENsb3NlIFRyYW5zZmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfTElHSFRfQ09OVFJPTF9BQ1RJT05fTU9ERV9DTE9TRV9PUFRJQ0FMX01PREVMICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBDbG9zZSBPcHRpY2FsIE1vZGVsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGU7CisKKy8qKiBPTlUgRXhjbCBBYmlsaXR5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9FWENMX0FCSUxJVFlfTk9UU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vdFN1cHBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9FWENMX0FCSUxJVFlfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IFN1cHBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5OworCisvKiogQ1RDIE9OVSBFYXJseSBXYWtlIENhcGFiaWxpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfRUFSTFlfV0FLRV9DQVBBQklMSVRZX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9FQVJMWV9XQUtFX0NBUEFCSUxJVFlfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgTm90IFN1cHBvcnRlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5OworCisvKiogQ1RDIFBvcnQgRGlzYWJsZSBPbiBMb29wIERldGVjdGVkIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPUlRfRElTQUJMRV9PTl9MT09QX0RFVEVDVEVEX1NUQVRFX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgV2hlbiBwb3J0IGxvb3BiYWNrIGlzIGRldGVjdGVkLCBkbyBub3QgZGlzYWJsZSB0aGlzIHBvcnQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPUlRfRElTQUJMRV9PTl9MT09QX0RFVEVDVEVEX1NUQVRFX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgV2hlbiBwb3J0IGxvb3BiYWNrIGlzIGRldGVjdGVkLCBkaXNhYmxlIHRoaXMgcG9ydCBhdXRvbWF0aWNhbGx5ICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGU7CisKKy8qKiBDVEMgTW9uaXRvcmluZyBTdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTU9OSVRPUklOR19TVEFUVVNfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEaXNhYmxlIE9OVSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NT05JVE9SSU5HX1NUQVRVU19FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEVuYWJsZSBPTlUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzOworCisvKiogQ1RDIEZpbGUgQ2hlY2sgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgRW5kIERvd25sb2FkIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNyAgICAgICAgICAgICAvKio8IEVuZCBEb3dubG9hZCBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZTsKKworLyoqIENUQyBSUFMgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SUFNfQ09ERV9DSEVDS19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IENoZWNrIFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SUFNfQ09ERV9XUklUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFdyaXRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SUFNfQ09ERV9DSEVDS19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IENoZWNrIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlBTX0NPREVfUEFSQU1FVEVSX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBQYXJhbWV0ZXIgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SUFNfQ09ERV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGU7CisKKy8qKiBDVEMgT05VIEF1dGggQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BVVRIX0NPREVfQVVUSF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQXV0aCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FVVEhfQ09ERV9BVVRIX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBBdXRoIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FVVEhfQ09ERV9BVVRIX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBBdXRoIFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQVVUSF9DT0RFX0FVVEhfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IEF1dGggRmFpbHVyZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlOworCisvKiogV2VsbC1rbm93biBjb21wYW55IE9VSXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDA5NiwgICAgICAgICAvKio8IERQb0UgT1VJICovCisgICAgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTExODQ4MVVMLCAgICAvKio8IENUQydzIE9VSSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1MTAsICAgICAgICAgLyoqPCBUZWsncyBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTE4NDgxMFVMLCAgIC8qKjwgS1QncyBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzQ1MVVMLCAgICAgIC8qKjwgRGFzYW4ncyBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjg1LCAgICAgICAgIC8qKjwgUE1DJ3MgT1VJICovCisgICAgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDEyMCwgICAgICAgICAvKio8IEJyb2FkY29tJ3MgT1VJICovCisgICAgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgyMDU1OVVMICAgICAvKio8IFNJRVBPTiBPVUlfQSAqLworfSBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWk7CisKKy8qKiBDVEMgY2xhc3NpZmljYXRpb24gb3BlcmF0b3JzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVUxFX09QRVJBVE9SX05FVkVSX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5ldmVyIG1hdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVUxFX09QRVJBVE9SX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExIUyA9PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfTk9UX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTEhTICE9IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9MVEVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMSFMgPD0gUkhTICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVUxFX09QRVJBVE9SX0dURVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IExIUyA+PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfRVhJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTWF0Y2ggaWYgdGhlIGZpZWxkIGV4aXN0cyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9OT1RfRVhJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNYXRjaCBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfQUxXQVlTX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgIC8qKjwgQWx3YXlzIG1hdGNoICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9vcGVyYXRvcjsKKworLyoqIENUQyBTb2Z0d2FyZSBEb3dubG9hZCBEYXRhIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9URlRQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVEZUUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9EQVRBX0NIRUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGF0YSBDaGVja2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9TV01JUlJPUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUy9XIE1pcnJvcmluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9DT01NSVRfSU1BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgIC8qKjwgQ29tbWl0IEltYWdlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZTsKKworLyoqIENUQyBURlRQIE9wIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9XUklURV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgV3JpdGUgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGU7CisKKy8qKiBDVEMgUy9XIE1pcnJvciBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgQWN0aXZhdGUgSW1hZ2UgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5ICAgICAgICAgICAgIC8qKjwgQWN0aXZhdGUgSW1hZ2UgUmVzcG9uc2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlOworCisvKiogQ1RDIFMvVyBNaXJyb3IgQWN0aXZhdGUgSW1hZ2UgRmxhZy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWcKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX0FDVElWQVRFX0lNQUdFX0ZMQUdfUlVOX0JBQ0tVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgIC8qKjwgUnVuIEJhY2t1cC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnOworCisvKiogQ1RDIFMvVyBNaXJyb3IgQWNrLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9BQ0tfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9BQ0tfUEFSQU1FVEVSX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFBhcmFtZXRlciBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX0FDS19OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTm90IFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX0FDS19MT0FESU5HX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgTG9hZGluZyBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjazsKKworLyoqIEtUIE9wdGljYWwgUG93ZXIgQWxhcm0gU3RhdHVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0tUT1BUSUNBTF9QT1dFUl9BTEFSTV9TVEFUVVNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFsYXJtIGlzIGFjdGl2ZSAobGluZSBMRUQgaXMgb3JhbmdlKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9QVElDQUxfUE9XRVJfQUxBUk1fU1RBVFVTX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBBbGFybSBpcyBjbGVhciAobGluZSBMRUQgaXMgZ3JlZW4pICovCit9IGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzOworCisvKiogS1QgTGVhZiBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX09OVV9DT1VOVEVSX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPTlUgQ291bnRlciBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9SRVNUT1JFX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUmVzdG9yZSBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fVFhQT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFRYIFBvd2VyIE9mZi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb247CisKKy8qKiBDVEMgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEdldCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBHZXQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFNldCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTZXQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE9OVSBBdXRoZW50aWNhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgU29mdHdhcmUgRG93bmxvYWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IENodXJuaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBEQkEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IEtUIE9OVSBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICAgIC8qKjwgRXZlbnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlOworCisvKiogS1QgT05VIEV2ZW50IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0xPT1BfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBMb29wIERldGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9PUFRJQ0FMX1BPV0VSX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgT3B0aWNhbCBQb3dlciBBbGFybS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGU7CisKKy8qKiBLVCBMb29wIERldGVjdCBFdmVudC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudAoreworICAgIEJDTU9MVF9FUE9OX09BTV9LVExPT1BfREVURUNUX0VWRU5UX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBMb29wIGRldGVjdCBkZXRlY3RlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExPT1BfREVURUNUX0VWRU5UX1JFUEFJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBMb29wIGRldGVjdCByZXBhaXJlZCAqLworfSBiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudDsKKworLyoqIEtUIE9wdGljYWwgUG93ZXIgQWxhcm0gRXZlbnQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudAoreworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9QVElDQUxfUE9XRVJfQUxBUk1fRVZFTlRfUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPcHRpY2FsIHBvd2VyIGFsYXJtIHJhaXNlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9QVElDQUxfUE9XRVJfQUxBUk1fRVZFTlRfUkVMRUFTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBPcHRpY2FsIHBvd2VyIGFsYXJtIHJlbGVhc2VkICovCit9IGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnQ7CisKKy8qKiBEYXNhbiBDbGFzc2lmaWVyIENvbW1hbmQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNTIsICAgICAgICAgLyoqPCBBZGQgRmlsdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUkVNT1ZFX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNTMsICAgICAgICAgLyoqPCBSZW1vdmUgRmlsdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUVVFVUVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNTQsICAgICAgICAgLyoqPCBRdWV1ZSBNYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfUFJJT1JJVFlfRk9SX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1NSAgICAgICAgICAvKio8IEFkZCBQcmlvcml0eSBmb3IgVkxBTi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZDsKKworLyoqIERhc2FuIERpcmVjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0RJUkVDVElPTl9VUFNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFVwc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9ESVJFQ1RJT05fRE9XTlNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uOworCisvKiogRGFzYW4gRmlsdGVyIEZpZWxkLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fRklMVEVSX0ZJRUxEX0VUSEVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRXRoZXJUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9GSUxURVJfRklFTERfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBWTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9GSUxURVJfRklFTERfSVBQUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBJUCBQcm90b2NvbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZDsKKworLyoqIERhc2FuIEZpbHRlciBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fRklMVEVSX0FDVElPTl9ET19OT1RfUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRG8gTm90IFBhc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0ZJTFRFUl9BQ1RJT05fUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IFBhc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uOworCisvKiogRGFzYW4gUHJpIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1BSSV9UWVBFX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IENvUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fUFJJX1RZUEVfVE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgVG9TLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGU7CisKKy8qKiBEYXNhbiBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfUE9SVF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBQb3J0IENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9WTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU2V0IFZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9HRVRfT05VX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEzLCAgICAgICAgICAvKio8IEdldCBPTlUgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1NUUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBTZXQgU1RQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1RYUE9XRVJfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBTZXQgVFggUG93ZXIgT2ZmLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX0xPT1BfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBTZXQgTG9vcCBEZXRlY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1RfVU5CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFNldCBMb29wIERldGVjdCBVbmJsb2NrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfQ0xBU1NJRklFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNDgsICAgICAgICAgLyoqPCBDbGFzc2lmaWVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMDQsICAgICAgICAgLyoqPCBPTlUgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9GTEFTSF9GSVJNV0FSRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzExLCAgICAgICAgIC8qKjwgT05VIEZsYXNoIEZpcm13YXJlIFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfQUNUSVZFX0lNQUdFX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMxNCwgICAgICAgICAvKio8IE9OVSBBY3RpdmUgSW1hZ2UgVGltZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzA1LCAgICAgICAgIC8qKjwgT05VIFN0YXRpc3RpYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzA2LCAgICAgICAgIC8qKjwgT05VIFN0YXRpc3RpYyBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzE5LCAgICAgICAgIC8qKjwgT05VIFN0YXRpc3RpYyBHZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfSUdNUF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMwNywgICAgICAgICAvKio8IE9OVSBJR01QIFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9QT1JUX0lHTVBfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzA4LCAgICAgICAgIC8qKjwgT05VIFBvcnQgSWdtcCBGaWx0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU0hBUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMxNyAgICAgICAgICAvKio8IE9OVSBTaGFwaW5nLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlOworCisvKiogRGFzYW4gU3RhdHMgU2VxIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQwQU5EMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFBvcnQgMCBhbmQgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDJBTkQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUG9ydCAyIGFuZCAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBFcnJvcnMuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZTsKKworLyoqIERhc2FuIFN0YXQgSUQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTX1RYT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IEZyYW1lcyBUWCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTX1RYT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcyBUWCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTX1JYT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IEZyYW1lcyBSWCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTX1JYT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcyBSWCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9TWVNURU1fRlJBTUVTX1JYT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU3lzdGVtIEZyYW1lcyBSWCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9TWVNURU1fRlJBTUVTX1JYRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgU3lzdGVtIEZyYW1lcyBSWCBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9TWVNURU1fT0NURVRTX1JYRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgU3lzdGVtIE9jdGV0cyBSWCBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9TWVNURU1fT0NURVRTX1JYT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgU3lzdGVtIE9jdGV0cyBSWCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9TWVNURU1fRlJBTUVfVE9PX0xPTkdfRVJST1JTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgU3lzdGVtIEZyYW1lIFRvbyBMb25nIEVycm9ycyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9QT05fRkNTX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgUE9OIEZDUyBFcnJvcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRfSURfUE9OX0VSUk9SX09DVEVUU19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAvKio8IFBPTiBFcnJvciBPY3RldHMgUlguICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkOworCisvKiogU3RhbmRhcmQgZGlyZWN0aW9uIGVudW0gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RJUkVDVElPTl9VUFNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFVwc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9ESVJFQ1RJT05fRE9XTlNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uOworCisvKiogRG9tYWluIE9wdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9ET01BSU5fT1BUSU9OX0RFRkFVTFRfU05PT1BJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEZWZhdWx0IFNub29waW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9ET01BSU5fT1BUSU9OX0RJU0FCTEVfRE5fQVVUT19TTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEaXNhYmxlIERuIEF1dG8gU25vb3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RPTUFJTl9PUFRJT05fRElTQUJMRV9VUF9BVVRPX1NOT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERpc2FibGUgVXAgQXV0byBTbm9vcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRE9NQUlOX09QVElPTl9VTkJMT0NLX01MRF9JRl9MSU1JVF9FWENFRURFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgVW5ibG9jayBNbGQgSWYgTGltaXQgRXhjZWVkZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RPTUFJTl9PUFRJT05fUFJPWFlfSk9JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFByb3h5IEpvaW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RPTUFJTl9PUFRJT05fUFJPWFlfTEVBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYgICAgICAgICAgICAvKio8IFByb3h5IExlYXZlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbjsKKworLyoqIERQb0UgTGVhZiBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVNFVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVGhpcyBhdHRyaWJ1dGUgcmVzZXRzIHRoZSBPTlUsIGFzIGlmIGZyb20gcG93ZXIgb24uICAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NywgICAgICAgICAgLyoqPCBDbGVhciBEeW4gTGVhcm4gVGFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU4LCAgICAgICAgICAvKio8IEFkZCBEeW4gTUFDIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0RZTl9NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU5LCAgICAgICAgICAvKio8IERlbCBEeW4gTUFDIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVElDX0xFQVJOX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYwLCAgICAgICAgICAvKio8IENsZWFyIFN0YXRpYyBMZWFybiBUYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfU1RBVElDX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjEsICAgICAgICAgIC8qKjwgQWRkIFN0YXRpYyBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfU1RBVElDX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjIsICAgICAgICAgIC8qKjwgRGVsIFN0YXRpYyBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DT05GSUdVUkVfTUNBU1RfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjMsICAgICAgICAgIC8qKjwgQ29uZmlndXJlIE1jYXN0IExMSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEzLCAgICAgICAgICAvKio8IENsZWFyIFN0YXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFVFJJRVZFX0NVUlJFTlRfQUxBUk1fU1VNTUFSWSAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2OSwgICAgICAgICAgLyoqPCBSZXRyaWV2ZSBDdXJyZW50IEFsYXJtIFN1bW1hcnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfSU5HUkVTU19SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MSwgICAgICAgICAvKio8IENsZWFyIEluZ3Jlc3MgUnVsZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MiwgICAgICAgICAvKio8IEFkZCBJbmdyZXNzIFJ1bGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9JTkdSRVNTX1JVTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODMsICAgICAgICAgLyoqPCBEZWwgSW5ncmVzcyBSdWxlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9FTkFCTEVfVVNFUl9UUkFGRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTM3LCAgICAgICAgIC8qKjwgRW5hYmxlIFVzZXIgVHJhZmZpYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTM4LCAgICAgICAgIC8qKjwgRGlzYWJsZSBVc2VyIFRyYWZmaWMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzOSwgICAgICAgICAvKio8IExvb3BiYWNrIEVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTQwLCAgICAgICAgIC8qKjwgTG9vcGJhY2sgRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTQxICAgICAgICAgIC8qKjwgTGFzZXIgVHggUG93ZXIgT2ZmLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbjsKKworLyoqIERQb0UgTG9vcGJhY2sgTG9jYXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MT09QQkFDS19MT0NBVElPTl9QSFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUEhZLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xPT1BCQUNLX0xPQ0FUSU9OX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBNQUMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTE9PUEJBQ0tfTE9DQVRJT05fTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IExpbmsuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uOworCisvKiogRFBvRSBMbGlkIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xMSURfQUNUSU9OX0FERF9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBZGQgTGxpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MTElEX0FDVElPTl9ERUxFVEVfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRGVsZXRlIExsaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTExJRF9BQ1RJT05fREVMRVRFX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IERlbGV0ZSBBbGwuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uOworCisvKiogRFBvRSBBbGFybSBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgTE9TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfS0VZRVhDSEFOR0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBLZXlFeGNoYW5nZSBGYWlsdXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBQb3J0IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9XRVJfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1LCAgICAgICAgICAgLyoqPCBQb3dlciBGYWlsdXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfU1RBVElTVElDU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAgICAgLyoqPCBTdGF0aXN0aWNzIEFsYXJtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfT05VX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBPTlUgQnVzeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX01BQ19UQUJMRV9PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzEgICAgICAgICAgIC8qKjwgTWFjIFRhYmxlIE92ZXJmbG93LiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlOworCisvKiogRFBvRSBMZWFmIEF0dHJpYnV0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBTZXF1ZW5jZSBOdW1iZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRmlybXdhcmUgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DSElQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQ2hpcCBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBVEVfT0ZfTUFOVUZBQ1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBEYXRlIE9mIE1hbnVmYWN0dXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BTlVGQUNUVVJFUl9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNYW51ZmFjdHVyZXIgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTE9HSUNBTF9MSU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgTWF4IExvZ2ljYWwgTGlua3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX0VQT05fUE9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IE51bSBFUE9OIFBvcnRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9VTklfUE9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBOdW0gVU5JIFBvcnRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BBQ0tFVF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBQYWNrZXQgQnVmZmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBSZXBvcnQgVGhyZXNob2xkcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgTGluayBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PQU1fUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgT0FNIFJhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUZSX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IE1mciBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZXQVJFX01GR19USU1FX1ZBUl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBGd2FyZSBNZmcgVGltZSBWYXIgQ3RybC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgRC1PTlUgUG9ydCBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1ZFTkRPUl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBWZW5kb3IgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NT0RFTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgTW9kZWwgTnVtYmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0hXX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBIdyBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTkVfUkFURV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCBMaW5lIFJhdGUgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTcsICAgICAgICAgIC8qKjwgRHluIExlYXJuIFRhYmxlIFNpemUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU4LCAgICAgICAgICAvKio8IER5biBMZWFybiBBZ2UgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU5LCAgICAgICAgICAvKio8IFRoaXMgYXR0cmlidXRlIHJlcHJlc2VudHMgdGhlIGR5bmFtaWNhbGx5IGxlYXJuZWQgTUFDIGFkZHJlc3MgcnVsZXMgb2Ygb25lIEV0aGVybmV0IHBvcnQuIE1BQyBhZGRyZXNzIGFyZSByZXBlYXRlZCB3aXRoaW4gYSBzaW5nbGUgYXR0cmlidXRlIHVudGlsIHRoYXQgYXR0cmlidXRlIGlzIGZ1bGwgKDIxIGFkZHJlc3NlcyA9IDEyNiBieXRlcykuIElmIG5lY2Vzc2FyeSwgc3VjaCBhdHRyaWJ1dGVzIGFyZSByZXBlYXRlZCBhcyBhbiBhdHRyaWJ1dGUgbGlzdCB1bnRpbCB0aGUgZW50aXJlIHRhYmxlIGhhcyBiZWVuIHJlcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MCwgICAgICAgICAgLyoqPCBUaGlzIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBzdGF0aWNhbGx5IHByb3Zpc2lvbmVkIE1BQyBhZGRyZXNzIHRhYmxlLiBUaGUgZGF0YSBzdHJ1Y3R1cmUgaXMgdGhlIHNhbWUgYXMgdGhlIEdldCBEeW5hbWljIE1BQyBUYWJsZSBhdHRyaWJ1dGUgYWJvdmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYxLCAgICAgICAgICAvKio8IFBvcnQgQ2FwYWJpbGl0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjIsICAgICAgICAgIC8qKjwgRHluIExlYXJuIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYzLCAgICAgICAgICAvKio8IE1pbiBNQUMgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFYX01BQ19BTExPV0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY0LCAgICAgICAgICAvKio8IE1heCBNQUMgQWxsb3dlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjUsICAgICAgICAgIC8qKjwgQWdnIE1BQyBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MRU5fRVJSX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjYsICAgICAgICAgIC8qKjwgTGVuIEVyciBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NywgICAgICAgICAgLyoqPCBGbG9vZCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2OCwgICAgICAgICAgLyoqPCBMb2NhbCBTd2l0Y2hpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY5LCAgICAgICAgICAvKio8IFF1ZXVlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9GSUxFTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzAsICAgICAgICAgIC8qKjwgRmlybXdhcmUgRmlsZW5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19UQUJMRV9GVUxMX0JFSEFWSU9SICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcxLCAgICAgICAgICAvKio8IFVuaSBNYWMgVGFibGUgRnVsbCBCZWhhdmlvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUNBU1RfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzIsICAgICAgICAgIC8qKjwgT251IE1jYXN0IExMSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19MRUFSTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjczLCAgICAgICAgICAvKio8IFVuaSBNYWMgTGVhcm5lZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUFYX0ZSQU1FX1NJWkVfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgPSAyNzQsICAgICAgICAgIC8qKjwgT251IE1heCBGcmFtZSBTaXplIENhcGFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BWF9GUkFNRV9TSVpFX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjc1LCAgICAgICAgICAvKio8IFVuaSBNYXggRnJhbWUgU2l6ZSBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTMsICAgICAgICAgIC8qKjwgUnggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE0LCAgICAgICAgICAvKio8IFR4IFVuaWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxNSwgICAgICAgICAgLyoqPCBSeCBGcmFtZSBUb28gU2hvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE2LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjUxMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxNywgICAgICAgICAgLyoqPCBSeCBGcmFtZSA2NV8xMjcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE4LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDEyOF8yNTUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTY1MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE5LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDI1Nl81MTEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTIxMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIwLCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDUxMl8xMDIzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNDE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyMSwgICAgICAgICAgLyoqPCBSeCBGcmFtZSAxMDI0XzE1MTguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIyLCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDE1MTkgUGx1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjMsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NTEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTI0LCAgICAgICAgICAvKio8IFR4IEZyYW1lIDY1XzEyNy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyODI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjUsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMTI4XzI1NS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NjUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjYsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMjU2XzUxMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMjEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjcsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNTEyXzEwMjMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0MTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTI4LCAgICAgICAgICAvKio8IFR4IEZyYW1lIDEwMjRfMTUxOC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjksICAgICAgICAgIC8qKjwgVHggRnJhbWUgMTUxOSBQbHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzMCwgICAgICAgICAgLyoqPCBRdWV1ZSBEZWxheSBUaHJlc2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMxLCAgICAgICAgICAvKio8IFF1ZXVlIERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZSQU1FU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzMiwgICAgICAgICAgLyoqPCBGcmFtZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzMsICAgICAgICAgIC8qKjwgQnl0ZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19ERUxBWUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzQsICAgICAgICAgIC8qKjwgQnl0ZXMgRGVsYXllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzUsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgVW51c2VkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MSwgICAgICAgICAgLyoqPCBPcHQgTW9uIFRlbXBlcmF0dXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MiwgICAgICAgICAgLyoqPCBPcHQgTW9uIFZjYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX0JJQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDMsICAgICAgICAgIC8qKjwgT3B0IE1vbiBUeCBCaWFzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0NCwgICAgICAgICAgLyoqPCBPcHQgTW9uIFR4IFBvd2VyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fUlhfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0NSwgICAgICAgICAgLyoqPCBPcHQgTW9uIFJ4IFBvd2VyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19ZRUxMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0NiwgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgWWVsbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19ZRUxMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0NywgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgWWVsbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0dSRUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0OCwgICAgICAgICAgLyoqPCBUeCBCeXRlcyBHcmVlbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ZRUxMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDksICAgICAgICAgIC8qKjwgUnggQnl0ZXMgWWVsbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0dSRUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MCwgICAgICAgICAgLyoqPCBSeCBCeXRlcyBHcmVlbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ZRUxMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTEsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgWWVsbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19VTklDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MiwgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgVW5pY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfTVVMVElDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTMsICAgICAgICAgIC8qKjwgVHggRnJhbWVzIE11bHRpY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfQlJPQURDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTQsICAgICAgICAgIC8qKjwgVHggRnJhbWVzIEJyb2FkY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfVU5JQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTUsICAgICAgICAgIC8qKjwgUnggRnJhbWVzIFVuaWNhc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX01VTFRJQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU2LCAgICAgICAgICAvKio8IFJ4IEZyYW1lcyBNdWx0aWNhc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfQlJPQURDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU3LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIEJyb2FkY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1CRVJfT0ZfUFJPR1JBTU1BQkxFX0NPVU5URVJTICAgICAgICAgICAgICAgICAgICAgPSA1NTgsICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIFByb2dyYW1tYWJsZSBDb3VudGVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTksICAgICAgICAgIC8qKjwgTDJDUCBGcmFtZXMgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYwLCAgICAgICAgICAvKio8IEwyQ1AgT2N0ZXRzIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2MSwgICAgICAgICAgLyoqPCBMMkNQIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjIsICAgICAgICAgIC8qKjwgTDJDUCBPY3RldHMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfRElTQ0FSREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYzLCAgICAgICAgICAvKio8IEwyQ1AgRnJhbWVzIERpc2NhcmRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19ESVNDQVJERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjQsICAgICAgICAgIC8qKjwgTDJDUCBPY3RldHMgRGlzY2FyZGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0wyRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2NSwgICAgICAgICAgLyoqPCBUeCBMMiBFcnJvcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfTDJFUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTY2LCAgICAgICAgICAvKio8IFJ4IEwyIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjksICAgICAgICAgIC8qKjwgUG9ydCBTdGF0IFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NzAsICAgICAgICAgIC8qKjwgTGluayBTdGF0IFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TVVNQRU5EX1JFU1VNRV9BTEFSTV9SRVBPUlRJTkcgICAgICAgICAgICAgICAgICAgICAgPSA3NzEsICAgICAgICAgIC8qKjwgU3VzcGVuZCAvIFJlc3VtZSBBbGFybSBSZXBvcnRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAyNSwgICAgICAgICAvKio8IEtleSBFeHBpcnkgVGltZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDI2LCAgICAgICAgIC8qKjwgRW5jcnlwdCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODEsICAgICAgICAgLyoqPCBQb3J0IEluZ3Jlc3MgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MVUVfRklFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgyLCAgICAgICAgIC8qKjwgTFVFIEZpZWxkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9DVkxBTl9FVEhFUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODMsICAgICAgICAgLyoqPCBBbHQgQyBWTEFOIEV0aGVydHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfU1ZMQU5fRVRIRVJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjg0LCAgICAgICAgIC8qKjwgQWx0IFMgVkxBTiBFdGhlcnR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVBNQ19GT1JXQVJESU5HX1JVTEVfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgID0gMTI4NSwgICAgICAgICAvKio8IElQTUMgRm9yd2FyZGluZyBSdWxlIENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4NiwgICAgICAgICAvKio8IEktVFBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjg3LCAgICAgICAgIC8qKjwgQi1UUElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JDX1JBVEVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzcsICAgICAgICAgLyoqPCBCYyBSYXRlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzgsICAgICAgICAgLyoqPCBFZ3Jlc3MgU2hhcGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTM5LCAgICAgICAgIC8qKjwgSW5ncmVzcyBQb2xpY2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTQwLCAgICAgICAgIC8qKjwgUXVldWUgQ0lSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDEsICAgICAgICAgLyoqPCBGRUMgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9FSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTQyLCAgICAgICAgIC8qKjwgUXVldWUgRUlSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDMsICAgICAgICAgLyoqPCBRdWV1ZSBDb2xvciBNYXJraW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX1JBVEVfTElNSVRFUl9DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICA9IDE1NDQsICAgICAgICAgLyoqPCBRdWV1ZSBSYXRlIExpbWl0ZXIgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NPVVBMSU5HX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDUsICAgICAgICAgLyoqPCBDb3VwbGluZyBGbGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NMT0NLX1RSQU5TUE9SVF9DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTMsICAgICAgICAgLyoqPCBDbG9jayBUcmFuc3BvcnQgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQUJMRV9DTE9DS19UUkFOU1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTQsICAgICAgICAgLyoqPCBFbmFibGUgQ2xvY2sgVHJhbnNwb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RJTUVfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTUsICAgICAgICAgLyoqPCBUaW1lIFRyYW5zZmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BST1BBR0FUSU9OX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTYsICAgICAgICAgLyoqPCBQcm9wYWdhdGlvbiBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JUVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTcsICAgICAgICAgLyoqPCBSVFQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCwgICAgICAgICAvKio8IERBQyBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0ZMQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNDksICAgICAgICAgLyoqPCBEQUMgQ29uZmlndXJhdGlvbiBGbGFncy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfUEFTU1dPUkRfQ0hBTExFTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDUwLCAgICAgICAgIC8qKjwgREFDIFBhc3N3b3JkIENoYWxsZW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9FTkFCTEVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgPSAyMDUxLCAgICAgICAgIC8qKjwgREFDIENvbmZpZ3VyYXRpb24gRW5hYmxlIC8gRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkVSR1lfRUZGSUNJRU5UX0VUSEVSTkVUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgPSAyMDgwLCAgICAgICAgIC8qKjwgRW5lcmd5IEVmZmljaWVudCBFdGhlcm5ldCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFdSX09WRVJfRVRIRVJORVRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4MSwgICAgICAgICAvKio8IFBvd2VyIE92ZXIgRXRoZXJuZXQgU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01FRElBX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwODIsICAgICAgICAgLyoqPCBNZWRpYSBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9QV1JfU0FWSU5HX0NBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1NTM1VSAgICAgICAgLyoqPCBPbnUgUG93ZXIgU2F2aW5nIENhcGFiaWxpdGllcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGU7CisKKy8qKiBEUG9FIExpbmsgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xJTktfU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xJTktfU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFbmFibGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGU7CisKKy8qKiBEUG9FIExlYXJuaW5nIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQVJOSU5HX01PREVfRE1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCA4MDIuMWQgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFSTklOR19NT0RFX01BQ19BQ0NFU1NfQ09OVFJPTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgTUFDIEFjY2VzcyBDb250cm9sIE1vZGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGU7CisKKy8qKiBEUG9FIEJyYW5jaC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2gKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBTdGFuZGFyZCBBdHRyaWJ1dGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFN0YW5kYXJkIEFjdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTQsICAgICAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNSwgICAgICAgICAgLyoqPCBFeHRlbmRlZCBBdHRyaWJ1dGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE2LCAgICAgICAgICAvKio8IFByb2dyYW1tYWJsZSBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNyAgICAgICAgICAgLyoqPCBFeHRlbmRlZCBBY3Rpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaDsKKworLyoqIERQb0UgT2JqZWN0IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05VLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX05FVFdPUktfUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBOZXR3b3JrIFBPTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTGluay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVXNlciBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9NRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTUVQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01DQVNUX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgTG9naWNhbCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0JSSURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBCcmlkZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxICAgICAgICAgICAvKio8IEJyaWRnZSBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZTsKKworLyoqIERQb0UgRW5jcnlwdGlvbiBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9PTkVfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCAxRG93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgMTBEb3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCAxMEJpLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGU7CisKKy8qKiBSdWxlIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBUZXJtaW5hdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBIZWFkZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IENsYXVzZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUmVzdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBFbnRyeS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZTsKKworLyoqIERQb0UgT0FNIGZpZWxkIGNvZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTE9HSUNBTF9MSU5LX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBMb2dpY2FsIExpbmsgSW5kZXguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9MMkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEwyIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTDJTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMMiBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0wyVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTDIgVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0JEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQi1EQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0JTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgQi1TQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lUQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgSS1UYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9TVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFMtVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgQy1WTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTVBMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBNUExTLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfSVBWNFRPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBJUHY0IFRPUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjRUVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgSVB2NCBUVEwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUF9QUk9UT0NPTF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IElQIFByb3RvY29sIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY0U0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IElQdjQgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY2U0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IElQdjYgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY0REEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IElQdjQgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY2REEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IElQdjYgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY2TkVYVF9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IElQdiA2IE5leHQgSGVhZGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfSVBWNkZMT1dfTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBJUHYgNiBGbG93IExhYmVsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfVENQX1VEUF9TT1VSQ0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBUQ1AvVURQIFNvdXJjZSBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfVENQX1VEUF9ERVNUX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCBUQ1AvVURQIERlc3QgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0JUQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgIC8qKjwgQi0gVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBDdXN0b20gMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NVU1RPTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgQ3VzdG9tIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT00yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgICAvKio8IEN1c3RvbSAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBDdXN0b20gMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NVU1RPTTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgQ3VzdG9tIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT001ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgICAgICAgICAvKio8IEN1c3RvbSA1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBDdXN0b20gNi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NVU1RPTTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgICAgIC8qKjwgQ3VzdG9tIDcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTExJRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzICAgICAgICAgICAgLyoqPCBMTElEIFZhbHVlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlOworCisvKiogUnVsZSBPcGVyYXRvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX05FVkVSX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOZXZlciBNYXRjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9FUVVBTF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfT1BFUkFUT1JfTk9UX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE5vdCBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9MRVNTX1RIQU5fT1JfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTGVzcyBUaGFuIE9yIEVxdWFsIFRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0dSRUFURVJfVEhBTl9PUl9FUVVBTF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBHcmVhdGVyIFRoYW4gT3IgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfT1BFUkFUT1JfRVhJU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEV4aXN0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9OT1RfRVhJU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTm90IEV4aXN0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9BTFdBWVNfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgIC8qKjwgQWx3YXlzIE1hdGNoLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvcjsKKworLyoqIERQb0UgT0FNIHJ1bGUgcmVzdWx0IAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX05PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5PUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ09QWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgQ29weS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgRGVsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9JTlNFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBJbnNlcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFJlcGxhY2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IENsZWFyIERlbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfSU5TRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgQ2xlYXIgSW5zZXJ0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQ7CisKKy8qKiBEUG9FIExheWVyIFNlbGVjdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfUFJFQU1CTEVfTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUHJlYW1ibGUvTDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX1BSRUFNQkxFODAyMUFIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFByZWFtYmxlLzgwMi4xYWguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX0VUSEVSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEV0aGVyVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfU1ZMQU5fVEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUy1WTEFOIFRhZ3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX0NWTEFOX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEMtVkxBTiBUYWdzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xBWUVSX1NFTEVDVF9NUExTX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNUExTIFRhZ3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IElQdjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IElQdjYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX0dFTkVSSUNfTDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IEdlbmVyaWMgTDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX1RDUF9VRFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFRDUC9VRFAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX0dFTkVSSUNfTDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAvKio8IEdlbmVyaWMgTDQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdDsKKworLyoqIFRyYWZmaWMgQml0bWFwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcAoreworICAgIEJDTU9MVF9FUE9OX09BTV9UUkFGRklDX0JJVE1BUF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RSQUZGSUNfQklUTUFQX0JST0FEQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IEJyb2FkY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVFJBRkZJQ19CSVRNQVBfTVVMVElDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgTXVsdGljYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UUkFGRklDX0JJVE1BUF9EUkVTRVJWRURfR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgLyoqPCA4MDIuMWQgUmVzZXJ2ZWQgR3JvdXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RSQUZGSUNfQklUTUFQX1VOSUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA4LCAgICAgICAvKio8IFVuaWNhc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RSQUZGSUNfQklUTUFQX0ZMT09ERURfVU5JQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDEwICAgICAgICAvKio8IEZsb29kZWQgVW5pY2FzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwOworCisvKiogUmF0ZSBVbml0cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0cworeworICAgIEJDTU9MVF9FUE9OX09BTV9SQVRFX1VOSVRTX0tCUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBLYnBzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SQVRFX1VOSVRTX0ZSQU1FU19TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBGcmFtZXMvc2Vjb25kLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0czsKKworLyoqIERQb0UgRkVDIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GRUNfTU9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm8gRkVDICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRkVDX01PREVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEZFQyBpcyBPTiBmb3IgYWxsIGxpbmtzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRkVDX01PREVfUEVSX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEZFQyBpcyBzZXR0YWJsZSBwZXIgbGluayAod2l0aCB0aGUgUGVyIExpbmsgbWVzc2FnZSkgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGU7CisKKy8qKiBEUG9FIFBvcnQgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfVU5TUEVDSUZJRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVW5zcGVjaWZpZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VNVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEVNVEEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VTVEJfSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEVTVEItSVAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VTVEJfRFNHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEVTVEItRFNHLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPUlRfVFlQRV9FVEVBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBFVEVBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPUlRfVFlQRV9FU0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBFU0cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VST1VURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IEUgUm91dGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPUlRfVFlQRV9FRFZBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgLyoqPCBFRFZBLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGU7CisKKy8qKiBEcG9lIElwbWMgRm9yd2FyZGluZyBGbGFncy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JUE1DX0ZPUldBUkRJTkdfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lQTUNfRk9SV0FSRElOR19GTEFHU19MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBMTElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lQTUNfRk9SV0FSRElOR19GTEFHU19MMkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBMMiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JUE1DX0ZPUldBUkRJTkdfRkxBR1NfTDJTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgICAgIC8qKjwgTDIgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSVBNQ19GT1JXQVJESU5HX0ZMQUdTX0lQREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA4LCAgICAgICAvKio8IElQIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lQTUNfRk9SV0FSRElOR19GTEFHU19JUFNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAxMCAgICAgICAgLyoqPCBJUCBTQS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzOworCisvKiogRFBvRSBQb3dlciBTYXZpbmcgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPV0VSX1NBVklOR19NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPV0VSX1NBVklOR19NT0RFX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1dFUl9TQVZJTkdfTU9ERV9UUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVHJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPV0VSX1NBVklOR19NT0RFX1RYX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBUeF9UcnguICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlOworCisvKiogRFBvRSBFcnJvciBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgICAgIC8qKjwgTm8gRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IFRvbyBMb25nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfQkFEX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNCwgICAgICAgICAgLyoqPCBCYWQgUGFyYW1zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfTk9fUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAgICAgLyoqPCBObyBSZXNvdXJjZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9TWVNURU1fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgICAgICAgICAvKio8IFN5c3RlbSBCdXN5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfVU5ERVRFUk1JTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgICAgICAgICAgLyoqPCBVbmRldGVybWluZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYxLCAgICAgICAgICAvKio8IFVuc3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfQ09SUlVQVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgICAgICAgICAgLyoqPCBDb3JydXB0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9IV19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYzLCAgICAgICAgICAvKio8IEh3IEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY0ICAgICAgICAgICAvKio8IE92ZXJmbG93LiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlOworCisvKiogRFBvRSBGaWxlIFRyYW5zZmVyIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBGaWxlIFJlYWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEZpbGUgV3JpdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEZpbGUgRGF0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgRmlsZSBBY2suICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlOworCisvKiogRFBvRSBGaWxlIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UWVBFX0JPT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEJvb3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UWVBFX0FQUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFwcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RZUEVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFlQRV9ESUFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBEaWFnLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGU7CisKKy8qKiBEUG9FIEZpbGUgVHJhbnNmZXIgRXJyb3IuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVW5kZWZpbmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBOb3QgRm91bmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9OT19BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE5vIEFjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRnVsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX0lMTEVHQUxfT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgSWxsZWdhbCBPcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX1VOS05PV05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgVW5rbm93biBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX0JBRF9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQmFkIEJsb2NrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBCdXN5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfSU5DT01QQVRJQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBJbmNvbXBhdGlibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgICAgICAgICAvKio8IENvcnJ1cHRlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcjsKKworLyoqIERQb0UgSW5mbyBUTFYgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAvKio8IERQb0UgT0FNIFN1cHBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGU7CisKKy8qKiBEUG9FIE1jYXN0IEN0cmwgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfQ1RSTF9BQ1RJT05fQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEFkZCBvbmUgZW50cnkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9NQ0FTVF9DVFJMX0FDVElPTl9SRU1PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRGVsZXRlIG9uZSBlbnRyeSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX01DQVNUX0NUUkxfQUNUSU9OX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBSZW1vdmUgYWxsIGVudHJpZXMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb247CisKKy8qKiBEcG9lIE1jYXN0IEN0cmwgUmVzcCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfQ1RSTF9SRVNQX0NPREVfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfQ1RSTF9SRVNQX0NPREVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IFN1Y2Nlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlOworCisvKiogRFBvRSBNY2FzdCBSZWcgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX01DQVNUX1JFR19DT0RFX0RFUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBEZXJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX01DQVNUX1JFR19DT0RFX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBSZWdpc3Rlci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGU7CisKKy8qKiBQaHkgdHlwZSAtLSBjb3JyZXNwb25kcyB0byBPYW1QaHlUeXBlIGluIE9hbS5oIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTm9uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX1RFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgMTAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9PTkVfSFVORFJFRF9UNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgICAvKio8IDEwMCBUNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX09ORV9IVU5EUkVEX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qKjwgMTAwIFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9PTkVfSFVORFJFRF9UMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IDEwMCBUMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX09ORV9USE9VU0FORF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgMTAwMCBYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfT05FX1RIT1VTQU5EX1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwLCAgICAgICAgICAgLyoqPCAxMDAwIFQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9URU5fR1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgICAgICAvKio8IDEwRyBYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVEVOX0dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgICAgICAgICAgLyoqPCAxMEcgUi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX1RFTl9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAgICAgICAgIC8qKjwgMTAgVy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX1RFTl9HVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSAgICAgICAgICAgIC8qKjwgMTBHIFQuICovCit9IGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGU7CisKKy8qKiBPQU0gU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1NUQVRFX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZTsKKworLyoqIE1hdSBNZWRpYSBBdmFpbGFibGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgT3RoZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEF2YWlsYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9OT1RfQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTm90IEF2YWlsYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9SRU1PVEVfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgUmVtb3RlIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX0lOVl9TSUdOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJbnYgU2lnbmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX1JFTU9URV9KQUJCRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBSZW1vdGUgSmFiYmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX1JFTU9URV9MSU5LX0xPU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBSZW1vdGUgTGluayBMb3NzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX1JFTU9URV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBSZW1vdGUgVGVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9PRkZMSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgT2ZmbGluZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9BVVRPX05FR19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSAgICAgICAgICAgIC8qKjwgQXV0byBOZWcgRXJyb3IuICovCit9IGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlOworCisvKiogU3RkIEF1dG8gTmVnb2l0YXRpb24gQ2FwYWJpbGl0eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eQoreworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0dMT0JBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBHbG9iYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE90aGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCAxMCBULiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9URkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MiwgICAgICAgICAgLyoqPCAxMCBURkQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX0hVTkRSRURfVDQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgICAvKio8IDEwMCBUNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PTkVfSFVORFJFRF9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgMTAwIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9IVU5EUkVEX1RYRkQgICAgICAgICAgICAgICAgICAgICAgICA9IDI1MiwgICAgICAgICAgLyoqPCAxMDAgVFhGRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9GRFhfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTIsICAgICAgICAgIC8qKjwgRmR4IFBhdXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0ZEWF9BUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxMywgICAgICAgICAgLyoqPCBGZHggQSBQYXVzZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9GRFhfU1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTQsICAgICAgICAgIC8qKjwgRmR4IFMgUGF1c2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfRkRYX0JQQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE1LCAgICAgICAgICAvKio8IEZkeCBCIFBhdXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9IVU5EUkVEX1QyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCAxMDAgVDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX0hVTkRSRURfVDJGRCAgICAgICAgICAgICAgICAgICAgICAgID0gMzIyLCAgICAgICAgICAvKio8IDEwMCBUMiBGRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PTkVfVEhPVVNBTkRfWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgMTAwMCBYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9USE9VU0FORF9YRkQgICAgICAgICAgICAgICAgICAgICAgICA9IDM2MiwgICAgICAgICAgLyoqPCAxMDAwIFhGRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PTkVfVEhPVVNBTkRfVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAgICAgICAgIC8qKjwgMTAwMCBULiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9USE9VU0FORF9URkQgICAgICAgICAgICAgICAgICAgICAgICA9IDQwMiwgICAgICAgICAgLyoqPCAxMDAwIFRGRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9SRU1fRkFVTFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgUmVtIEZhdWx0IDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfUkVNX0ZBVUxUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcyLCAgICAgICAgICAvKio8IFJlbSBGYXVsdCAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4LCAgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfTFg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODEsICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIEwgWDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgICAgICAvKio8IDEwIEcgQmFzZSBSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5MSwgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgRVIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX0xSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDkyLCAgICAgICAgICAvKio8IDEwIEcgQmFzZSBMUi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTMsICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIFNSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgVy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDEsICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIEVXLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9MVyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwMiwgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgTFcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX1NXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAzLCAgICAgICAgICAvKio8IDEwIEcgQmFzZSBTVy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9JU09fRVRIRVJORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDI5ICAgICAgICAgIC8qKjwgSXNvIEV0aGVybmV0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eTsKKworLyoqIE1BQyBEdXBsZXggU3RhdHVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX09BTV9NQUNfRFVQTEVYX1NUQVRVU19PQU1fTUFDX0RVUExFWF9IQUxGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPQU0gTUFDIER1cGxleCBIYWxmLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQUNfRFVQTEVYX1NUQVRVU19PQU1fTUFDX0RVUExFWF9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBPQU0gTUFDIER1cGxleCBGdWxsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQUNfRFVQTEVYX1NUQVRVU19PQU1fTUFDX0RVUExFWF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBPQU0gTUFDIER1cGxleCBVbmtub3duLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXM7CisKKy8qKiBGRUMgU3VwcG9ydC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRkVDX1NVUFBPUlRfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRkVDX1NVUFBPUlRfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GRUNfU1VQUE9SVF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQ7CisKKy8qKiBTdGQgRkVDIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfRkVDX01PREVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfRkVDX01PREVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBFbmFibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfRkVDX01PREVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZTsKKworLyoqIERQb0UgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgR2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEdldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgU2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgRHluYW1pYyBJUCBNdWx0aWNhc3QgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTWNhc3QgUmVnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBNY2FzdCBSZWcgUmVzcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBGaWxlIFRyYW5zZmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBEeW5hbWljIElQIE11bHRpY2FzdCBDb250cm9sIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBTdGF0aWMgSVAgTXVsdGljYXN0IENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIgICAgICAgICAgICAvKio8IFN0YXRpYyBJUCBNdWx0aWNhc3QgQ29udHJvbCBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlOworCisvKiogRFBvRSBWZXJzaW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX0RQT0UxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRFBvRSAxLjAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfVkVSU0lPTl9QUkVfRFBPRV9XSVRIT1VUX0NFUlRJRklDQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFByZS1EUG9FIFdpdGhvdXQgQ2VydGlmaWNhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfVkVSU0lPTl9QUkVfRFBPRV9XSVRIX0NFUlRJRklDQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFByZS1EUG9FIFdpdGggQ2VydGlmaWNhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfVkVSU0lPTl9EUE9FMTBJMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IERQb0UgMS4wIEkwNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX0RQT0UxMEkwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgRFBvRSAxLjAgSTA1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1ZFUlNJT05fRFBPRTIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyICAgICAgICAgICAgLyoqPCBEUG9FIDIuMC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbjsKKworLyoqIEVBUCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgIC8qKjwgRmFpbHVyZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlOworCisvKiogVExTIFN1YnR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19TVUJUWVBFX0FVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMgICAgICAgICAgICAvKio8IEF1dGhlbnRpY2F0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGU7CisKKy8qKiBUTFMgRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19GTEFHU19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDIwLCAgICAgICAvKio8IFN0YXJ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfRkxBR1NfTU9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA0MCwgICAgICAgLyoqPCBNb3JlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfRkxBR1NfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA4MCAgICAgICAgLyoqPCBMZW5ndGguICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3M7CisKKy8qKiBUTFMgQ29udGVudCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQ0hBTkdFX0NJUEhFUl9TUEVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IENoYW5nZSBDaXBoZXIgU3BlYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgIC8qKjwgQWxlcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgICAgICAvKio8IEhhbmRzaGFrZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMyAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gRGF0YS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGU7CisKKy8qKiBUTFMgSGFuZHNoYWtlIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfSEVMTE9fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBIZWxsbyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0hFTExPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBDbGllbnQgSGVsbG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNlcnZlciBIZWxsby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgQ2VydGlmaWNhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfS0VZX0VYQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IFNlcnZlciBLZXkgRXhjaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IENlcnRpZmljYXRlIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE9fRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IFNlcnZlciBIZWxsbyBEb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfVkVSSUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBDZXJ0aWZpY2F0ZSBWZXJpZnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfS0VZX0VYQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IENsaWVudCBLZXkgRXhjaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9GSU5JU0hFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAvKio8IEZpbmlzaGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlOworCisvKiogVExTIENpcGhlcnN1aXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19OVUxMX1dJVEhfTlVMTF9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVExTIE51bGwgV2l0aCBOdWxsIE51bGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DSVBIRVJTVUlURV9UTFNfUlNBX1dJVEhfTlVMTF9NRDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFRMUyBSU0EgV2l0aCBOdWxsIE1ENS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19SU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVExTIFJTQSBXaXRoIE51bGwgU0hBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIX1JDNDEyOE1ENSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggUkM0IDEyOCBNRDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DSVBIRVJTVUlURV9UTFNfUlNBX1dJVEhfUkM0MTI4U0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFRMUyBSU0EgV2l0aCBSQzQgMTI4IFNIQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19SU0FfV0lUSF9JREVBX0NCQ19TSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgVExTIFJTQSBXaXRoIElERUEgQ0JDIFNIQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19SU0FfV0lUSF9ERVNfQ0JDX1NIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgVExTIFJTQSBXaXRoIERFUyBDQkMgU0hBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIM0RFU19FREVfQ0JDX1NIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggM0RFUyBFREUgQ0JDIFNIQS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZTsKKworLyoqIFRMUyBDb21wcmVzc2lvbiBNZXRob2QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTVBSRVNTSU9OX01FVEhPRF9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgIC8qKjwgTnVsbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2Q7CisKKy8qKiBUTFMgQ2VydGlmaWNhdGUgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NFUlRJRklDQVRFX1RZUEVfUlNBX1NJR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUlNBIFNpZ24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX0RTU19TSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERTUyBTaWduLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0VSVElGSUNBVEVfVFlQRV9SU0FfRklYRURfREggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBSU0EgRml4ZWQgREguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX0RTU19GSVhFRF9ESCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IERTUyBGaXhlZCBESC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NFUlRJRklDQVRFX1RZUEVfUlNBX0VQSEVNRVJBTF9ESFJFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgUlNBIEVwaGVtZXJhbCBESCAoUkVTRVJWRUQpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0VSVElGSUNBVEVfVFlQRV9EU1NfRVBFSEVNRVJBTF9ESFJFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBEU1MgRXBlaGVtZXJhbCBESCAoUkVTRVJWRUQpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0VSVElGSUNBVEVfVFlQRV9GT1JURVpaQV9ETVNfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwICAgICAgICAgICAgLyoqPCBGb3J0ZXp6YSBETVMgKFJFU0VSVkVEKS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlOworCisvKiogRUFQT0wgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBQYWNrZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFN0YXJ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0xPR09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMb2dvZmYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEtleS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9BU0ZfQUxFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQVNGIEFsZXJ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX01LQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUgICAgICAgICAgICAgLyoqPCBNS0EuICovCit9IGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlOworCisvKiogRUFQT0wgVmVyc2lvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9WRVJTSU9OX1ZFUlNJT04yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBWZXJzaW9uIDIuICovCit9IGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uOworCisvKiogRVBPQyBDTUMgU3RhdCBJbmRleC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleAoreworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9VUF9PS19TRE1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBUcmFuc21pdCBwYWNrZXQgZnJvbSBTRE0gdXBzdHJlYW0gd2l0aCBnb29kIHRpbWVzdGFtcDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9UQk1fVVBfT0tfQ01JX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVHJhbnNtaXQgcGFja2V0IGZyb20gQ01JIHVwc3RyZWFtIHdpdGggZ29vZCB0aW1lc3RhbXA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX1VQX0RST1BQRURfU0RNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFN0YXRpc3RpYyBmb3IgZHJvcHBpbmcgZnJhbWUgZHVlIHRvIHRpbWVzdGFtcCBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9VUF9EUk9QUEVEX0NNSV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgZm9yIGRyb3BwaW5nIGZyYW1lIGR1ZSB0byB0aW1lc3RhbXAgZXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9UQk1fRE9XTl9PS19GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU3RhdGlzdGljIHJlY2lldmluZyBmcmFtZSBkb3duc3RyZWFtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX0RPV05fRFJPUFBFRF9DUkM4RlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBDUkMgOCBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9ET1dOX0RST1BQRURfTElORUNPREVfRlJBTUVTICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGJlY2F1c2Ugb2YgbGluZSBjb2RpbmcgZXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9UQk1fRE9XTl9EUk9QUEVEX01BWFNJWkVfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgRHJvcCBmcmFtZSBmb3IgYmVpbmcgdG9vIGxvbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9HRklfRE9XTl9USU1FX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgVmFsaWQgVGltZXN0YW1wIFVwZGF0ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9ET1dOX0dSQU5UX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBWYWxpZCBHcmFudCBSZWNlaXZlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9ET1dOX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0dBVEVfRElGX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8ICAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9HUlRfUEhZX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0dSVF9ESVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9HRklfR1JUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9HUlRfVFVOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgdGhhdCBjb3VudHMgZGlzY292ZXJ5IGdhdGVzIGNvbnZlcnRlZCB0byB0dW5pbmcgZ3JhbnRzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfU0RJX1JYX1BBQ0tFVF9PVkVSX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IFRoaXMgaW5kaWNhdGVzIGFuIGRvd24gYnVyc3QgaGVhZGVyIHdpdGggYSBnb29kIENSQyAzMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9TRElfRE9XTl9DUkMzMkRST1BQRURfSEVBREVSUyAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgVGhpcyBpbmRpY2F0ZXMgYW4gZG93biBidXJzdCBoZWFkZXIgd2l0aCBhIGdvb2QgQ1JDIDMyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1NESV9ET1dOX09LX0hFQURFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBDb3VudCBnb29kIGJ1cnN0IGhlYWRlcnMgPFN0YXRJbmZvICBJc01pcnJvcj0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfRkVDX1VQX0JBRF9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9GRUNfVVBfQ09SUkVDVEVEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZFQ19VUF9PS19CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfRkVDX1VQX0VSUl9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9GRUNfVVBfRVJSX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RFRl9VUF9DUkMzMkZSQU1FU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBXZSBjaGVjayB0aGUgQ1JDIDMyIG9uIHVwc3RyZWFtIGZyYW1lcy4gVGhpcyBpbmRpY2F0ZXMgYSBmcmFtZSBkaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RFRl9VUF9PS19GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZ29vZCBwYWNrZXRzIGluIHRoZSB1cHN0cmVhbSByeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RFRl9VUF9DUkM4RlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY3JjLTggZXJyb3JzIGluIHRoZSB1cHN0cmVhbSByeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0NNSV9VUF9EUk9QUEVEX01BWFNJWkVfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGZvciBiZWluZyB0b28gbG9uZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0NNSV9VUF9PS19GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgcmVjaWV2aW5nIGZyYW1lIHVwc3RyZWFtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfQ01JX1VQX0RST1BQRURfQ1JDOEZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBDUkMgOCBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0NNSV9VUF9EUk9QUEVEX0xJTkVDT0RFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGJlY2F1c2Ugb2YgbGluZSBjb2RpbmcgZXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9ERklfRE9XTl9PS19NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgICAgIC8qKjwgRW5xdWV1ZWQgTVBDUCBmcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RGSV9ET1dOX09LX09BTV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCBFbnF1ZXVlZCBPYW0gRnJhbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9ERklfRE9XTl9PS19EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgRW5xdWV1ZWQgRGF0YSBmcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RGSV9ET1dOX0RST1BQRURfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDM0LCAgICAgICAgICAgLyoqPCBPdmVycnVuIE1QQ1AgZmlmbyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RGSV9ET1dOX0RST1BQRURfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgICAgICAgICAgLyoqPCBPdmVycnVuIE9hbSBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREZJX0RPV05fRFJPUFBFRF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgICAgICAgICAvKio8IE92ZXJydW4gZGF0YSBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfU0RNX0RPV05fU1lNQk9MX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcsICAgICAgICAgICAvKio8IEhvdyBtYW55IHN5bWJvbHMgaGF2ZSBnb25lIGJ5ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfU0VTX0RPV05fU1lNQk9MX0NPTExFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzgsICAgICAgICAgICAvKio8IEhvdyBtYW55IHN5bWJvbHMgaGF2ZSB3ZSBjb2xsZWN0ZWQgc3RhdHMgb24gPyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1NFU19ET1dOX1NZTUJPTF9CSVRfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5LCAgICAgICAgICAgLyoqPCBDb3VudCBvZiBiaXQgZXJyb3JzIGluIGNvbGxlY3RlZCBzeW1ib2xzLiBVc2VkIHRvIHZlcmlmeSBjb2xsZWN0b3Igd29ya2luZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZSQV9HUkFOVF9EUk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IkZhbHNlIiBJc1JhdGU9IkZhbHNlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9GUkFfUEtUX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSAgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJGYWxzZSIgSXNSYXRlPSJGYWxzZSI+ICovCit9IGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4OworCisvKiogRVBPQyBDTlUgU3RhdCBJbmRleC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleAoreworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0VNSV9VUF9EUk9QUEVEX0xJTkVDT0RFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGJlY2F1c2Ugb2YgbGluZSBjb2RpbmcgZXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9FTUlfVVBfRFJPUFBFRF9DUkM4RlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRHJvcCBmcmFtZSBiZWNhdXNlIG9mIENSQyA4IGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRU1JX1VQX09LX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFVwc3RyZWFtIGdvb2QgcGFja2V0IGNvdW50ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRU1JX1VQX0RST1BQRURfTUFYU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE1heCBGcmFtZSBTaXplIFBhY2tldCBEcm9wICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX0RPV05fT0FNX1RJTUVfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEdwciBPYW0gVGltZSBQZWFrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX0RPV05fTVBDUF9USU1FX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEdwciBNcGNwIFRpbWUgUGVhayAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9ET1dOX0RBVEFfVElNRV9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBHcHIgRGF0YSBUaW1lIFBlYWsgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfR1JUX1BIWV9ESVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9HUlRfVFVOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX0dSVF9ESVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfR1JUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9NUENQX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBEaWZmZXJlbmNlIGJldHdlZW4gbG9jYWwgTVBDUCB0aW1lIHJlZmVyZW5jZSBhbmQgdXBkYXRlIHRvIHRoZSBPTlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfR0FURV9ESUZGX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgRGlmZmVyZW5jZSBiZXR3ZWVuIGxvY2FsIE1QQ1AgdGltZSByZWZlcmVuY2UgYW5kIHVwZGF0ZSB0byB0aGUgT05VICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfU0RJX1JYX05PX1ZMRF9DTlRfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IFNkaVJ4Tm9WbGRDbnRQZWFrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1NESV9SWF9QQUNLRVRfT1ZFUl9EUk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfU0RJX0RPV05fQ1JDMzJEUk9QUEVEX0hFQURFUlMgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IFRoaXMgaW5kaWNhdGVzIGFuIGRvd24gYnVyc3QgaGVhZGVyIHdpdGggYSBnb29kIENSQyAzMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRElfRE9XTl9PS19IRUFERVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgQ291bnQgZ29vZCBidXJzdCBoZWFkZXJzIDxTdGF0SW5mbyAgSXNNaXJyb3I9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0ZFQ19ET1dOX0JBRF9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRkVDX0RPV05fQ09SUkVDVEVEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9GRUNfRE9XTl9PS19CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0ZFQ19ET1dOX0VSUl9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRkVDX0RPV05fRVJSX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERUZfRE9XTl9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGdvb2QgcGFja2V0cyBpbiB0aGUgdXBzdHJlYW0gcnggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERUZfRE9XTl9DUkM4RlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNyYy04IGVycm9ycyBpbiB0aGUgdXBzdHJlYW0gcnggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERUZfRE9XTl9DUkMzMkZSQU1FU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qKjwgQ1JDIDMyIEVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfUlBSX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IFJwckZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRE1fRE9XTl9TWU1CT0xfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIGdvbmUgYnkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRVNfRE9XTl9TWU1CT0xfQ09MTEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIHdlIGNvbGxlY3RlZCBzdGF0cyBvbiA/ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfU0VTX0RPV05fU1lNQk9MX0JJVF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IENvdW50IG9mIGJpdCBlcnJvcnMgaW4gY29sbGVjdGVkIHN5bWJvbHMuIFVzZWQgdG8gdmVyaWZ5IGNvbGxlY3RvciB3b3JraW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfREZPX0RPV05fT0tfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgICAgICAgICAvKio8IEVucXVldWVkIE1QQ1AgZnJhbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERk9fRE9XTl9PS19PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgIC8qKjwgRW5xdWV1ZWQgT2FtIGZyYW1lICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfREZPX0RPV05fT0tfREFUQV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgICAgICAgICAvKio8IEVucXVldWVkIGRhdGEgZnJhbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERk9fRE9XTl9EUk9QUEVEX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgT3ZlcnJ1biBNUENQIGZpZm8gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERk9fRE9XTl9EUk9QUEVEX09BTV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgT3ZlcnJ1biBPYW0gZmlmbyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RGT19ET1dOX0RST1BQRURfREFUQV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDM0LCAgICAgICAgICAgLyoqPCBPdmVycnVuIGRhdGEgZmlmbyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0ZSQV9HUkFOVF9EUk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IkZhbHNlIiBJc1JhdGU9IkZhbHNlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9GUkFfUEtUX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJGYWxzZSIgSXNSYXRlPSJGYWxzZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfVUZPX1VQX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iRmFsc2UiIElzUmF0ZT0iRmFsc2UiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1VGT19VUF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4ICAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IkZhbHNlIiBJc1JhdGU9IkZhbHNlIj4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXg7CisKKy8qKiBFUE9DIFNETSAyNTAgU3RhdCBJbmRleC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9TTElERV9ESUZGX0NOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFNsaWRlRGlmZkNudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0RBQ19DTElQX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRGFjQ2xpcEkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EQUNfQ0xJUF9RICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERhY0NsaXBRLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfRDJBX0NMS19FUlJfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBEMmFDbGtFcnJBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfRDJBX0NMS19FUlJfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBEMmFDbGtFcnJCLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfUlhfREVNX1NZTkNfREVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBJbmNyZW1lbnRzIHdoZW4gdGhlIFNETSBzZWVzIGEgc3luYyBwdWxzZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfUlhfREVNX05PVDRTWU5DX0RFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJbmNyZW1lbnRzIHdoZW4gdGhlIFNETSBzZWVzIGEgc3luYywgYnV0IGl0IGlzIG5vdCBmb2xsb3dlZCBieSA0IG90aGVyIHN5bmNzIHdpdGhpbiAzMiB1cyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfSkNQTExfVU5MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBUaGUgSkMgUExMIGxvY2sgc2lnbmFsIHRyYW5zaXRpb25lZCBmcm9tIGhpZ2ggdG8gbG93ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9SRlBMTF9VTkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFRoZSBSRiBQTEwgbG9jayBzaWduYWwgdHJhbnNpdGlvbmVkIGZyb20gaGlnaCB0byBsb3cgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1NETV9SWF9CVVJTVF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgVGhlIFJGIFBMTCBsb2NrIHNpZ25hbCB0cmFuc2l0aW9uZWQgZnJvbSBoaWdoIHRvIGxvdyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0RNX1RYX0JVUlNUX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBUaGUgUkYgUExMIGxvY2sgc2lnbmFsIHRyYW5zaXRpb25lZCBmcm9tIGhpZ2ggdG8gbG93ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9BMkRfTUlOX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0EyRF9NQVhfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfRDJBX0lNQVhfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfSU1JTl9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0QyQV9RTUFYX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfRDJBX1FNSU5fUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9RRVNfRE9XTl9TWU1CT0xfQ09MTEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IEhvdyBtYW55IHN5bWJvbHMgaGF2ZSB3ZSBjb2xsZWN0ZWQgc3RhdHMgb24gPyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfTUlGX1RYX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfUlhfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX01JRl9CVVJTVF9UWVBFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfTUlGX0JVUlNUX1RZUEVfRElTQ09WRVJZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfQlVSU1RfVFlQRV9UVU5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX01JRl9CVVJTVF9UWVBFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfTUlGX0JVUlNUX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9TTElERV9MT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IFNsaWRlIHdhcyBnb29kLCBidXQgdGhlbiBwcmVhbWJsZSBiYWQgaGFwcGVuZWQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1NMSURFX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgV2hpbGUgd2FpdGluZyBmb3Igc3luY3Mgb24gdGhlIG5leHQgU0YsIGRpZG4ndCBzZWUgdGhlbSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0xJREVfU1RFQURZX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCB3YXNuJ3QgYWJsZSB0byBnZXQgcnggc2xpZGUgZ29vZCBpbiByeCBzbGlkZSB3YWl0IHRpbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1NMSURFX1NZTkNfV0FJVF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCAgICAgICAgICAgIC8qKjwgV2hlbiB3YWl0aW5nIGZvciB0aGUgbmV4dCBzeW5jIHB1bHNlICh3aXRoaW4gYSBmZXcgc3ltYm9scykgd2UgZGlkbid0IHNlZSBpdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleDsKKworLyoqIEVQT0MgU3RhdCBHYXRoZXIgTW9kZXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TVEFUX0dBVEhFUl9NT0RFU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NUQVRfR0FUSEVSX01PREVTX0dFVF9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBHZXQgQ291bnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TVEFUX0dBVEhFUl9NT0RFU19DTEVBUl9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgQ2xlYXIgQ291bnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TVEFUX0dBVEhFUl9NT0RFU19HRVRfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQgICAgICAgIC8qKjwgR2V0IFJhdGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzOworCisvKiogUHJvdG9jb2wgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBaZXJvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNDgsICAgICAgICAgLyoqPCBJUHY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0FSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNTQsICAgICAgICAgLyoqPCBBUlAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQ1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMwMjRVLCAgICAgICAvKio8IEMtVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JUFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDUyNVUsICAgICAgIC8qKjwgSVB2Ni4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDgyNFUsICAgICAgIC8qKjwgTVBDUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDgyNVUsICAgICAgIC8qKjwgU2xvdyBQcm90b2NvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDk4NFUsICAgICAgIC8qKjwgUy1WTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0VBUE9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0OTU4VSwgICAgICAgLyoqPCBFQVBPTC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTA0N1UsICAgICAgIC8qKjwgSS1UYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfTE9PUEJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzY4NjRVICAgICAgICAvKio8IExvb3BiYWNrLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZTsKKworLyoqIFNsb3cgUHJvdG9jb2wgU3VidHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQUNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExBQ1AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExBTVAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9PQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE9BTS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgT3JnYW5pemF0aW9uIFNwZWNpZmljLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlOworCisvKiogT0FNIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTElOS19GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBMaW5rIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfRFlJTkdfR0FTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBEeWluZyBHYXNwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfQ1JJVElDQUxfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgLyoqPCBDcml0aWNhbCBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgTG9jYWwgRXZhbHVhdGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMTAsICAgICAgIC8qKjwgTG9jYWwgU3RhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAyMCwgICAgICAgLyoqPCBSZW1vdGUgRXZhbHVhdGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9TVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwNDAgICAgICAgIC8qKjwgUmVtb3RlIFN0YWJsZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnczsKKworLyoqIE9BTSBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSW5mb3JtYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEV2ZW50IE5vdGlmaWNhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVmFyaWFibGUgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVmFyaWFibGUgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfTE9PUEJBQ0tfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IExvb3BiYWNrIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU0ICAgICAgICAgICAvKio8IE9yZ2FuaXphdGlvbiBTcGVjaWZpYy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGU7CisKKy8qKiBJbmZvcm1hdGlvbiBUTFYgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfTE9DQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExvY2FsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX1JFTU9URSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBSZW1vdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU0ICAgICAgICAgICAvKio8IE9yZ2FuaXphdGlvbiBTcGVjaWZpYy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGU7CisKKy8qKiBUZWsgSW5mbyBUTFYgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTGluay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9BTEFSTV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBBbGFybSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBFeHRlbnNpb24gU3VwcG9ydC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlOworCisvKiogVGVrIFJlcG9ydCBNb2Rlcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcworeworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfU0lNUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwLCAgICAgICAvKio8IFVwIHRvIDQgcXVldWUgc2V0cywgMSBwcmlvcml0eSB2YWx1ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVTX1RFS05PVlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBVcCB0byA0IHF1ZXVlIHNldHMsIDEgcHJpb3JpdHkgdmFsdWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19DVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgMSBxdWV1ZSBzZXQsIDggcHJpb3JpdHkgdmFsdWVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfTlRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IE5UVCAoMiBxdWV1ZSBzZXRzLCByZXZlcnNlZCwgc3VidHJhY3QgZ3JhbnRlZCBkYXRhKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVTX01BTlVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwOCwgICAgICAgLyoqPCBBcyBzcGVjaWZpZWQgaW4gT05VIHBlcnNvbmFsaXR5ICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVERNX05PX0ZPUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDEwICAgICAgICAvKio8IFRETSBObyBGb3JjZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXM7CisKKy8qKiBMb2NhbC9SZW1vdGUgSW5mbyBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19TVEFURV9QQVJTRVJfQUNUSU9OMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBQYXJzZXIgQWN0aW9uIDAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX1NUQVRFX1BBUlNFUl9BQ1RJT04xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IFBhcnNlciBBY3Rpb24gMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfTVVMVElQTEVYRVJfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQgICAgICAgIC8qKjwgTXVsdGlwbGV4ZXIgQWN0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGU7CisKKy8qKiBMb2NhbC9SZW1vdGUgSW5mbyBDb25maWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZworeworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19DT05GSUdfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19PQU1fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IE9BTSBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19DT05GSUdfVU5JRElSRUNUSU9OQUxfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBVbmlkaXJlY3Rpb25hbCBTdXBwb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19DT05GSUdfT0FNX1JFTU9URV9MT09QQkFDS19TVVBQT1JUICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgLyoqPCBPQU0gUmVtb3RlIExvb3BiYWNrIFN1cHBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19MSU5LX0VWRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA4LCAgICAgICAvKio8IExpbmsgRXZlbnRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19DT05GSUdfVkFSSUFCTEVfUkVUUklFVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAxMCAgICAgICAgLyoqPCBWYXJpYWJsZSBSZXRyaWV2YWwuICovCit9IGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWc7CisKKy8qKiBMaW5rIEV2ZW50IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX1NZTUJPTF9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEVycm9yZWQgU3ltYm9sIFBlcmlvZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRXJyb3JlZCBGcmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfUEVSSU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRXJyb3JlZCBGcmFtZSBQZXJpb2QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1NFQ09ORFNfU1VNTUFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEVycm9yZWQgRnJhbWUgU2Vjb25kcyBTdW1tYXJ5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NCAgICAgICAgICAgLyoqPCBPcmdhbml6YXRpb24gU3BlY2lmaWMuICovCit9IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGU7CisKKy8qKiBUZWsgQWxhcm0gQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgTGluayBGYXVsdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9TU19PRl9TSUdOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgTG9zcyBvZiBTaWduYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RYX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFR4IEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RSQU5TTUlUX0RFR1JBREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFRyYW5zbWl0IERlZ3JhZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1FVRVVFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFF1ZXVlIE92ZXJmbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MRUFSTl9UQUJMRV9PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBMZWFybiBUYWJsZSBPdmVyZmxvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxPV19DT05UUk9MX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgRmxvdyBDb250cm9sIFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFUE9SVF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgICAvKio8IFJlcG9ydCBGYWlsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HQVRFX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBHYXRlIFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09BTV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IE9BTSBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBLZXkgRXhjaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVE9fTkVHX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IEF1dG8gTmVnIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fTElOS19GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IEdwaW8gTGluayBGYXVsdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9PUEJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgTG9vcGJhY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgICAvKio8IFBvcnQgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RZSU5HX0dBU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgICAgICAgICAvKio8IER5aW5nIEdhc3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgICAgICAvKio8IFBvd2VyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0RZSU5HX0dBU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgICAgICAgICAgLyoqPCBHcGlvIER5aW5nIEdhc3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NSSVRJQ0FMX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTYsICAgICAgICAgICAvKio8IENyaXRpY2FsIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk3LCAgICAgICAgICAgLyoqPCBSZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19DUklUSUNBTF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OCwgICAgICAgICAgIC8qKjwgR3BpbyBDcml0aWNhbCBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1lTVEVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgICAgIC8qKjwgU3lzdGVtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAgICAgLyoqPCBUZW1wZXJhdHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgICAgIC8qKjwgR3BpbyBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUSF9VTkFWQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzEsICAgICAgICAgIC8qKjwgQXV0aCBVbmF2YWlsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFUX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNCwgICAgICAgICAgLyoqPCBTdGF0IEFsYXJtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTEFTSF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAgICAgLyoqPCBGbGFzaCBCdXN5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFOREJZX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNiwgICAgICAgICAgLyoqPCBTdGFuZGJ5IExvcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUFJPVF9TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzcsICAgICAgICAgIC8qKjwgUHJvdCBTd2l0Y2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ0LCAgICAgICAgICAvKio8IEN0YyBBbGFybS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19PQU1fRElTQ19DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDUsICAgICAgICAgIC8qKjwgTGluayBPQU0gRGlzYyBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfSVBOX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDYsICAgICAgICAgIC8qKjwgSXBuIExvcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRElBR19MT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDcsICAgICAgICAgIC8qKjwgRGlhZyBMb2FkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9CT09UX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgICAgICAgICAgLyoqPCBCb290IEludmFsaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc2LCAgICAgICAgICAvKio8IE9OVSBSZWFkeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1BPTl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzcsICAgICAgICAgIC8qKjwgT05VIFBvbiBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfRElTQ09WRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OCwgICAgICAgICAgLyoqPCBDdGMgRGlzY292ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xBU0VSX0FMV0FZU19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5LCAgICAgICAgICAvKio8IExhc2VyIEFsd2F5cyBPbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODQsICAgICAgICAgIC8qKjwgTGluayBSZWcgU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg1LCAgICAgICAgICAvKio8IExpbmsgUmVnIFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg2LCAgICAgICAgICAvKio8IExpbmsgUmVnIEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZBTl9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg5LCAgICAgICAgICAvKio8IEZhbiBGYXVsdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTAsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFRlbXBlcmF0dXJlIEhpZ2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9URU1QX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkxLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBUZW1wZXJhdHVyZSBMb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkyLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBWY2MgSGlnaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTMsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFZjYyBMb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk0LCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBUeCBCaWFzIEhpZ2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk1LCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBUeCBCaWFzIExvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTYsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IFBvd2VyIEhpZ2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk3LCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBUeCBQb3dlciBMb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk4LCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBSeCBQb3dlciBIaWdoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5OSAgICAgICAgICAgLyoqPCBQb3dlciBNb24gUnggUG93ZXIgTG93LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGU7CisKKy8qKiBUZWsgQWxhcm0gQ29udGV4dC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPTlRFWFRfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05VLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09OVEVYVF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09OVEVYVF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09OVEVYVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBRdWV1ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0OworCisvKiogVmFyIEJyYW5jaC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaAoreworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE9iamVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgUGFja2FnZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTmFtZSBCaW5kaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2g7CisKKy8qKiBWYXIgTGVhZiBPYmplY3QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9PQkpFQ1RfTUFDX0VOVElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBNQUMgRW50aXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9PQkpFQ1RfUEhZX0VOVElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBQSFkgRW50aXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9PQkpFQ1RfTUFDX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDggICAgICAgICAgICAgLyoqPCBNQUMgQ3RybC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdDsKKworLyoqIFZhciBMZWFmIFBhY2thZ2UuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9JTExFR0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSWxsZWdhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9NQUNfTUFOREFUT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTUFDIE1hbmRhdG9yeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9NQUNfUkVDT01NRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTUFDIFJlY29tbWVuZGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19PUFRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBNQUMgT3B0aW9uYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfTUFDX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IE1BQyBBcnJheS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9NQUNfRVhDRVNTSVZFX0RFRkVSUkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTUFDIEV4Y2Vzc2l2ZSBEZWZlcnJhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9QSFlfUkVDT01NRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgUEhZIFJlY29tbWVuZGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1BIWV9NVUxUSVBMRV9QSFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBQSFkgTXVsdGlwbGUgUEhZLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1BIWTEwME1QQlNfTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBQSFkgMTAwIE1wYnMgTW9uaXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9SRVBFQVRFUl9QRVJGX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgUmVwZWF0ZXIgUGVyZiBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1BPUlRfUEVSRl9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBQb3J0IFBlcmYgTW9uaXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9QT1JUX0FERFJfVFJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgUG9ydCBBZGRyIFRyYWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BVV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBNQVUgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9NRURJQV9MT1dfVFJBQ0tJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgTWVkaWEgTG93IFRyYWNraW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX0JST0FEQkFORF9NQVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBCcm9hZGJhbmQgTUFVLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19DT05UUk9MX1JFQ09NTUVOREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3ICAgICAgICAgICAgLyoqPCBNQUMgQ29udHJvbCBSZWNvbW1lbmRlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2U7CisKKy8qKiBWYXIgTGVhZiBOYW1lIEJpbmRpbmcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZworeworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFDX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBNQUMgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX01BQ19NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTUFDIE1vbml0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19QSFlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFBIWSBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUEhZX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBQSFkgTW9uaXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX01BQ19DVFJMX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgTUFDIEN0cmwgU3lzdGVtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFDX0NUUkxfTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBNQUMgQ3RybCBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUkVQRUFURVJfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBSZXBlYXRlciBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUkVQRUFURVJfTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBSZXBlYXRlciBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfR1JPVVBfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBHcm91cCBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUE9SVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBQb3J0IE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19NQVVfUlBUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IE1BVSBSZXBvcnQgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX01BVV9EVEVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgTUFVIERURSBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUlNSQ19NQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBSU1JDIE1BQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX1JTUkNfUkVQRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgUlNSQyBSZXBlYXRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX1JTUkNfTUFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCAgICAgICAgICAgIC8qKjwgUlNSQyBNQVUuICovCit9IGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmc7CisKKy8qKiBSZW1vdGUgTG9vcGJhY2sgQ29tbWFuZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUkVNT1RFX0xPT1BCQUNLX0NPTU1BTkRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SRU1PVEVfTE9PUEJBQ0tfQ09NTUFORF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBEaXNhYmxlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQ7CisKKy8qKiBUZWsgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEdldCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBHZXQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFNldCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTZXQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgUmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBSZWdpc3RlciBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBGaWxlIFJlYWQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgRmlsZSBXcml0ZSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBGaWxlIERhdGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IEZpbGUgQWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBJwrJDIChCU0MpIFJlYWQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgScKyQyAoQlNDKSBSZWFkIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBJwrJDIChCU0MpIFdyaXRlIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IEnCskMgKEJTQykgV3JpdGUgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFVuQWNrZWQgQWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0xPT1BfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4ICAgICAgICAgICAgLyoqPCBMb29wIERldGVjdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGU7CisKKy8qKiBUZWsgQnJhbmNoLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBQYWNrYWdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBOYW1lIEJpbmRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5ICAgICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaDsKKworLyoqIFRlayBPYmplY3QgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9MT0dJQ0FMX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExvZ2ljYWwgTGluay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1FVRVVFX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUXVldWUgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0FMTF9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQWxsIFF1ZXVlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX05FVFdPUktfUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTmV0d29yayBQT04uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9VU0VSX1BPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFVzZXIgUE9OLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfRkxPV19ESVJFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBGbG93IERpcmVjdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgICAgIC8qKjwgQnJpZGdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSAgICAgICAgICAgLyoqPCBCcmlkZ2UgUG9ydC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZTsKKworLyoqIEZsb3cgRGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9GTE9XX0RJUkVDVElPTl9JTkdSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbmdyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GTE9XX0RJUkVDVElPTl9FR1JFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBFZ3Jlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX1VQU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFVwc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GTE9XX0RJUkVDVElPTl9ET1dOU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GTE9XX0RJUkVDVElPTl9FR1JFU1NfTE9DQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBFZ3Jlc3MgTG9jYWwuICovCit9IGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbjsKKworLyoqIFRlayBMZWFmIEF0dHJpYnV0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NDYsICAgICAgICAvKio8IExVRSBGaWVsZCBTZWxlY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgRnJhbWVzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19TSU5HTEVfQ09MTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIFNpbmdsZSBDb2xsIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBNdWx0aXBsZSBDb2xsIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1JYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZXMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgRkNTIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBBbGlnbiBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgT2N0ZXRzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEZyYW1lcyBEZWZlcnJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBMYXRlIENvbGxpc2lvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFN0ZCBNQUMgRXhjZXNzaXZlIENvbGxpc2lvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlIgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IFN0ZCBNQUMgRnJhbWVzIExvc3QgTUFDIFR4IEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDYXJyaWVyIFNlbnNlIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1JYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBPY3RldHMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlIgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IFN0ZCBNQUMgRnJhbWVzIExvc3QgTUFDIFJ4IEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBQcm9taXNjdW91cyBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0FERFJfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFN0ZCBNQUMgTWNhc3QgQWRkciBMaXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE1jYXN0IEZyYW1lcyBUeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBCY2FzdCBGcmFtZXMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTCAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFN0ZCBNQUMgRnIgRXhjZXNzaXZlIERlZmVycmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE1jYXN0IEZyYW1lcyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBCY2FzdCBGcmFtZXMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lOX1JBTkdFX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgICAvKio8IFN0ZCBNQUMgSW4gUmFuZ2UgTGVuIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBPdXQgT2YgUmFuZ2UgTGVuIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZSBUb28gTG9uZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBFbmFibGUgU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIFR4IEVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBNY2FzdCBSeCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgICAgICAgICAvKio8IFN0ZCBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ09MTElTSU9OX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDb2xsaXNpb24gRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCBTdGQgUEhZIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgICAvKio8IFN0ZCBQSFkgVHlwZSBMaXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSICAgICAgICAgICAgICAgICAgICA9IDM1LCAgICAgICAgICAgLyoqPCBTdGQgUEhZIFN5bWJvbCBFcnIgRHVyaW5nIENhcnJpZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcsICAgICAgICAgICAvKio8IFN0ZCBQSFkgQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEsICAgICAgICAgICAvKio8IFN0ZCBNQVUgTWVkaWEgQXZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OSwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgUmVtb3RlIFNpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIEF1dG8gQ2ZnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgyLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgTG9jYWwgVGVjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9URUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MywgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIEFkIFRlY2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODQsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBSeCBUZWNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICA9IDg1LCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgTG9jYWwgU2VsZWN0IEFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gODYsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBBZCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NywgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIFJ4IFNlbGVjdCBBYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg5LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIENhcGFiaWxpdGllcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRFVQTEVYX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBEdXBsZXggU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkyLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEN0cmwgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gOTMsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBGdW5jcyBTdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTQsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBGcmFtZXMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTUsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBGcmFtZXMgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlggICAgICAgICAgICAgICAgICAgICAgID0gOTYsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBVbnN1cHBvcnRlZCBPcCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIFBhdXNlIERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk4LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEN0cmwgUGF1c2UgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTksICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBQYXVzZSBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQgICAgICAgICAgICAgICAgICAgPSAyMzMsICAgICAgICAgIC8qKjwgU3RkIE9BTSBMb2NhbCBFcnIgRnJhbWUgU2VjcyBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDksICAgICAgICAgIC8qKjwgU3RkIE9BTSBFbXVsIENyYzggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4MCwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBNQUMgQ3RybCBGcmFtZXMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlggICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgxLCAgICAgICAgICAvKio8IFN0ZCBNUENQIE1BQyBDdHJsIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFggICAgICAgICAgICAgICAgICAgICAgICAgPSAyODgsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgRGlzY292ZXJ5IFdpbmRvdyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTAsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgRGlzY292ZXJ5IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkyLCAgICAgICAgICAvKio8IFN0ZCBGRUMgQ29ycmVjdGVkIEJsb2Nrcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1MgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTMsICAgICAgICAgIC8qKjwgU3RkIEZFQyBVbmNvcnJlY3RhYmxlIEJsb2Nrcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTMsICAgICAgICAgIC8qKjwgU3RkIEZFQyBBYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNCwgICAgICAgICAgLyoqPCBTdGQgRkVDIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE1LCAgICAgICAgICAvKio8IFN0ZCBNUENQIFR4IEdhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE2LCAgICAgICAgICAvKio8IFN0ZCBNUENQIFR4IFJlZyBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE3LCAgICAgICAgICAvKio8IFN0ZCBNUENQIFR4IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOCwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBUeCBSZWcgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTksICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgVHggUmVwb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfR0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMCwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBSeCBHYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMSwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBSeCBSZWcgQWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMiwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBSeCBSZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjMsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgUnggUmVnIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI0LCAgICAgICAgICAvKio8IFN0ZCBNUENQIFJ4IFJlcG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgICAgIC8qKjwgRmlybXdhcmUgVmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAgICAgLyoqPCBFeHRlbmRlZCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgICAgIC8qKjwgRHluIExlYXJuIFRibCBTaXplLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAgICAgLyoqPCBEeW4gTGVhcm4gQWdlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMiwgICAgICAgICAgLyoqPCBSeCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzMsICAgICAgICAgIC8qKjwgVHggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIFRvbyBTaG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzUsICAgICAgICAgIC8qKjwgUnggRnJhbWUgNjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDY14oCTMTI3LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjhUTzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNywgICAgICAgICAgLyoqPCBSeCBGcmFtZSAxMjjigJMyNTUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM4LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDI1NuKAkzUxMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzksICAgICAgICAgIC8qKjwgUnggRnJhbWUgNTEy4oCTMTAyMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNFRPMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDAsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMTAyNOKAkzE1MTguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQxLCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDE1MTkgUGx1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDIsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQzLCAgICAgICAgICAvKio8IFR4IEZyYW1lIDY14oCTMTI3LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NCwgICAgICAgICAgLyoqPCBUeCBGcmFtZSAxMjjigJMyNTUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ1LCAgICAgICAgICAvKio8IFR4IEZyYW1lIDI1NuKAkzUxMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyVE8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDYsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNTEy4oCTMTAyMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDcsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMTAyNOKAkzE1MTguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ4LCAgICAgICAgICAvKio8IFR4IEZyYW1lIDE1MTkgUGx1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDksICAgICAgICAgIC8qKjwgVHggRGVsYXkgVGhyZXNob2xkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MCwgICAgICAgICAgLyoqPCBUeCBEZWxheS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTEsICAgICAgICAgIC8qKjwgVHggRnJhbWVzIERyb3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUyLCAgICAgICAgICAvKio8IFR4IEJ5dGVzIERyb3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzLCAgICAgICAgICAvKio8IFR4IEJ5dGVzIERlbGF5ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0LCAgICAgICAgICAvKio8IFR4IEJ5dGVzIFVudXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTUsICAgICAgICAgIC8qKjwgUnggRGVsYXkgVGhyZXNob2xkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NiwgICAgICAgICAgLyoqPCBSeCBEZWxheS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTcsICAgICAgICAgIC8qKjwgUnggRnJhbWVzIERyb3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU4LCAgICAgICAgICAvKio8IFJ4IEJ5dGVzIERyb3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU5LCAgICAgICAgICAvKio8IFJ4IEJ5dGVzIERlbGF5ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgICAgICAvKio8IFBvcnQgU3RhdCBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYxLCAgICAgICAgICAvKio8IExpbmsgU3RhdCBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYyLCAgICAgICAgICAvKio8IEVuY3J5cHQgS2V5IEV4cGlyeSBUaW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUk9SX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MywgICAgICAgICAgLyoqPCBMZW4gRXJyb3IgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjQsICAgICAgICAgIC8qKjwgRHluIE1BQyBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY1LCAgICAgICAgICAvKio8IFN0YXRpYyBNQUMgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NiwgICAgICAgICAgLyoqPCBVcCBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE5fRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NywgICAgICAgICAgLyoqPCBEbiBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2OCwgICAgICAgICAgLyoqPCBSZXBvcnQgVGhyZXNob2xkcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjksICAgICAgICAgIC8qKjwgQmNhc3QgUmF0ZSBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzIsICAgICAgICAgIC8qKjwgVkxBTiBFdGhlcnR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc0LCAgICAgICAgICAvKio8IFBvcnQgQ2FwYWJpbGl0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NUTF9WTEFOX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzUsICAgICAgICAgIC8qKjwgQ3RsIFZMQU4gSSBELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTURJX0NST1NTT1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NiwgICAgICAgICAgLyoqPCBNREkgQ3Jvc3NvdmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX0ROX0ZJTFRFUl9UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NywgICAgICAgICAgLyoqPCBOZXcgRG4gRmlsdGVyIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzgsICAgICAgICAgIC8qKjwgTmV3IFVwIEZpbHRlciBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9KRURFQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5LCAgICAgICAgICAvKio8IEpFREVDIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MCwgICAgICAgICAgLyoqPCBDaGlwIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MSwgICAgICAgICAgLyoqPCBDaGlwIFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgyLCAgICAgICAgICAvKio8IE1QQ1AgQ2xvY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgzLCAgICAgICAgICAvKio8IE1QQ1AgQ2xvY2sgQ29tcGVuc2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODQsICAgICAgICAgIC8qKjwgRWdyZXNzIFNoYXBpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg1LCAgICAgICAgICAvKio8IEluZ3Jlc3MgUG9saWNpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg2LCAgICAgICAgICAvKio8IENvUyBUcmFuc2xhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODcsICAgICAgICAgIC8qKjwgUHJpIEVucXVldWluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9QT0xJQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODgsICAgICAgICAgIC8qKjwgUG9ydCBWTEFOIFBvbGljeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODksICAgICAgICAgIC8qKjwgUG9ydCBWTEFOIE1lbWJlcnNoaXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BUlBfUkVQTElDQVRFX0RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkwLCAgICAgICAgICAvKio8IEFSUCBSZXBsaWNhdGUgRGVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTEsICAgICAgICAgIC8qKjwgTEFDUCBEZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NiwgICAgICAgICAgLyoqPCBPTlUgSUdNUCBWTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwOCwgICAgICAgICAgLyoqPCBEeW4gTGVhcm5pbmcgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDksICAgICAgICAgIC8qKjwgTWluIE1BQyBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTAsICAgICAgICAgIC8qKjwgT05VIEFnZ3JlZ2F0ZSBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TQ1JBVENIUEFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTEsICAgICAgICAgIC8qKjwgTlZTIFNjcmF0Y2hwYWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEyLCAgICAgICAgICAvKio8IEZsb29kIFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEzLCAgICAgICAgICAvKio8IExvY2FsIFN3aXRjaGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTQsICAgICAgICAgIC8qKjwgRG93biBCdXJzdCBUb2xsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNSwgICAgICAgICAgLyoqPCBGRUMgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTgsICAgICAgICAgIC8qKjwgTGVhcm4gTW9kZSBSdWxlIFVwZGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTksICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFRlbXBlcmF0dXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyMCwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVmNjLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX0JJQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyMSwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVHggQmlhcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjIsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IFBvd2VyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyMywgICAgICAgICAgLyoqPCBQb3dlciBNb24gUnggUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI0LCAgICAgICAgICAvKio8IE1jYXN0IERvbWFpbiBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI1LCAgICAgICAgICAvKio8IE1jYXN0IEdsb2JhbCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HUk9VUF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI2LCAgICAgICAgICAvKio8IE1jYXN0IEdyb3VwIEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI3LCAgICAgICAgICAvKio8IExpbmsgU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI4LCAgICAgICAgICAvKio8IElHTVAgRnJhbWUgUmF0ZSBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzAsICAgICAgICAgIC8qKjwgT05VIEhvbGRvdmVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMSwgICAgICAgICAgLyoqPCBJUE1DIFVua25vd24gTGVhdmUgRndkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzNCwgICAgICAgICAgLyoqPCBOZXR3b3JrIFBPTiBNYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM1LCAgICAgICAgICAvKio8IFBTIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0xFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzNiwgICAgICAgICAgLyoqPCBTTEUgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzcsICAgICAgICAgIC8qKjwgTGVhcm4gVGFibGUgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fREVTVElOQVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDAsICAgICAgICAgIC8qKjwgVkxBTiBEZXN0aW5hdGlvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQyLCAgICAgICAgICAvKio8IFRyYW5zY2VpdmVyIFNpZ25hbCBEZXRlY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQzLCAgICAgICAgICAvKio8IENyb3NzYmFyIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDQsICAgICAgICAgIC8qKjwgVHJhbnNjZWl2ZXIgQnVyc3QgQWN0aXZpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ1LCAgICAgICAgICAvKio8IENvbnRyb2wgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDgsICAgICAgICAgIC8qKjwgRW5jcnlwdGlvbiBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzY0LCAgICAgICAgLyoqPCBVTkkgU2hhcGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzQ3LCAgICAgICAgLyoqPCBQb3J0IER5bmFtaWMgRW50cmllcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc2NSwgICAgICAgIC8qKjwgUG9saWNlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc2NiwgICAgICAgIC8qKjwgT05VIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUxLCAgICAgICAgICAvKio8IEludGVybmFsIFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUyLCAgICAgICAgICAvKio8IEZpcm13YXJlIFRpbWVzdGFtcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjUsICAgICAgICAgIC8qKjwgQnlwYXNzIFNvZnQgTGVhcm4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjEsICAgICAgICAvKio8IEV4dCBGaXJtd2FyZSBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzYwLCAgICAgICAgLyoqPCBFbmNyeXB0aW9uIEtleS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJTEVfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc1OSwgICAgICAgIC8qKjwgRmlsZSBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzOCwgICAgICAgICAgLyoqPCBTeXN0ZW0gUnVsZSBPcHRpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzU4LCAgICAgICAgLyoqPCBNVFUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NTcsICAgICAgICAvKio8IE5WUyBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc1NiwgICAgICAgIC8qKjwgUXVldWVwcmltYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUwLCAgICAgICAgICAvKio8IEVQb0MgU0RNIEFtcGxpdHVkZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTMsICAgICAgICAgIC8qKjwgRVBvQyBEb3duIEJpdCBMb2FkaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VUF9CSVRfTE9BRElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NCwgICAgICAgICAgLyoqPCBFUG9DIFVwIEJpdCBMb2FkaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSwgICAgICAgICAgLyoqPCBFUG9DIFNETSBQaGFzZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1FVQU5USVpFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzksICAgICAgICAgIC8qKjwgRVBvQyBTRE0gUXVhbnRpemVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyOSwgICAgICAgICAgLyoqPCBFUG9DIFVudXNlZCAwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNCwgICAgICAgICAgLyoqPCBFUG9DIFVudXNlZCAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNSwgICAgICAgICAgLyoqPCBFUG9DIFVudXNlZCAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNiwgICAgICAgICAgLyoqPCBFUG9DIFVudXNlZCAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNywgICAgICAgICAgLyoqPCBFUG9DIFVudXNlZCA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzYyLCAgICAgICAgLyoqPCBGZWF0dXJlIFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc0NSwgICAgICAgIC8qKjwgTFVFIEZpZWxkIFNlbGVjdCBMaXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzUyLCAgICAgICAgLyoqPCBTZWFyY2ggQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNiwgICAgICAgICAgLyoqPCBTZXF1ZW5jZSBOdW1iZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NTMsICAgICAgICAvKio8IFF1ZXVlIENvbmZpZyBWMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc0MSwgICAgICAgIC8qKjwgQWxhcm0gVGhyZXNob2xkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0NiwgICAgICAgICAgLyoqPCBGYWlsc2FmZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTYsICAgICAgICAgIC8qKjwgUG9ydCBTdGF0cyBUaHJlc2hvbGQgSW50ZXJ2YWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgICAgID0gNDE3ICAgICAgICAgICAvKio8IExpbmsgU3RhdHMgVGhyZXNob2xkIEludGVydmFsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlOworCisvKiogVGVrIExlYWYgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBJbml0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19BRERfR1JPVVBfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEFkZCBHcm91cCBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIERlbCBHcm91cCBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIFNlbGYgVGVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgU3RkIFBIWSBBZG1pbiBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBTdGQgUmVwb3J0IFJlc2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBTdGQgUmVwb3J0IEluIFNlcnZpY2UgVGVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgU3RkIFBvcnQgQWRtaW4gQ3RybC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgU3RkIE1BVSBSZXNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgU3RkIE1BVSBBZG1pbiBDdHJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fUkVORUdPVElBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBSZW5lZ290aWF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gQWRtaW4gQ3RybC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgICAgIC8qKjwgQ2xlYXIgRHluIExlYXJuIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgICAgIC8qKjwgQWRkIFN0YXRpYyBFbnRyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgICAgIC8qKjwgRGVsIFN0YXRpYyBFbnRyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzEsICAgICAgICAgIC8qKjwgQ2xlYXIgVXAgRmlsdGVyIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzIsICAgICAgICAgIC8qKjwgQ2xlYXIgRG4gRmlsdGVyIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzMsICAgICAgICAgIC8qKjwgQWRkIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgICAgICAgICAvKio8IERlbGV0ZSBSdWxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAgICAgLyoqPCBSZXNldCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgICAgICAgICAvKio8IENsZWFyIFN0YXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNywgICAgICAgICAgLyoqPCBHZXQgR1BJTyBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM4LCAgICAgICAgICAvKio8IFNldCBHUElPIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzksICAgICAgICAgIC8qKjwgR2V0IEdQSU8gVmFsdWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQwLCAgICAgICAgICAvKio8IFNldCBHUElPIFZhbHVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX01ESU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MSwgICAgICAgICAgLyoqPCBHZXQgTURJTy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9NRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDIsICAgICAgICAgIC8qKjwgU2V0IE1ESU8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQzLCAgICAgICAgICAvKio8IExvb3BiYWNrIEVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDQsICAgICAgICAgIC8qKjwgTG9vcGJhY2sgRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9VUF9DTEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDUsICAgICAgICAgIC8qKjwgQ2xyIFVwIENsYXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX0ROX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NiwgICAgICAgICAgLyoqPCBDbHIgRG4gQ2xhc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ3LCAgICAgICAgICAvKio8IFNldCBRdWV1ZSBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ4LCAgICAgICAgICAvKio8IEdldCBRdWV1ZSBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUkFTRV9OVlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ5LCAgICAgICAgICAvKio8IEVyYXNlIE5WUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9JR01QX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTAsICAgICAgICAgIC8qKjwgU2V0IElHTVAgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MSwgICAgICAgICAgLyoqPCBHZXQgSUdNUCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUyLCAgICAgICAgICAvKio8IEdldCBJR01QIEdyb3VwIEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzLCAgICAgICAgICAvKio8IERlbCBJR01QIEdyb3VwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NCwgICAgICAgICAgLyoqPCBBZGQgSUdNUCBHcm91cC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTUsICAgICAgICAgIC8qKjwgU2V0IFF1ZXVlIFJhdGUgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9SQVRFX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTYsICAgICAgICAgIC8qKjwgR2V0IFF1ZXVlIFJhdGUgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QT1JUX1JBVEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTcsICAgICAgICAgIC8qKjwgU2V0IFBvcnQgUmF0ZSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BPUlRfUkFURV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1OCwgICAgICAgICAgLyoqPCBHZXQgUG9ydCBSYXRlIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU5LCAgICAgICAgICAvKio8IFNldCBQSFkgQWRkciBNRElPLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgICAgICAgICAgLyoqPCBHZXQgUEhZIEFkZHIgTURJTy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19BRERfUlVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgICAgIC8qKjwgTmV3IEFkZCBSdWxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgICAgICAgICAgLyoqPCBPTlUgRW5hYmxlIFVzZXIgVHJhZmZpYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjMsICAgICAgICAgIC8qKjwgT05VIERpc2FibGUgVXNlciBUcmFmZmljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NCwgICAgICAgICAgLyoqPCBTZXQgRG4gQmNhc3QgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY1LCAgICAgICAgICAvKio8IEdldCBEbiBCY2FzdCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9PQU1fUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjYsICAgICAgICAgIC8qKjwgU2V0IE9BTSBSYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NywgICAgICAgICAgLyoqPCBHZXQgT0FNIFJhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTFVFX0ZJRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY4LCAgICAgICAgICAvKio8IFNldCBMVUUgRmllbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY5LCAgICAgICAgICAvKio8IEdldCBMVUUgRmllbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcwLCAgICAgICAgICAvKio8IEdldCBMb2FkIEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfREVMX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcxLCAgICAgICAgICAvKio8IE5ldyBEZWwgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzIsICAgICAgICAgIC8qKjwgQ2xlYXIgVXAgVXNlciBSdWxlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX1VTRVJfUlVMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzMsICAgICAgICAgIC8qKjwgQ2xlYXIgRG4gVXNlciBSdWxlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzQsICAgICAgICAgIC8qKjwgRGVsZXRlIE1jYXN0IERvbWFpbiBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc1LCAgICAgICAgICAvKio8IERlbGV0ZSBNY2FzdCBHcm91cC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzYsICAgICAgICAgIC8qKjwgTGFzZXIgVHggUG93ZXIgT2ZmLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NywgICAgICAgICAgLyoqPCBCYyBMYXNlciBQb3dlciBPZmYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc4LCAgICAgICAgICAvKio8IFNsZWVwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OSwgICAgICAgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODEsICAgICAgICAgIC8qKjwgQWRkIExVRSBSdWxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MiwgICAgICAgICAgLyoqPCBEZWwgTFVFIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgzLCAgICAgICAgICAvKio8IEVuYWJsZSBQb2xpY2VyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NCwgICAgICAgICAgLyoqPCBEaXNhYmxlIFBvbGljZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAyLCAgICAgICAgICAvKio8IEVwb2MgVW51c2VkIDAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAzLCAgICAgICAgICAvKio8IEVwb2MgVW51c2VkIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA3LCAgICAgICAgICAvKio8IEZpbmQgTFVFIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9MVUVfUlVMRV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4LCAgICAgICAgICAvKio8IENsZWFyIExVRSBSdWxlIFRhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfU0RNX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwOSwgICAgICAgICAgLyoqPCBHZXQgRVBvQyBTRE0gU3RhdHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEwLCAgICAgICAgICAvKio8IEdldCBFUG9DIENNQyBTdGF0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTEgICAgICAgICAgIC8qKjwgR2V0IEVQb0MgQ05VIFN0YXRzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uOworCisvKiogVGVrIE9OVSBSdWxlIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfRkxBR1NfVk9MQVRJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSAgICAgICAgLyoqPCBWb2xhdGlsZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnczsKKworLyoqIFRlayBPTlUgUnVsZSBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9GT1JXQVJEX1VOQUZGRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRm9yd2FyZCBVbmFmZmVjdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX1JFU0VSVkVEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSZXNlcnZlZDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fU0VUX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNldCBEZXN0aW5hdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9BRERfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQWRkIFZMQU4gVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0RFTEVURV9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBEZWxldGUgVkxBTiBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fU0VUX1ZJRF9BRERfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFNldCBWSUQgQWRkIFZMQU4gVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX1NFVF9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBTZXQgQ29TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0RFTEVURV9UQUdfQUREX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBEZWxldGUgVGFnIEFkZCBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fREVMRVRFX1RBR19BRERfVEFHX1NFVF9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IERlbGV0ZSBUYWcgQWRkIFRhZyBTZXQgVklELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NMRUFSX0FERF9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBDbGVhciBBZGQgVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NMRUFSX0RFTF9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBDbGVhciBEZWwgVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NMRUFSX0RFTF9UQUdfQU5EX0FERF9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBDbGVhciBEZWwgVGFnIEFuZCBBZGQgVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NPUFlfRklFTERfVE9fQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBDb3B5IEZpZWxkIFRvIENvUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DT1BZX0ZJRUxEX1RPX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgQ29weSBGaWVsZCBUbyBWSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fUkVTRVJWRUQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IFJlc2VydmVkMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9GT1JXQVJEX0NMRUFSX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgRm9yd2FyZCBDbGVhciBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX1JFU0VSVkVEMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBSZXNlcnZlZDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fU0VUX0RFU1RJTkFUSU9OX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFNldCBEZXN0aW5hdGlvbiBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0FERF9UQUdfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBBZGQgVGFnIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fREVMRVRFX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IERlbGV0ZSBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfVklEX0FERF9UQUdfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgIC8qKjwgU2V0IFZJRCBBZGQgVGFnIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fU0VUX0NPU19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgICAgICAvKio8IFNldCBDb1MgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ERUxFVEVfVEFHX0FERF9UQUdfUkVQTEFDRV9UQUdfRk9SV0FSRCAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgRGVsZXRlIFRhZyBBZGQgVGFnIFJlcGxhY2UgVGFnIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fREVMRVRFX1RBR19BRERfVEFHX1NFVF9WSURfRk9SV0FSRCAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IERlbGV0ZSBUYWcgQWRkIFRhZyBTZXQgVklEIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfQUREX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IENsZWFyIEFkZCBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DTEVBUl9ERUxfVEFHX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgQ2xlYXIgRGVsIFRhZyBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NMRUFSX0RFTF9UQUdfQU5EX0FERF9UQUdfRk9SV0FSRCAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBDbGVhciBEZWwgVGFnIEFuZCBBZGQgVGFnIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ09QWV9GSUVMRF9UT19DT1NfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IENvcHkgRmllbGQgVG8gQ29TIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ09QWV9GSUVMRF9UT19WSURfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgICAgICAgICAvKio8IENvcHkgRmllbGQgVG8gVklEIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fUkVTRVJWRUQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgICAgICAvKio8IFJlc2VydmVkNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9SRVNFUlZFRDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSAgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQ1LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbjsKKworLyoqIFRlayBPTlUgRmllbGQgU2VsZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfRklFTERfU0VMRUNUX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfRklFTERfU0VMRUNUX0VUSEVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEV0aGVyVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfVVNFUl9GUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVXNlciBGUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfSVBQUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgSVAgUHJvdG9jb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfRklFTERfU0VMRUNUX0NUQ19FVEhfQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IENUQyBFdGggQ29TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9MM1BST1RPQ09MX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExICAgICAgICAgICAgLyoqPCBMMyBQcm90b2NvbCBUeXBlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3Q7CisKKy8qKiBUZWsgT05VIFJ1bGUgT3BlcmF0b3IuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfTkVWRVJfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOZXZlciBNYXRjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9PUEVSQVRPUl9OT1RfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE5vdCBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX0xFU1NfVEhBTl9PUl9FUVVBTF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTGVzcyBUaGFuIE9yIEVxdWFsIFRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBHcmVhdGVyIFRoYW4gT3IgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9PUEVSQVRPUl9FWElTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEV4aXN0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX05PVF9FWElTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTm90IEV4aXN0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX0FMV0FZU19NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgIC8qKjwgQWx3YXlzIE1hdGNoLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yOworCisvKiogT05VIFBTIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfUFNTVEFURV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9QU1NUQVRFX1NXSVRDSEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IFN3aXRjaGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfUFNTVEFURV9TSUdOQUxfREVURUNUX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBTaWduYWwgRGV0ZWN0IEEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9QU1NUQVRFX1NJR05BTF9ERVRFQ1RfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0ICAgICAgICAvKio8IFNpZ25hbCBEZXRlY3QgQi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlOworCisvKiogVGVrIExlYXJuIFRhYmxlIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFSTl9UQUJMRV9NT0RFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE92ZXJmbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBUk5fVEFCTEVfTU9ERV9PVkVSV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBPdmVyd3JpdGUuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZTsKKworLyoqIFRlayBWTEFOIERlc3RpbmF0aW9uIE1hdGNoIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fTUFUQ0hfTU9ERV9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19WTEFOX0RFU1RJTkFUSU9OX01BVENIX01PREVfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFZJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fTUFUQ0hfTU9ERV9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ29TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfVkxBTl9ERVNUSU5BVElPTl9NQVRDSF9NT0RFX1ZJRF9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBWSUQvQ29TLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZTsKKworLyoqIFRlayBWTEFOIERlc3RpbmF0aW9uIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfVkxBTl9ERVNUSU5BVElPTl9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19WTEFOX0RFU1RJTkFUSU9OX0ZMQUdTX0RST1BfVU5UQUdHRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IERyb3AgVW50YWdnZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19WTEFOX0RFU1RJTkFUSU9OX0ZMQUdTX1NUUklQX1ZMQU5fVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyICAgICAgICAvKio8IFN0cmlwIFZMQU4gVGFnLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3M7CisKKy8qKiBUZWsgRW5jcnlwdGlvbiBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19FTkNSWVBUSU9OX01PREVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRU5DUllQVElPTl9NT0RFX0FFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBRVMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19FTkNSWVBUSU9OX01PREVfWk9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFpPSC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0VOQ1JZUFRJT05fTU9ERV9DVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgQ1RDLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZTsKKworLyoqIFRlayBFbmNyeXB0aW9uIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0VOQ1JZUFRJT05fT1BUSU9OU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRU5DUllQVElPTl9PUFRJT05TX0JJX0RJUkVDVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSAgICAgICAgLyoqPCBCaS1EaXJlY3Rpb25hbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnM7CisKKy8qKiBSdWxlIEZpZWxkIFNlbGVjdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfTDJEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTDIgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0wyU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEwyIFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9MMlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMMiBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9MMlNWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMMiBTVmxhbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfTDJDVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTDIgQ1ZsYW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VEUF9UQ1BfU09VUkNFX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFVkcCBUY3AgU291cmNlIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VEUF9UQ1BfREVTVElOQVRJT05fUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFVkcCBUY3AgRGVzdGluYXRpb24gUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgSXAgUHJvdG9jb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0lQVjRUVExfSVBWNkhPUF9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IElQVjQgVHRsIElQVjYgSG9wIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUFY0VE9TX0lQVjZDTEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBJUFY0IFRvcyBJUFY2IENsYXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUFY0SVBWNkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBJUFY0IElQVjYgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0lQVjZEQUhJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IElQVjYgREEgSGkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0lQVjRJUFY2U0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IElQVjQgSVBWNiBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNlNBSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgSVBWNiBTQSBIaS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNk5FWFRfSEVBREVSX0JJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgSVBWNiBOZXh0IEhlYWRlciBCaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0xMSURfTUFDX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IExMSUQgTWFjIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9VU0VSMTZCSVRfRklFTEQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBVc2VyIDE2IEJpdCBGaWVsZCAwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9VU0VSMTZCSVRfRklFTEQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBVc2VyIDE2IEJpdCBGaWVsZCAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9VU0VSMTZCSVRfRklFTEQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBVc2VyIDE2IEJpdCBGaWVsZCAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9VU0VSMTZCSVRfRklFTEQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBVc2VyIDE2IEJpdCBGaWVsZCAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9VU0VSMTZCSVRfRklFTEQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCBVc2VyIDE2IEJpdCBGaWVsZCA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9VU0VSMzJCSVRfRklFTEQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBVc2VyIDMyIEJpdCBGaWVsZCA1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9VU0VSMzJCSVRfRklFTEQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBVc2VyIDMyIEJpdCBGaWVsZCA2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9QVFBfVElNRV9TVEFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCBQVFAgVGltZSBTdGFtcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfUE9MSUNFUl9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qKjwgUG9saWNlciBFbGVtZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9WQVJfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCBWYXIgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9MRUFSTklOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgICAvKio8IFZhciBMZWFybmluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IFZhciBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IFZhciBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1NXSVRDSElOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgVmFyIFN3aXRjaGluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgICAgICAvKio8IFZhciBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgICAgICAgICAvKio8IFZhciBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9QT0xJQ0VSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IFZhciBQb2xpY2VyIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgICAvKio8IFZhciBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgICAvKio8IFZhciBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9WQVJfSU5ERVhfVEFCTEVfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgICAgICAgICAgLyoqPCBWYXIgSW5kZXggVGFibGUgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfRlJBTUVfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgRnJhbWUgTGVuZ3RoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9GUkFNRV9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3ICAgICAgICAgICAgLyoqPCBGcmFtZSBEaXNjYXJkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3Q7CisKKy8qKiBSdWxlIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3RvcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fTk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTm9wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9WTEFOX0FERF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBWbGFuIEFkZCBTZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1ZMQU5fQUREX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFZsYW4gQWRkIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9WTEFOX0RFTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBWbGFuIERlbCBTZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1ZMQU5fREVMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFZsYW4gRGVsIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9ESVNDQVJEX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBEaXNjYXJkIFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fRElTQ0FSRF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgRGlzY2FyZCBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0VUX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgU2V0IFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBTZXQgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBTZXQgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfU1RBVElTVElDX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBTZXQgU3RhdGlzdGljIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IFNldCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBTZXQgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfUE9MSUNFUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBTZXQgUG9saWNlciAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBTZXQgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBTZXQgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfU1NNX1NPVVJDRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBTZXQgU3NtIFNvdXJjZSBJZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0VUX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgU2V0IEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFNldCBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCBTZXQgQ29zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBTZXQgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgT3IgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX0xFQVJOSU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgICAvKio8IE9yIExlYXJuaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qKjwgT3IgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCBPciBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfU1dJVENISU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgT3IgU3dpdGNoaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgIC8qKjwgT3IgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAgLyoqPCBPciBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1BPTElDRVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgICAgICAgICAvKio8IE9yIFBvbGljZXIgMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgIC8qKjwgT3IgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgICAgICAgICAgLyoqPCBPciBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9JTkRFWF9UQUJMRV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCBPciBJbmRleCBUYWJsZSBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBPciBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0LCAgICAgICAgICAgLyoqPCBPciBDb3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1RQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IE9yIFRwaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FORF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgICAgICAgICAvKio8IEFuZCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX0xFQVJOSU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgQW5kIExlYXJuaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1BPUlRfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAgICAgICAgIC8qKjwgQW5kIFBvcnQgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOSwgICAgICAgICAgIC8qKjwgQW5kIFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfU1dJVENISU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwLCAgICAgICAgICAgLyoqPCBBbmQgU3dpdGNoaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1BPTElDRVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAgICAgICAgIC8qKjwgQW5kIFBvbGljZXIgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MiwgICAgICAgICAgIC8qKjwgQW5kIFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1BPTElDRVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywgICAgICAgICAgIC8qKjwgQW5kIFBvbGljZXIgMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1BPTElDRVI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwgICAgICAgICAgIC8qKjwgQW5kIFBvbGljZXIgNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAgICAgICAgIC8qKjwgQW5kIFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FORF9JTkRFWF9UQUJMRV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYsICAgICAgICAgICAvKio8IEFuZCBJbmRleCBUYWJsZSBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfVklEX0NGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3LCAgICAgICAgICAgLyoqPCBBbmQgVmlkIENmaS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OCwgICAgICAgICAgIC8qKjwgQW5kIENvcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1RQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OSwgICAgICAgICAgIC8qKjwgQW5kIFRwaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERFFVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAsICAgICAgICAgICAvKio8IEFkZFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxLCAgICAgICAgICAgLyoqPCBBZGQgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyLCAgICAgICAgICAgLyoqPCBBZGQgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfU1RBVElTVElDX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzLCAgICAgICAgICAgLyoqPCBBZGQgU3RhdGlzdGljIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQsICAgICAgICAgICAvKio8IEFkZCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1LCAgICAgICAgICAgLyoqPCBBZGQgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfUE9MSUNFUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2LCAgICAgICAgICAgLyoqPCBBZGQgUG9saWNlciAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3LCAgICAgICAgICAgLyoqPCBBZGQgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU4LCAgICAgICAgICAgLyoqPCBBZGQgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfU1NNX1NPVVJDRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5LCAgICAgICAgICAgLyoqPCBBZGQgU3NtIFNvdXJjZSBJZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQUREX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAgICAgICAgIC8qKjwgQWRkIEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjEsICAgICAgICAgICAvKio8IEFkZCBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfQ09EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyLCAgICAgICAgICAgLyoqPCBBZGQgQ29kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzLCAgICAgICAgICAgLyoqPCBBZGQgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAgICAgICAgIC8qKjwgU2hpZnQgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX0xFQVJOSU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgICAgICAvKio8IFNoaWZ0IExlYXJuaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NiwgICAgICAgICAgIC8qKjwgU2hpZnQgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY3LCAgICAgICAgICAgLyoqPCBTaGlmdCBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfU1dJVENISU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAgICAgICAgIC8qKjwgU2hpZnQgU3dpdGNoaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OSwgICAgICAgICAgIC8qKjwgU2hpZnQgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcwLCAgICAgICAgICAgLyoqPCBTaGlmdCBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1BPTElDRVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEsICAgICAgICAgICAvKio8IFNoaWZ0IFBvbGljZXIgMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MiwgICAgICAgICAgIC8qKjwgU2hpZnQgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczLCAgICAgICAgICAgLyoqPCBTaGlmdCBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9JTkRFWF9UQUJMRV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0LCAgICAgICAgICAgLyoqPCBTaGlmdCBJbmRleCBUYWJsZSBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1LCAgICAgICAgICAgLyoqPCBTaGlmdCBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9DT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2LCAgICAgICAgICAgLyoqPCBTaGlmdCBDb2QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1RQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcsICAgICAgICAgICAvKio8IFNoaWZ0IFRwaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgsICAgICAgICAgICAvKio8IENvcHkgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzksICAgICAgICAgICAvKio8IENvcHkgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1BPUlRfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwLCAgICAgICAgICAgLyoqPCBDb3B5IFBvcnQgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAgICAgICAgIC8qKjwgQ29weSBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAgICAgICAgIC8qKjwgQ29weSBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1BPTElDRVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgzLCAgICAgICAgICAgLyoqPCBDb3B5IFBvbGljZXIgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAgICAgICAgIC8qKjwgQ29weSBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODUsICAgICAgICAgICAvKio8IENvcHkgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1BPTElDRVI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg2LCAgICAgICAgICAgLyoqPCBDb3B5IFBvbGljZXIgNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NywgICAgICAgICAgIC8qKjwgQ29weSBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg4LCAgICAgICAgICAgLyoqPCBDb3B5IEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfVklEX0NGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODksICAgICAgICAgICAvKio8IENvcHkgVmlkIENmaS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9DT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MCwgICAgICAgICAgIC8qKjwgQ29weSBDb2QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTEgICAgICAgICAgICAvKio8IENvcHkgVHBpZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uOworCisvKiogVmVyc2lvbiBtYXR1cml0eSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX01BVFVSSVRZX1JFTEVBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAgICAgICAgIC8qKjwgUmVsZWFzZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX01BVFVSSVRZX0NVU1RPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAgICAgICAgIC8qKjwgQ3VzdG9tLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfQkVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgICAgICAgICAgLyoqPCBCZXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1LCAgICAgICAgICAgLyoqPCBBbHBoYS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX01BVFVSSVRZX0VOR0lORUVSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OSwgICAgICAgICAgIC8qKjwgRW5naW5lZXJpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19NQVRVUklUWV9ERVZFTE9QTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjggICAgICAgICAgICAvKio8IERldmVsb3BtZW50LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5OworCisvKiogRmlsZSBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0JPT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQm9vdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQXBwIE1haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfQkFDS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEFwcCBCYWNrdXAuICovCit9IGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGU7CisKKy8qKiBOVlMgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9OVlNfU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmFibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9OVlNfU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZTsKKworLyoqIFRlayBRdWV1ZSBDb25maWcgVjIgU3VidHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfVEVSTUlOQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVXNlZCB0byBlbmQgYSBxdWV1ZSBjb25maWcgY29udGFpbmVyIGNoYWluICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFVzZWQgdG8gc3RhcnQgYSBxdWV1ZSBjb25maWcgY29udGFpbmVyIGNoYWluICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFVzZWQgdG8gZGVmaW5lIGEgbGluayBxdWV1ZSBjb25maWcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgVXNlZCB0byBkZWZpbmUgYSBwb3J0IHF1ZXVlIGNvbmZpZyAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGU7CisKKy8qKiBUZWsgUmVwb3J0IE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVfRlJBTUVfQUxJR05FRF9TSU5HTEVfUFJJT1JJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBGcmFtZSBBbGlnbmVkIChTaW5nbGUgUHJpb3JpdHkpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVfTVVMVElfUFJJT1JJVFkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBNdWx0aS1wcmlvcml0eSAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVfTVVMVElfUFJJT1JJVFk0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCBNdWx0aS1wcmlvcml0eSA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVfTVVMVElfUFJJT1JJVFk4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0ICAgICAgICAgICAgLyoqPCBNdWx0aS1wcmlvcml0eSA4LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlOworCisvKiogVGVrIEZlYXR1cmUgU2V0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZFQVRVUkVfU0VUX1NUQU5EQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3RhbmRhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GRUFUVVJFX1NFVF9EUE9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERQb0UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GRUFUVVJFX1NFVF9TREsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNESy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZFQVRVUkVfU0VUX1pURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgWlRFLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRkVBVFVSRV9TRVRfS09SRUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBLb3JlYS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldDsKKworLyoqIE1jYXN0IFNub29wIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9JR01QX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgSUdNUCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX0lHTVBfVjNNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBJR01QIFYzIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01DQVNUX1NOT09QX01PREVfSUdNUF9DT01QQVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IElHTVAgQ29tcGF0IE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01DQVNUX1NOT09QX01PREVfSUdNUF9NTERfQ09NUEFUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IElHTVAgTWxkIENvbXBhdCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX01MRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNbGQgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9NTERfVjJNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTWxkIFYyIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01DQVNUX1NOT09QX01PREVfTUxEX0NPTVBBVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IE1sZCBDb21wYXQgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9TTk9PUF9NT0RFX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgU25vb3AgTW9kZSBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9TTk9PUF9NT0RFX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICAgIC8qKjwgU25vb3AgTW9kZSBJbnZhbGlkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZTsKKworLyoqIElQTUMgR2xvYmFsIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fSVBNQ19HTE9CQUxfT1BUSU9OU19JUE1DX09QVElPTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSXBtYyBPcHRpb24gTm9uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSVBNQ19HTE9CQUxfT1BUSU9OU19JUE1DX09QVElPTl9ESVNDQVJEX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgSXBtYyBPcHRpb24gRGlzY2FyZCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JUE1DX0dMT0JBTF9PUFRJT05TX0lQTUNfT1BUSU9OX0FMTE9XX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBJcG1jIE9wdGlvbiBBbGxvdyBOdWxsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JUE1DX0dMT0JBTF9PUFRJT05TX0lQTUNfT1BUSU9OX0FMTE9XX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBJcG1jIE9wdGlvbiBBbGxvdyBBbGwuICovCit9IGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zOworCisvKiogRm9yd2FyZCBRdWFsaWZpZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfTDJEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFF1YWwgQnkgTDIgRGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFF1YWwgQnkgVmlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GT1JXQVJEX1FVQUxJRklFUl9RVUFMX0JZX0lQX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBRdWFsIEJ5IElQIERhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GT1JXQVJEX1FVQUxJRklFUl9RVUFMX0JZX0lQX1NBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBRdWFsIEJ5IElQIFNhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GT1JXQVJEX1FVQUxJRklFUl9RVUFMX0JZX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2ICAgICAgICAgICAgLyoqPCBRdWFsIEJ5IExMSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllcjsKKworLyoqIFRlayBIb2xkb3ZlciBGbGFncy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19IT0xET1ZFUl9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0hPTERPVkVSX0ZMQUdTX1JFX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEgICAgICAgIC8qKjwgU2VuZCByZWdpc3RlciByZXF1ZXN0IHRvIHJlLXJhbmdlIE9OVS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFnczsKKworLyoqIE1ESSBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX01ESV9NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vbmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTURJX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQXV0byAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfTU9ERV9NQU5VQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBNYW51YWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTURJX01PREVfQ1JPU1NPVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgQ3Jvc3NvdmVyICovCit9IGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZTsKKworLyoqIFRlayBJR01QIEZvcndhcmRpbmcgUXVhbGlmZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfRk9SV0FSRElOR19RVUFMSUZFUl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX0wyREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBMMiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfRk9SV0FSRElOR19RVUFMSUZFUl9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgVmlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX0lQX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgLyoqPCBJUCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfRk9SV0FSRElOR19RVUFMSUZFUl9JUF9TQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgSVAgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JR01QX0ZPUldBUkRJTkdfUVVBTElGRVJfTE9HSUNBTF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDEwICAgICAgICAvKio8IExvZ2ljYWwgTGluay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXI7CisKKy8qKiBUZWsgSUdNUCBTbm9vcGluZyBPcHRpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JR01QX1NOT09QSU5HX09QVElPTlNfRElTQUJMRV9ET1dOU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERpc2FibGUgRG93bnN0cmVhbS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfU05PT1BJTkdfT1BUSU9OU19ESVNBQkxFX1VQU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBVcHN0cmVhbS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnM7CisKKy8qKiBTbGVlcCBPcHRpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NMRUVQX09QVElPTlNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xFRVBfT1BUSU9OU19UWF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgVHggT25seS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xFRVBfT1BUSU9OU19SWF9MQVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgUnggTGFzZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NMRUVQX09QVElPTlNfU0VSREVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0ICAgICAgICAvKio8IFNlckRlcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnM7CisKKy8qKiBJZWVlIFJlZ2lzdGVyIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0lFRUVfUkVHSVNURVJfRkxBR1NfUkVSRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJlcmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lFRUVfUkVHSVNURVJfRkxBR1NfREVSRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERlcmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lFRUVfUkVHSVNURVJfRkxBR1NfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9GTEFHU19OQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgIC8qKjwgTmFjay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3M7CisKKy8qKiBJZWVlIFJlZ2lzdGVyIEFjayBGbGFncy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9BQ0tfRkxBR1NfTkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTmFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9BQ0tfRkxBR1NfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgQWNrLiAqLworfSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3M7CisKKy8qKiBUZWsgRmlsZSBUcmFuc2ZlciBFcnJvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3IKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RSQU5TRkVSX0VSUk9SX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFVuZGVmaW5lZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTm90IEZvdW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9OT19BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBObyBBY2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RSQU5TRkVSX0VSUk9SX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEZ1bGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RSQU5TRkVSX0VSUk9SX0lMTEVHQUxfT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IElsbGVnYWwgT3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RSQU5TRkVSX0VSUk9SX1VOS05PV05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFVua25vd24gSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RSQU5TRkVSX0VSUk9SX0JBRF9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEJhZCBCbG9jay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5ICAgICAgICAgICAgIC8qKjwgQnVzeS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yOworCisvKiogVGVrIEZpbGUgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UWVBFX0JPT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBCb290LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UWVBFX0FQUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBcHAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RZUEVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFlQRV9ESUFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgRGlhZy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGU7CisKKy8qKiBQTUMgT3AgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfU0VUX0FMQVJNX1RIUkVTSE9MRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTIsICAgICAgICAgIC8qKjwgU2V0IEFsYXJtIFRocmVzaG9sZHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEzLCAgICAgICAgICAvKio8IFJlIFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9GSVJNV0FSRV9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNCwgICAgICAgICAgLyoqPCBGaXJtd2FyZSBVcGRhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE1LCAgICAgICAgICAvKio8IEdldCBPTlUgVmVyc2lvbnMgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTYsICAgICAgICAgIC8qKjwgR2V0IE9OVSBWZXJzaW9ucyBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVNT1RFX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTcsICAgICAgICAgIC8qKjwgUmVtb3RlIEFjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQUNLTk9XTEVER0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgICAgIC8qKjwgQWNrbm93bGVkZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FVVEhFTlRJQ0FURV9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IEF1dGhlbnRpY2F0ZSBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RVUk5fT05VX0lOX1RPX09GRl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgICAgICAgICAvKio8IFR1cm4gT05VIEluIFRvIE9mZiBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9JR01QX1NOT09QSU5HX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAgICAgLyoqPCBJR01QIFNub29waW5nIFBhY2tldHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgICAgICAgICAvKio8IFVOSSBQb3J0IFN0YXR1cyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMywgICAgICAgICAgLyoqPCBVTkkgUG9ydCBTdGF0dXMgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX0NPTkZJR1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgICAgICAgICAvKio8IFVOSSBQb3J0IENvbmZpZ3VyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9FTkFCTEVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzUsICAgICAgICAgIC8qKjwgRW5jcnlwdGlvbiBFbmFibGUgRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgICAgIC8qKjwgRW5jcnlwdGlvbiBLZXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RIUkVTSE9MRF9SRVBPUlRfVkFMVUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM3LCAgICAgICAgICAvKio8IFRocmVzaG9sZCBSZXBvcnQgVmFsdWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSFlfTE9PUF9CQUNLX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzOCwgICAgICAgICAgLyoqPCBQSFkgTG9vcCBCYWNrIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM5LCAgICAgICAgICAvKio8IFBpbmcgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDAsICAgICAgICAgIC8qKjwgUGluZyBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfTUFHSUNfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICAgIC8qKjwgTWFnaWMgTnVtYmVyLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGU7CisKKy8qKiBQTUMgRmlsZSBPcC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSEVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSGVhZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTYsICAgICAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTIsICAgICAgICAgIC8qKjwgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2OCwgICAgICAgICAgLyoqPCBJbmRleC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTE4NCAgICAgICAgIC8qKjwgQWNrLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3A7CisKKy8qKiBQTUMgRXJyb3IgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT0suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19FUlJPUl9DT0RFX0JBRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzNiwgICAgICAgICAvKio8IEJhZCBTaXplLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRVJST1JfQ09ERV9CQURfQkxPQ0tfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNDgsICAgICAgICAgLyoqPCBCYWQgQmxvY2sgSW5kZXguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19FUlJPUl9DT0RFX0JBRF9DUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMwNCwgICAgICAgICAvKio8IEJhZCBDUkMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19FUlJPUl9DT0RFX1VOS05PV05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzU4NCwgICAgICAgICAvKio8IFVua25vd24gVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfTk9fSEVBREVSX1JFQ0VJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzUyLCAgICAgICAgIC8qKjwgTm8gSGVhZGVyIFJlY2VpdmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19FUlJPUl9DT0RFX05PVF9TVEFSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYwOCAgICAgICAgICAvKio8IE5vdCBTdGFydGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGU7CisKKy8qKiBPTlUgTWFzdGVyIFByb3RvY29sLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFBpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfRU5DQVBTVUxBVEVEX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEVuY2Fwc3VsYXRlZCBGcmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9PQU1fQ09OVEVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgT0FNIENvbnRlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfQlJPQURDT01fU0RLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEJyb2FkY29tIFNESy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9SRUdJU1RFUkVEX09BTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgUmVnaXN0ZXJlZCBPQU0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX0NPTU1VTklDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE1hc3RlciBDb21tdW5pY2F0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9QUk9UT0NPTF9URUtfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzY2ICAgICAgICAgLyoqPCBNYXN0ZXIgUHJvdG9jb2wgVGVrIFVua25vd24uICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sOworCisvKiogT05VIE1hc3RlciBQaW5nIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QSU5HX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BJTkdfRkxBR1NfU0FUSVNGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBTYXRpc2ZpZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUElOR19GTEFHU19QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDAwVSAgICAgICAvKio8IFBhdXNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzOworCisvKiogTWFzdGVyIEVuZCBQb2ludCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0VORF9QT0lOVF9UWVBFX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05VLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfRU5EX1BPSU5UX1RZUEVfT05VX01BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPTlUgTWFzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfRU5EX1BPSU5UX1RZUEVfT0xUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBPTFQuICovCit9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGU7CisKKy8qKiBPTlUgTWFzdGVyIENvbW11bmljYXRpb24gVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQ29tbWFuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjggICAgICAgICAgIC8qKjwgUmVzcG9uc2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZTsKKworLyoqIE9OVSBNYXN0ZXIgQ29tbWFuZCBJRC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFRlcm1pbmF0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9FTkFCTEVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEVuYWJsZSBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9ESVNBQkxFX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERpc2FibGUgT05VLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBHZXQgT05VIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NywgICAgICAgICAgLyoqPCBHZXQgT0FNIFJlZ2lzdHJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTgsICAgICAgICAgIC8qKjwgU2V0IE9BTSBSZWdpc3RyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU5LCAgICAgICAgICAvKio8IEdldCBOZWdvdGlhdGVkIE9BTS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjAgICAgICAgICAgIC8qKjwgU2V0IE5lZ290aWF0ZWQgT0FNLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkOworCisvKiogT0FNIFJlZ2lzdHJhdGlvbiBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERvIG5vdCBtb2RpZnkgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0ZTsgcHJvdmlkZSBtb3JlIHF1YWxpZmllcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFNldCB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIHRvIHJlZ2lzdGVyZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNldCB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIHRvIG5vdCByZWdpc3RlcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAgICAgLyoqPCBTZXQgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0ZSB0byByZWdpc3RlcmVkLCBidXQgYWxsb3cgZm9yIGZ1cnRoZXIgcXVhbGlmaWVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUUgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAgICAgICAgICAgIC8qKjwgU2V0IHRoZSByZWdpc3RyYXRpb24gc3RhdGUgdG8gbm90IHJlZ2lzdGVyZWQsIGJ1dCBhbGxvdyBmb3IgZnVydGhlciBxdWFsaWZpZXJzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb247CisKKy8qKiBPQU0gUmVnIEluZm8gVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR19JTkZPX1RZUEVfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTQgICAgICAgICAgIC8qKjwgVmVuZG9yLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGU7CisKKy8qKiBNYXN0ZXIgQ29udGV4dCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9ORVRXT1JLX1BPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTmV0d29yayBQb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExpbmsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfVVNFUl9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFVzZXIgUG9ydC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGU7CisKKy8qKiBDVEMgVmVyc2lvbiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9MQVRFU1RfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBMYXRlc3QgU3VwcG9ydGVkIFZlcnNpb24sIGN1cnJlbnRseSwgIEl0J3MgQ1RDIDIuMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZFUlNJT05fQ1RDMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQ1RDIDEuMCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVEMxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBDVEMgMS4zICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NUQzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IENUQyAyLjAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZFUlNJT05fQ1RDMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgQ1RDIDIuMSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVEMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4LCAgICAgICAgICAgLyoqPCBDVEMgMy4wICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NVQzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkzLCAgICAgICAgICAvKio8IENVQyAxLjAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZFUlNJT05fQ1VDMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTQsICAgICAgICAgIC8qKjwgQ1VDIDIuMCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVUMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NSAgICAgICAgICAgLyoqPCBDVUMgMy4wICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbjsKKworLyoqIE9OVSBNYXN0ZXIgUmVzcG9uc2UgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUkVTUE9OU0VfQ09ERV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUkVTUE9OU0VfQ09ERV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUkVTUE9OU0VfQ09ERV9CQURfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEJhZCBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1JFU1BPTlNFX0NPREVfTk9fUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBObyBSZXNvdXJjZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUkVTUE9OU0VfQ09ERV9IQVJEV0FSRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEhhcmR3YXJlIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUkVTUE9OU0VfQ09ERV9CQURfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEJhZCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX1NZU1RFTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2ICAgICAgICAgICAgIC8qKjwgU3lzdGVtIEJ1c3kuICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGU7CisKKy8qKiBPTlUgc3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX1NUQVRFX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZTsKKworLyoqIE1kaSBDcm9zc292ZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXIKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTURJX0NST1NTT1ZFUl9PQU1fTURJX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT0FNIE1kaSBBdXRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfQ1JPU1NPVkVSX09BTV9NREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPQU0gTWRpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfQ1JPU1NPVkVSX09BTV9NRElfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBPQU0gTWRpIFguICovCit9IGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyOworCisvKiogU2RtIFN0YXQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NETV9TVEFUX1FVQU5USVpFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFF1YW50aXplci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0RNX1NUQVRfQU1QTElUVURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQW1wbGl0dWRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TRE1fU1RBVF9QSEFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBQaGFzZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0OworCisvKiogVExTIEhhc2ggQWxnb3JpdGhtLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBU0hfQUxHT1JJVEhNX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm9uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBU0hfQUxHT1JJVEhNX01ENSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTUQ1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fU0hBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBTSEExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fU0hBMjI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTSEEyMjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQVNIX0FMR09SSVRITV9TSEEyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNIQTI1Ni4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBU0hfQUxHT1JJVEhNX1NIQTM4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgU0hBMzg0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fU0hBNTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYgICAgICAgICAgICAgLyoqPCBTSEE1MTIuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG07CisKKy8qKiBUTFMgU2lnbmF0dXJlIEFsZ29yaXRobS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX1NJR05BVFVSRV9BTEdPUklUSE1fQU5PTllNT1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQW5vbnltb3VzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfU0lHTkFUVVJFX0FMR09SSVRITV9SU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19TSUdOQVRVUkVfQUxHT1JJVEhNX0RTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX1NJR05BVFVSRV9BTEdPUklUSE1fRUNEU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgRUNEU0EuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobTsKKworLyoqIEJpbmFyeSBFbnRyeSBDVklELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkCit7CisgICAgdWludDE2X3QgY3ZpZDsgIC8qKjwgQ1ZJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkOworCisvKiogQmluYXJ5IEVudHJ5IE1BQy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjCit7CisgICAgdWludDE2X3Qgc3dpdGNoaW5nX2RvbWFpbjsgIC8qKjwgU3dpdGNoaW5nIERvbWFpbi4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWM7ICAgICAgLyoqPCBNQUMuICovCisgICAgdWludDhfdCBsaW5rX2lkOyAgICAgICAgICAgIC8qKjwgTGluayBJZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWM7CisKKy8qKiBCaW5hcnkgRW50cnkgUHJvZ3JhbW1hYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUKK3sKKyAgICB1aW50MzJfdCBwcm9ncmFtbWFibGVfZmllbGQwOyAgIC8qKjwgUHJvZ3JhbW1hYmxlIEZpZWxkIDAuICovCisgICAgdWludDMyX3QgcHJvZ3JhbW1hYmxlX2ZpZWxkMTsgICAvKio8IFByb2dyYW1tYWJsZSBGaWVsZCAxLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZTsKKworLyoqIEJpbmFyeSBFbnRyeSBTU00gSVAuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcAoreworICAgIHVpbnQxNl90IHN3aXRjaGluZ19kb21haW47ICAgICAgLyoqPCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIHVpbnQxNl90IHNzbV9zb3VyY2VfaWQ7ICAgICAgICAgLyoqPCBTU00gU291cmNlIElELiAqLworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcGFkZHJlc3M7ICAgLyoqPCBJUCBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcDsKKworLyoqIEJpbmFyeSBFbnRyeSBTVkxBTiArIENWTEFOLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuCit7CisgICAgdWludDE2X3Qgc3ZpZDsgIC8qKjwgU1ZJRC4gKi8KKyAgICB1aW50MTZfdCBjdmlkOyAgLyoqPCBDVklELiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW47CisKKy8qKiBQZXItY2hhbm5lbCBjb21tYW5kIG9wdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24KK3sKKyAgICB1aW50OF90IGNoYW5uZWxfaWQ7IC8qKjwgQ2hhbm5lbCBpbmRleCAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiBvcHRpb25fY29kZTsgICAgLyoqPCBPcGVyYXRpb24gY29kZSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbjsKKworLyoqIFBlci1jaGFubmVsIHJlc3VsdHMgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0Cit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAvKio8IENoYW5uZWwgaW5kZXggKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgcmVzdWx0X2NvZGU7ICAgLyoqPCBPcGVyYXRpb24gcmVzdWx0IGNvZGUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQ7CisKKy8qKiBDTUMgQ2xhc3NpZmllciBjb25maWd1cmF0aW9uIGRhdGEgZm9ybWF0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YQoreworICAgIHVpbnQzMl90IHN2Y19mbG93X2lkOyAgICAgICAgICAgLyoqPCBTZXJ2aWNlIEZsb3cgSUQgKi8KKyAgICB1aW50MzJfdCBjbGFzc2lmaWVyX2lkOyAgICAgICAgIC8qKjwgQ2xhc3NpZmllciBJRCAqLworICAgIHVpbnQ4X3QgZGlyZWN0aW9uOyAgICAgICAgICAgICAgLyoqPCBDbGFzc2lmaWVyIERpcmVjdGlvbiAoMSA9IERvd25zdHJlYW0sIDIgPSBVcHN0cmVhbSkgKi8KKyAgICB1aW50OF90IHN0YXRlOyAgICAgICAgICAgICAgICAgIC8qKjwgQ2xhc3NpZmllciBTdGF0ZSAoMSA9IEFjdGl2ZSwgMiA9IEluYWN0aXZlKSAqLworICAgIHVpbnQzMl90IHByaW9yaXR5OyAgICAgICAgICAgICAgLyoqPCBSdWxlIFByaW9yaXR5ICgxLi4yNTUpICovCisgICAgdWludDhfdCBpcHRvc19sb3c7ICAgICAgICAgICAgICAvKio8IExvdyB2YWx1ZSBvZiBJUCBUb1MgcmFuZ2UgKi8KKyAgICB1aW50OF90IGlwdG9zX2hpZ2g7ICAgICAgICAgICAgIC8qKjwgSGlnaCB2YWx1ZSBvZiBJUCBUb1MgcmFuZ2UgKi8KKyAgICB1aW50OF90IGlwdG9zX21hc2s7ICAgICAgICAgICAgIC8qKjwgSVAgVG9TIE1hc2sgdmFsdWUgKi8KKyAgICB1aW50MzJfdCBpcHByb3RvOyAgICAgICAgICAgICAgIC8qKjwgSVAgUHJvdG9jb2wgdmFsdWUgKi8KKyAgICB1aW50OF90IGlwYWRkcl90eXBlOyAgICAgICAgICAgIC8qKjwgSVAgQWRkcmVzcyBUeXBlICgwID0gVW5rbm93biwgMSA9IElQdjQsIDIgPSBJUHY2LCAzID0gSVB2NHosIDQgPSBJUHY2eiwgMTYgPSBETlMpICovCisgICAgdWludDhfdCBpcHNyY19hZGRyX2xlbmd0aDsgICAgICAvKio8IExlbmd0aCBvZiBJUCBTb3VyY2UgQWRkcmVzcyBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmlwc3JjX2FkZHI7ICAgICAgICAgICAgLyoqPCBJUCBTb3VyY2UgQWRkcmVzcyAqLworICAgIHVpbnQ4X3QgaXBzcmNfbWFza19sZW5ndGg7ICAgICAgLyoqPCBMZW5ndGggb2YgSVAgU291cmNlIE1hc2sgZmllbGQgKi8KKyAgICB1aW50OF90ICppcHNyY19tYXNrOyAgICAgICAgICAgIC8qKjwgSVAgU291cmNlIE1hc2sgKi8KKyAgICB1aW50OF90IGlwZHN0X2FkZHJfbGVuZ3RoOyAgICAgIC8qKjwgTGVuZ3RoIG9mIElQIERlc3RpbmF0aW9uIEFkZHJlc3MgZmllbGQgKi8KKyAgICB1aW50OF90ICppcGRzdF9hZGRyOyAgICAgICAgICAgIC8qKjwgSVAgRGVzdGluYXRpb24gQWRkcmVzcyAqLworICAgIHVpbnQ4X3QgaXBkc3RfbWFza19sZW5ndGg7ICAgICAgLyoqPCBMZW5ndGggb2YgSVAgRGVzdGluYXRpb24gTWFzayBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmlwZHN0X21hc2s7ICAgICAgICAgICAgLyoqPCBJUCBEZXN0aW5hdGlvbiBNYXNrICovCisgICAgdWludDMyX3Qgc3JjX3BvcnRfc3RhcnQ7ICAgICAgICAvKio8IFRDUC9VRFAgU291cmNlIFBvcnQgcmFuZ2Ugc3RhcnQgKi8KKyAgICB1aW50MzJfdCBzcmNfcG9ydF9lbmQ7ICAgICAgICAgIC8qKjwgVENQL1VEUCBTb3VyY2UgUG9ydCByYW5nZSBlbmQgKi8KKyAgICB1aW50MzJfdCBkc3RfcG9ydF9zdGFydDsgICAgICAgIC8qKjwgVENQL1VEUCBEZXN0aW5hdGlvbiBQb3J0IHJhbmdlIHN0YXJ0ICovCisgICAgdWludDMyX3QgZHN0X3BvcnRfZW5kOyAgICAgICAgICAvKio8IFRDUC9VRFAgRGVzdGluYXRpb24gUG9ydCByYW5nZSBlbmQgKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBkc3RfbWFjX2FkZHI7IC8qKjwgRGVzdGluYXRpb24gTUFDIEFkZHJlc3MgKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBkc3RfbWFjX21hc2s7IC8qKjwgRGVzdGluYXRpb24gTUFDIE1hc2sgKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBzcmNfbWFjX2FkZHI7IC8qKjwgU291cmNlIE1BQyBBZGRyZXNzICovCisgICAgdWludDhfdCBsMnByb3RvX3R5cGU7ICAgICAgICAgICAvKio8IFR5cGUgb2YgTDIgUHJvdG9jb2wgdG8gY2xhc3NpZnkgb24gKDAgPSBOb25lLCAxID0gRXRoZXJ0eXBlLCAyID0gRFNBUCwgMyA9IE1BQywgNCA9IEFsbCkgKi8KKyAgICB1aW50MzJfdCBsMnByb3RvX3ZhbHVlOyAgICAgICAgIC8qKjwgTDIgUHJvdG9jb2wgVmFsdWUgKi8KKyAgICB1aW50MzJfdCB1c2VyX3ByaW9yaXR5X2xvdzsgICAgIC8qKjwgODAyLjFxIENPUyByYW5nZSwgbG93IHZhbHVlICovCisgICAgdWludDMyX3QgdXNlcl9wcmlvcml0eV9oaWdoOyAgICAvKio8IDgwMi4xcSBDT1MgcmFuZ2UsIGhpZ2ggdmFsdWUgKi8KKyAgICB1aW50MzJfdCB2bGFuX2lkOyAgICAgICAgICAgICAgIC8qKjwgODAyLjFxIFZMQU4gSUQgKi8KKyAgICB1aW50MjRfdCBiaXRtYXA7ICAgICAgICAgICAgICAgIC8qKjwgQml0bWFwIGluZGljYXRpbmcgZXhwbGljaXRseSBjb25maWd1cmVkIGZpZWxkcyAqLworICAgIHVpbnQzMl90IGZsb3dfbGFiZWw7ICAgICAgICAgICAgLyoqPCBJUHY2IEZsb3cgTGFiZWwgICovCisgICAgdWludDMyX3QgY21pbTsgICAgICAgICAgICAgICAgICAvKio8IENhYmxlIE1vZGVtIEludGVyZmFjZSBNYXNrICovCisgICAgdWludDY0X3QgcGt0X21hdGNoZXM7ICAgICAgICAgICAvKio8IENvdW50IG9mIHBhY2tldHMgbWF0Y2hpbmcgdGhpcyBjbGFzc2lmaWVyICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhOworCisvKiogQ01DIEludGVyZmFjZSBSZXNwb25zZSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YQoreworICAgIHVpbnQxNl90IGludGZfaW5kZXg7ICAgICAgICAgICAgICAgIC8qKjwgVW5pcXVlIGludGVyZmFjZSBpbmRleCB3aXRoaW4gQ01DICovCisgICAgdWludDhfdCBpbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aDsgICAgLyoqPCBMZW5ndGggb2YgSW50ZXJmYWNlIERlc2NyaXB0aW9uIGZpZWxkICovCisgICAgdWludDhfdCAqaW50Zl9kZXNjcmlwdGlvbjsgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgRGVzY3JpcHRpb24gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlIGludGZfdHlwZTsgICAvKio8IEludGVyZmFjZSBUeXBlICovCisgICAgdWludDhfdCBpbnRmX3BoeV9hZGRyX2xlbmd0aDsgICAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgSW50ZXJmYWNlIFBoeXNpY2FsIEFkZHJlc3MgZmllbGQgKi8KKyAgICB1aW50OF90ICppbnRmX3BoeV9hZGRyOyAgICAgICAgIC8qKjwgSW50ZXJmYWNlIFBoeXNpY2FsIEFkZHJlc3MgZmllbGQgKi8KKyAgICB1aW50OF90IGludGZfYWxpYXNfbmFtZV9sZW5ndGg7IC8qKjwgTGVuZ3RoIG9mIEludGVyZmFjZSBBbGlhcyBOYW1lICovCisgICAgdWludDhfdCAqaW50Zl9hbGlhc19uYW1lOyAgICAgICAvKio8IEludGVyZmFjZSBBbGlhcyBOYW1lICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YTsKKworLyoqIENNQyBpbnRlcmZhY2Ugc3RhdGlzdGljcyBkYXRhIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YQoreworICAgIHVpbnQxNl90IGlmX2luZGV4OyAgLyoqPCBpZkluZGV4IG9mIG5ldHdvcmsgaW50ZXJmYWNlICovCisgICAgdWludDE2X3QgaWZfbXR1OyAgICAvKio8IGlmTXR1IG9mIG5ldHdvcmsgaW50ZXJmYWNlICovCisgICAgdWludDMyX3QgaWZfc3BlZWQ7ICAvKio8IGlmU3BlZWQgb2YgbmV0d29yayBpbnRlcmZhY2UgKGluIE1icHMpICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMgaWZfYWRtaW5fc3RhdHVzOyAgLyoqPCBpZkFkbWluU3RhdHVzIG9mIG5ldHdvcmsgaW50ZXJmYWNlICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMgaWZfb3Blcl9zdGF0dXM7ICAgLyoqPCBpZk9wZXJTdGF0dXMgb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICB1aW50MzJfdCBpZl9sYXN0X2NoYW5nZTsgICAgICAgICAgICAgICAgLyoqPCBpZkxhc3RDaGFuZ2Ugb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICB1aW50NjRfdCBpZl9oY2luX29jdGV0czsgICAgICAgICAgICAgICAgLyoqPCBDb3VudCBvZiBVUyBCeXRlcyBSZWNlaXZlZCAqLworICAgIHVpbnQ2NF90IGlmX2hjaW5fdWNhc3RfcGt0czsgICAgICAgICAgICAvKio8IENvdW50IG9mIFVTIFVuaWNhc3QgUGt0cyBSZWNlaXZlZCAqLworICAgIHVpbnQ2NF90IGlmX2hjaW5fbXVsdGljYXN0X3BrdHM7ICAgICAgICAvKio8IENvdW50IG9mIFVTIE11bHRpY2FzdCBQa3RzIFJlY2VpdmVkICovCisgICAgdWludDY0X3QgaWZfaGNpbl9icm9hZGNhc3RfcGt0czsgICAgICAgIC8qKjwgQ291bnQgb2YgVVMgQnJvYWRjYXN0IFBrdHMgUmVjZWl2ZWQgKi8KKyAgICB1aW50MzJfdCBpZl9pbl9kaXNjYXJkczsgICAgICAgICAgICAgICAgLyoqPCBDb3VudCBvZiBVUyBQa3RzIERpc2NhcmRlZCAqLworICAgIHVpbnQzMl90IGlmX2luX2Vycm9yczsgICAgICAgICAgICAgICAgICAvKio8IENvdW50IG9mIFVTIFBrdHMgUmVjZWl2ZWQgd2l0aCBFcnJvcnMgKi8KKyAgICB1aW50MzJfdCBpZl9pbl91bmtub3duX3Byb3RvczsgICAgICAgICAgLyoqPCBDb3VudCBvZiBVUyBQa3RzIFJlY2VpdmVkIG9mIFVua25vd24gUHJvdG9jb2wgVHlwZSAqLworICAgIHVpbnQ2NF90IGlmX2hjb3V0X29jdGV0czsgICAgICAgICAgICAgICAvKio8IENvdW50IG9mIERTIEJ5dGVzIFRyYW5zbWl0dGVkICovCisgICAgdWludDY0X3QgaWZfaGNvdXRfdWNhc3RfcGt0czsgICAgICAgICAgIC8qKjwgQ291bnQgb2YgRFMgVW5pY2FzdCBQa3RzIFRyYW5zbWl0dGVkICovCisgICAgdWludDY0X3QgaWZfaGNvdXRfbXVsdGljYXN0X3BrdHM7ICAgICAgIC8qKjwgQ291bnQgb2YgRFMgTXVsdGljYXN0IFBrdHMgVHJhbnNtaXR0ZWQgKi8KKyAgICB1aW50NjRfdCBpZl9oY291dF9icm9hZGNhc3RfcGt0czsgICAgICAgLyoqPCBDb3VudCBvZiBEUyBCcm9hZGNhc3QgUGt0cyBUcmFuc21pdHRlZCAqLworICAgIHVpbnQzMl90IGlmX291dF9kaXNjYXJkczsgICAgICAgICAgICAgICAvKio8IENvdW50IG9mIERTIFBrdHMgRGlzY2FyZGVkICovCisgICAgdWludDMyX3QgaWZfb3V0X2Vycm9yczsgICAgICAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgRFMgUGt0cyBub3QgdHJhbnNtaXR0ZWQgZHVlIHRvIEVycm9ycyAqLworICAgIHVpbnQ4X3QgaWZfbGlua191cF9kb3duX3RyYXBfZW5hYmxlOyAgICAvKio8IFdoZXRoZXIgbGluayB1cC9kb3duIHRyYXBzIHNob3VsZCBiZSBnZW5lcmF0ZWQgKi8KKyAgICB1aW50OF90IGlmX3Byb21pc2N1b3VzX21vZGU7ICAgICAgICAgICAgLyoqPCBXaGV0aGVyIGludGVyZmFjZSBpcyBpbiBwcm9taXNjdW91cyBtb2RlIG9yIG5vdCAqLworICAgIHVpbnQ4X3QgaWZfY29ubmVjdG9yX3ByZXNlbnQ7ICAgICAgICAgICAvKio8IFdoZXRoZXIgcGh5c2ljYWwgY29ubmVjdG9yIGV4aXN0cyBvbiBpbnRlcmZhY2UgKi8KKyAgICB1aW50MzJfdCBpZl9jb3VudGVyX2Rpc2NvbnRpbnVpdHlfdGltZTsgLyoqPCBUaW1lIHdoZW4gYW55IGNvdW50ZXIgc3VmZmVyZWQgYSBkaXNjb250aW51aXR5ICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGE7CisKKy8qKiBDTUMgU2VydmljZSBGbG93IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YQoreworICAgIHVpbnQzMl90IHN2Y19mbG93X2lkOyAgICAgICAgICAgICAgICAgICAvKio8IFNlcnZpY2UgRmxvdyBJRCAqLworICAgIHVpbnQxNl90IHNpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNlcnZpY2UgSWRlbnRpZmllciAoU0lEKSAqLworICAgIHVpbnQ4X3QgZGlyZWN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAvKio8IEZsb3cgRGlyZWN0aW9uICgxID0gRG93bnN0cmVhbSwgMiA9IFVwc3RyZWFtKSAqLworICAgIHVpbnQ4X3QgZmxvd190eXBlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IEZsb3cgVHlwZSAoMSA9IFByaW1hcnksIDIgPSBTZWNvbmRhcnkpICovCisgICAgdWludDhfdCBxb3NfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUW9zIFNldCBUeXBlICgwID0gQWN0aXZlLCAxID0gQWRtaXR0ZWQsIDIgPSBQcm92aXNpb25lZCkgKi8KKyAgICB1aW50MzJfdCBjaGFubmVsX3NldF9pZDsgICAgICAgICAgICAgICAgLyoqPCBDaGFubmVsIHNldCBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UgRmxvdyAqLworICAgIHVpbnQyNF90IGRzaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERTSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2aWNlIEZsb3cgKi8KKyAgICB1aW50OF90IG1heF9yZXF1ZXN0c19wZXJfc2lkX2NsdXN0ZXI7ICAgLyoqPCBNYXggcmVxdWVzdHMgYmVmb3JlIFNJRCBjbHVzdGVyIG11c3Qgc3dpdGNoICovCisgICAgdWludDMyX3QgbWF4X2J5dGVzX3Blcl9zaWRfY2x1c3RlcjsgICAgIC8qKjwgTWF4IGJ5dGVzIHRoYXQgY2FuIGJlIG91dHN0YW5kaW5nIGZvciBTSUQgY2x1c3RlciAqLworICAgIHVpbnQzMl90IHRvdGFsX2J5dGVzX3Blcl9zaWRfY2x1c3RlcjsgICAvKio8IFRvdGFsIGJ5dGVzIHRoYXQgY2FuIGJlIHJlcXVlc3RlZCBmb3IgU0lEIGNsdXN0ZXIgKi8KKyAgICB1aW50MTZfdCBtYXhfdGltZV9wZXJfc2lkX2NsdXN0ZXI7ICAgICAgLyoqPCBNYXggdGltZSAoaW4gbXNlYykgdGhhdCBjYW4gYmUgdXNlZCBmb3IgU0lEIGNsdXN0ZXIgKi8KKyAgICB1aW50OF90IHNlcnZpY2VfY2xhc3NfbGVuZ3RoOyAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgU2VydmljZSBDbGFzcyBOYW1lICovCisgICAgdWludDhfdCAqc2VydmljZV9jbGFzczsgICAgICAgICAgICAgICAgIC8qKjwgU2VydmljZSBDbGFzcyBOYW1lICovCisgICAgdWludDhfdCBwcmlvcml0eTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhZmZpYyBQcmlvcml0eSAoMC4uNykgKi8KKyAgICB1aW50OF90IHJlc2VxX2RzaWRfc3VwcG9ydDsgICAgICAgICAgICAgLyoqPCBEU0lEIFN1cHBvcnQgKDEgPSBUcnVlLCAyID0gRmFsc2UsIDMgPSBOL0EpICovCisgICAgdWludDMyX3QgbWF4X3JhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBTdXN0YWluZWQgVHJhZmZpYyBSYXRlIGluIGJwcyAqLworICAgIHVpbnQzMl90IG1heF9idXJzdDsgICAgICAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gVHJhZmZpYyBCdXJzdCBpbiBieXRlcyAqLworICAgIHVpbnQzMl90IG1pbl9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1pbmltdW0gR3VhcmFudGVlZCBSYXRlIGluIGJwcyAqLworICAgIHVpbnQxNl90IG1pbl9wa3Rfc2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IEFzc3VtZWQgTWluaW11bSBQYWNrZXQgc2l6ZSBpbiBieXRlcyAqLworICAgIHVpbnQxNl90IGFjdGl2ZV90aW1lb3V0OyAgICAgICAgICAgICAgICAvKio8IEFjdGl2ZSBQYXJhbWV0ZXIgU2V0IHRpbWVvdXQgaW4gc2Vjb25kcyAqLworICAgIHVpbnQxNl90IGFkbWl0dGVkX3RpbWVvdXQ7ICAgICAgICAgICAgICAvKio8IEFkbWl0dGVkIFBhcmFtZXRlciBTZXQgdGltZW91dCBpbiBzZWNvbmRzICovCisgICAgdWludDE2X3QgbWF4X2NvbmNhdF9idXJzdDsgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBDb25jYXRlbmF0ZWQgQnVyc3QgaW4gYnl0ZXMgKi8KKyAgICB1aW50OF90IHNjaGVkdWxpbmdfdHlwZTsgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBTY2hlZHVsaW5nIFR5cGUgKi8KKyAgICB1aW50MzJfdCBub21fcG9sbF9pbnR2bDsgICAgICAgICAgICAgICAgLyoqPCBOb21pbmFsIFBvbGxpbmcgSW50ZXJ2YWwgaW4gdXNlYyAqLworICAgIHVpbnQzMl90IHRvbF9wb2xsX2ppdHRlcjsgICAgICAgICAgICAgICAvKio8IFRvbGVyYXRlZCBQb2xsIEppdHRlciBpbiB1c2VjICovCisgICAgdWludDE2X3QgdW5zb2xfZ3JhbnRfc2l6ZTsgICAgICAgICAgICAgIC8qKjwgVW5zb2xpY2l0ZWQgR3JhbnQgU2l6ZSBpbiBieXRlcyAqLworICAgIHVpbnQzMl90IG5vbV9ncmFudF9pbnR2bDsgICAgICAgICAgICAgICAvKio8IE5vbWluYWwgR3JhbnQgSW50ZXJ2YWwgaW4gdXNlYyAqLworICAgIHVpbnQzMl90IHRvbF9ncmFudF9qaXR0ZXI7ICAgICAgICAgICAgICAvKio8IFRvbGVyYXRlZCBHcmFudCBKaXR0ZXIgaW4gdXNlYyAqLworICAgIHVpbnQ4X3QgdG9zX2FuZF9tYXNrX2xlbmd0aDsgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBUb1MgQU5EIE1hc2sgKi8KKyAgICB1aW50OF90ICp0b3NfYW5kX21hc2s7ICAgICAgICAgICAgICAgICAgLyoqPCBUb1MgQU5EIE1hc2sgKi8KKyAgICB1aW50OF90IHRvc19vcl9tYXNrX2xlbmd0aDsgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgVG9TIE9SIE1hc2sgKi8KKyAgICB1aW50OF90ICp0b3Nfb3JfbWFzazsgICAgICAgICAgICAgICAgICAgLyoqPCBUb1MgT1IgTWFzayAqLworICAgIHVpbnQzMl90IG1heF9sYXRlbmN5OyAgICAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gTGF0ZW5jeSBpbiB1c2VjICovCisgICAgdWludDhfdCByZXFfdHJhbnNfcG9saWN5X2xlbmd0aDsgICAgICAgIC8qKjwgTGVuZ3RoIG9mIFJlcXVlc3QvVHJhbnNtaXNzaW9uIFBvbGljeSAqLworICAgIHVpbnQ4X3QgKnJlcV90cmFuc19wb2xpY3k7ICAgICAgICAgICAgICAvKio8IFJlcXVlc3QvVHJhbnNtaXNzaW9uIFBvbGljeSAqLworICAgIHVpbnQzMl90IGJpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpdG1hcCBpbmRpY2F0aW5nIGV4cGxpY2l0bHkgY29uZmlndXJlZCBmaWVsZHMgKi8KKyAgICB1aW50MzJfdCByZXFkX2F0dHJpYl9tYXNrOyAgICAgICAgICAgICAgLyoqPCBSZXF1aXJlZCBhdHRyaWJ1dGUgbWFzayAqLworICAgIHVpbnQzMl90IGZvcmJpZF9hdHRyaWJfbWFzazsgICAgICAgICAgICAvKio8IEZvcmJpZGRlbiBhdHRyaWJ1dGUgbWFzayAqLworICAgIHVpbnQzMl90IGF0dHJpYl9hZ2dyX21hc2s7ICAgICAgICAgICAgICAvKio8IEF0dHJpYnV0ZSBhZ2dyZWdhdGlvbiBtYXNrICovCisgICAgdWludDhfdCBhdHRyaWJfbWFza19zdWNjZXNzOyAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIGlmIGNoYW5uZWwgYWRoZXJlcyB0byBtYXNrcyAoMSA9IFRydWUsIDIgPSBGYWxzZSkgKi8KKyAgICB1aW50OF90IGFwcGxpY2F0aW9uX2lkbGVuZ3RoOyAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgQXBwbGljYXRpb24gSWRlbnRpZmllciAqLworICAgIHVpbnQ4X3QgKmFwcGxpY2F0aW9uX2lkOyAgICAgICAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIElkZW50aWZpZXIgKi8KKyAgICB1aW50OF90IGNvbnRfcmVxX3dpbmRvd19tdWx0aTsgICAgICAgICAgLyoqPCBNdWx0aXBsaWVyIGZvciBkYXRhIGNvbnRlbnRpb24gcmVxdWVzdCBiYWNrb2ZmICovCisgICAgdWludDhfdCBid19yZXFfbXVsdGk7ICAgICAgICAgICAgICAgICAgIC8qKjwgTXVsdGlwbGllciBmb3IgYmFuZHdpZHRoIHJlcXVlc3QgKi8KKyAgICB1aW50MzJfdCBwZWFrX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBQZWFrIFRyYWZmaWMgUmF0ZSBpbiBicHMgKi8KKyAgICB1aW50MzJfdCBjcmVhdGVfdGltZTsgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lc3RhbXAgaW4gdGlja3Mgd2hlbiBTZXJ2aWNlIEZsb3cgd2FzIGNyZWF0ZWQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhOworCisvKiogQ05VIFNlcnZpY2UgRmxvdyBzdGF0aXN0aWNzIGRhdGEgZm9ybWF0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YQoreworICAgIHVpbnQzMl90IHN2Y19mbG93X2lkOyAgICAgICAvKio8IFNlcnZpY2UgRmxvdyBJRCAqLworICAgIHVpbnQ2NF90IHRvdGFsX3BrdF9jb3VudDsgICAvKio8IFRvdGFsIERhdGEgUGt0cyBSeC9UeCAqLworICAgIHVpbnQ2NF90IHRvdGFsX2J5dGVfY291bnQ7ICAvKio8IENvdW50IG9mIGFsbCBwb3N0LUhDUyBieXRlcyBSeC9UeCAqLworICAgIHVpbnQzMl90IGFjdGl2ZV90aW1lOyAgICAgICAvKio8IFRpbWUgdGhhdCBmbG93J3MgYmVlbiBhY3RpdmUsIGluIHNlY29uZHMgKi8KKyAgICB1aW50MzJfdCBpbnZhbGlkX3Boc19jb3VudDsgLyoqPCBQa3RzIFJ4IHdpdGggaW52YWxpZCBQSFNJICh1cHN0cmVhbSBvbmx5KSAqLworICAgIHVpbnQzMl90IHBrdHNfZHJvcHBlZDsgICAgICAvKio8IENvdW50IG9mIERTIFBrdHMgZHJvcHBlZCAqLworICAgIHVpbnQzMl90IHBrdHNfZGVsYXllZDsgICAgICAvKio8IENvdW50IG9mIERTIFBrdHMgZGVsYXllZCBkdWUgdG8gUmF0ZSBMaW1pdGluZyAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YTsKKworLyoqIENOVSBNQUMgQWRkcmVzcyBSYW5nZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgY251X21hY19hZGRyZXNzX3N0YXJ0OyAgICAvKio8IFN0YXJ0IG9mIENOVSBNYWMgQWRkcmVzcyBSYW5nZSAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGNudV9tYWNfYWRkcmVzc19lbmQ7ICAgICAgLyoqPCBFbmQgb2YgQ05VIE1hYyBBZGRyZXNzIFJhbmdlICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZTsKKworLyoqIENOVSBVUyBDaGFuIGRhdGEgZm9ybWF0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhCit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAgICAgICAgICAgICAgICAgLyoqPCBDTlUncyAxc3QgVXBzdHJlYW0gQ2hhbm5lbCBJRCAqLworICAgIHVpbnQxNl90IHBvd2VyX2xldmVsOyAgICAgICAgICAgICAgIC8qKjwgUG93ZXIgTGV2ZWwgaW4gMS8xMHRoIGRCbVYgKi8KKyAgICB1aW50MzJfdCBoaWdoX3Jlc190aW1pbmdfb2Zmc2V0OyAgICAvKio8IENOVSB0aW1pbmcgb2Zmc2V0IGluICg2LjI1IHVzZWMgLyAoNjQgKiAyNTYpKSAqLworICAgIHVpbnQ4X3QgZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoOyAgIC8qKjwgTGVuZ3RoIG9mIEVxdWFsaXphdGlvbiBEYXRhIEZpZWxkICovCisgICAgdWludDhfdCAqZXF1YWxpemF0aW9uX2RhdGE7ICAgICAgICAgLyoqPCBFcXVhbGl6YXRpb24gRGF0YSAqLworICAgIHVpbnQ2NF90IHVuZXJyb3JlZHM7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHVuZXJyb3JlZCBjb2Rld29yZHMgKi8KKyAgICB1aW50NjRfdCBjb3JyZWN0ZWRzOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjb3JyZWN0ZWQgY29kZXdvcmRzICovCisgICAgdWludDY0X3QgdW5jb3JyZWN0YWJsZXM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMgKi8KKyAgICB1aW50MzJfdCBzbnI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNpZ25hbCB0byBOb2lzZSBSYXRpbyBpbiB1bml0cyBvZiAxLzEwIGRCICovCisgICAgdWludDhfdCBtaWNyb19yZWZsZWN0aW9uczsgICAgICAgICAgLyoqPCBNZWFzdXJlZCBtaWNyb3JlZmxlY3Rpb25zIGluIHVuaXRzIG9mIGRCYyAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhOworCisvKiogQ05VIFN0YXR1cyBSZXNwb25zZSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YQoreworICAgIHVpbnQzMl90IGlkeDsgICAgICAgICAgICAgICAgICAgLyoqPCBVbmlxdWUgQ05VIGluZGV4IHdpdGhpbiBDTUMgKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgTUFDIEFkZHJlc3Mgb2YgQ05VICovCisgICAgdWludDhfdCB1c2NoYW5fY291bnQ7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBDTlVzIGFjdGl2ZSBVUyBDaGFucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKnVzY2hhbl9kYXRhOyAgICAgICAgICAgICAvKio8IENOVSBQZXItVVMgY2hhbm5lbCBkYXRhICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSBjb25uZWN0aXZpdHlfc3RhdGU7IC8qKjwgQ29ubmVjdGl2aXR5IFN0YXRlICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uIGRvY3Npc192ZXJzaW9uOyAgICAgICAgIC8qKjwgVmVyc2lvbiBvZiBET0NTSVMgdGhhdCBDTlUgaXMgb3BlcmF0aW5nIGluICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlIGlwYWRkcl90eXBlOyAgICAgICAgICAgICAgIC8qKjwgVHlwZSBvZiBJUCBBZGRyICovCisgICAgdWludDhfdCBpcGFkZHJfbGVuZ3RoOyAgICAgICAgICAvKio8IExlbmd0aCBvZiBJUCBBZGRyIHZhbHVlIGZpZWxkICovCisgICAgdWludDhfdCAqaXBhZGRyX3ZhbHVlOyAgICAgICAgICAvKio8IElQdjQgb3IgSVB2NiBBZGRyZXNzICovCisgICAgdWludDMyX3QgdGltZXN0YW1wOyAgICAgICAgICAgICAvKio8IFZhbHVlIG9mIHN5c1VwdGltZSB3aGVuIGxhc3QgdXBkYXRlZCAqLworICAgIHVpbnQ4X3Qgc2Zsb3dfY291bnQ7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgU2VydmljZSBGbG93cyBvbiBDTlUgKi8KKyAgICB1aW50MzJfdCAqc2Zsb3dfaWQ7ICAgICAgICAgICAgIC8qKjwgTGlzdCBvZiBTZXJ2aWNlIEZsb3cgSURzICovCisgICAgdWludDhfdCBsaW5rX2xvY2FsX2FkZHJfbGVuZ3RoOyAvKio8IExlbmd0aCBvZiBMaW5rIExvY2FsIEFkZHJlc3MgKi8KKyAgICB1aW50OF90ICpsaW5rX2xvY2FsX2FkZHI7ICAgICAgIC8qKjwgTGluayBMb2NhbCBBZGRyZXNzICovCisgICAgdWludDE2X3QgbWFjX2RvbWFpbl9pbmRleDsgICAgICAvKio8IENNQyBNQUMgaW5kZXggd2hlcmUgQ05VIGlzIHJlZ2lzdGVyZWQgKi8KKyAgICB1aW50MzJfdCBzZXJ2aWNlX2dyb3VwX2lkOyAgICAgIC8qKjwgQ01DIE1BQyBEb21haW4gU2VydmljZSBHcm91cCBJZCAqLworICAgIHVpbnQ4X3QgcmNwX2lkbGVuZ3RoOyAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgUkNQLUlEICovCisgICAgdWludDhfdCAqcmNwX2lkOyAgICAgICAgICAgICAgICAvKio8IFJDUC1JRCBWYWx1ZSAqLworICAgIHVpbnQzMl90IHJjY19pZDsgICAgICAgICAgICAgICAgLyoqPCBSQ0MtSUQgKi8KKyAgICB1aW50MzJfdCByY3NfaWQ7ICAgICAgICAgICAgICAgIC8qKjwgUkNTLUlEICovCisgICAgdWludDMyX3QgdGNzX2lkOyAgICAgICAgICAgICAgICAvKio8IFRDUy1JRCAqLworICAgIHVpbnQzMl90IGxhc3RfcmVnaXN0ZXJfdGltZTsgICAgLyoqPCBUaW1lc3RhbXAgd2hlbiBDTlUgbGFzdCByZWdpc3RlcmVkICovCisgICAgdWludDMyX3QgYWRkcl9yZXNvbHZlX3JlcXVlc3RzOyAvKio8IE51bWJlciBvZiByZXF1ZXN0cyByZWNlaXZlZCByZWxhdGluZyB0byBJUCByZXNvbHV0aW9uIGZvciBDTlUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhOworCisvKiogUGVyLWRvd25zdHJlYW0gY2hhbm5lbCBwcm9wZXJ0aWVzIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcworeworICAgIHVpbnQ4X3QgY2hhbm5lbF9pZDsgICAgICAgICAvKio8IERvd25zdHJlYW0gY2hhbm5lbCBpbmRleCAqLworICAgIGJjbW9zX2Jvb2wgaXNfZW5hYmxlZDsgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRoZSBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKyAgICB1aW50MzJfdCBjZW50ZXJfZnJlcXVlbmN5OyAgLyoqPCBDZW50ZXIgZnJlcXVlbmN5IGluIEh6ICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gbW9kdWxhdGlvbjsgICAgIC8qKjwgQ2hhbm5lbCBtb2R1bGF0aW9uIHR5cGUgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggYW5uZXg7ICAgICAgICAgICAgICAgLyoqPCBDaGFubmVsIGFubmV4IHR5cGUgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgaW50ZXJsZWF2ZXI7ICAgLyoqPCBDaGFubmVsIGludGVybGVhdmVyIGRlcHRoIHZhbHVlICovCisgICAgdWludDE2X3QgcG93ZXJfbGV2ZWw7ICAgICAgIC8qKjwgUG93ZXIgbGV2ZWwgZm9yIGNoYW5uZWwgaW4gdGVudGhzIGRCbVYgKi8KKyAgICB1aW50MTZfdCBpbnRlcmZhY2VfaW5kZXg7ICAgLyoqPCBJbnRlcmZhY2UgaW5kZXggb24gYSBnZXQgLyByZXNlcnZlZCBvbiBhIHNldCAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllczsKKworLyoqIFBlci11cHN0cmVhbSBjaGFubmVsIHByb3BlcnRpZXMgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcworeworICAgIHVpbnQ4X3QgY2hhbm5lbF9pZDsgICAgICAgICAvKio8IFVwc3RyZWFtIGNoYW5uZWwgaW5kZXggKi8KKyAgICBiY21vc19ib29sIGlzX2VuYWJsZWQ7ICAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCB0aGUgY2hhbm5lbCBpcyBlbmFibGVkICovCisgICAgdWludDMyX3QgY2VudGVyX2ZyZXF1ZW5jeTsgIC8qKjwgQ2VudGVyIGZyZXF1ZW5jeSBpbiBIeiAqLworICAgIHVpbnQzMl90IGNoYW5uZWxfd2lkdGg7ICAgICAvKio8IFdpZHRoIG9mIGNoYW5uZWwgaW4gSHogKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlIGNoYW5uZWxfcHJvZmlsZV90eXBlOyAgLyoqPCBDaGFubmVsIHByb2ZpbGUgdHlwZSAqLworICAgIGJjbW9zX2Jvb2wgaXNfc2FjMnNpbmMyZW5hYmxlZDsgICAgIC8qKjwgV2hldGhlciBvciBub3QgU2FjMlNpbmMyIG1vZGUgaXMgZW5hYmxlZCAqLworICAgIHVpbnQzMl90IG1pbmlzbG90X3NpemU7ICAgICAgICAgICAgIC8qKjwgQ2hhbm5lbCBNaW5pc2xvdCBTaXplIGluIDYuMjUgdXNlYyB0aWNrIHVuaXRzICovCisgICAgdWludDMyX3QgdHJhbnNtaXRfdGltaW5nX29mZnNldDsgICAgLyoqPCBUaW1pbmcgb2Zmc2V0IGluIDEvNjR0aCBvZiA2LjI1IHVzZWMgdGljayB1bml0cyAqLworICAgIHVpbnQ4X3QgaW5pdGlhbF9yYW5naW5nX2JhY2tvZmY7ICAgIC8qKjwgUmFuZ2luZyBCYWNrb2ZmIFdpbmRvdyBTdGFydCAqLworICAgIHVpbnQ4X3QgZmluYWxfcmFuZ2luZ19iYWNrb2ZmOyAgICAgIC8qKjwgUmFuZ2luZyBCYWNrb2ZmIFdpbmRvdyBFbmQgKi8KKyAgICB1aW50OF90IGluaXRpYWxfZGF0YV9iYWNrb2ZmOyAgICAgICAvKio8IERhdGEgQmFja29mZiBXaW5kb3cgU3RhcnQgKi8KKyAgICB1aW50OF90IGZpbmFsX2RhdGFfYmFja29mZjsgICAgICAgICAvKio8IERhdGEgQmFja29mZiBXaW5kb3cgRW5kICovCisgICAgdWludDhfdCBhY3RpdmVfc2NkbWFfY29kZXM7ICAgICAgICAgLyoqPCBBY3RpdmUgU0NETUEgQ29kZXMgKi8KKyAgICB1aW50OF90IGNvZGVzX3Blcl9zbG90OyAgICAgICAgICAgICAvKio8IFNDRE1BIENvZGVzIHBlciBNaW5pc2xvdCAqLworICAgIHVpbnQ4X3Qgc2NkbWFfZnJhbWVfc2l6ZTsgICAgICAgICAgIC8qKjwgU0NETUEgRnJhbWUgU2l6ZSBpbiB1bml0cyBvZiBzcHJlYWRpbmcgaW50ZXJ2YWxzICovCisgICAgdWludDE2X3QgaG9wcGluZ19zZWVkOyAgICAgICAgICAgICAgLyoqPCBTQ0RNQSBDb2RlIEhvcHBpbmcgU2VlZCAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGUgbW9kdWxhdGlvbl90eXBlOyAgICAvKio8IENoYW5uZWwgbW9kdWxhdGlvbiB0eXBlICovCisgICAgdWludDhfdCBwcmVfZXF1YWxpemF0aW9uX3NldHRpbmc7ICAgLyoqPCBQcmUtRXF1YWxpemF0aW9uIFNldHRpbmcgKDEtb24sIDItb2ZmKSAqLworICAgIHVpbnQxNl90IGludGVyZmFjZV9pbmRleDsgICAgICAgICAgIC8qKjwgSW50ZXJmYWNlIGluZGV4IG9uIGEgZ2V0IC8gcmVzZXJ2ZWQgb24gYSBzZXQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzOworCisvKiogUGVyLXVwc3RyZWFtIGNoYW5uZWwgc2lnbmFsIHF1YWxpdHkgaW5mbyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkKK3sKKyAgICB1aW50MTZfdCBpbnRlcmZhY2VfaW5kZXg7ICAgICAgIC8qKjwgVXBzdHJlYW0gY2hhbm5lbCBpZkluZGV4ICovCisgICAgdWludDhfdCBjb250ZW50aW9uX2ludGVydmFsczsgICAvKio8IEFyZSBjb250ZW50aW9uIGludGVydmFscyBpbmNsdWRlZCBpbiBjb3VudHMgKDE9eWVzLCAyPW5vKSAqLworICAgIHVpbnQ2NF90IHVuZXJyb3JlZHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdW5lcnJvcmVkIGNvZGV3b3JkcyAqLworICAgIHVpbnQ2NF90IGNvcnJlY3RlZHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY29ycmVjdGVkIGNvZGV3b3JkcyAqLworICAgIHVpbnQ2NF90IHVuY29ycmVjdGFibGVzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMgKi8KKyAgICB1aW50MzJfdCBzbnI7ICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmFsIHRvIE5vaXNlIFJhdGlvIGluIHVuaXRzIG9mIDEvMTAgZEIgKi8KKyAgICB1aW50OF90IG1pY3JvX3JlZmxlY3Rpb25zOyAgICAgIC8qKjwgTWVhc3VyZWQgbWljcm9yZWZsZWN0aW9ucyBpbiB1bml0cyBvZiBkQmMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHk7CisKKy8qKiBQZXItdXBzdHJlYW0gY2hhbm5lbCBwb3dlciAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcgoreworICAgIHVpbnQ4X3QgY2hhbm5lbF9pZDsgICAgICAgICAvKio8IFVwc3RyZWFtIGNoYW5uZWwgaW5kZXggKi8KKyAgICB1aW50MTZfdCBpbnB1dF9wb3dlcl9sZXZlbDsgLyoqPCBJbnB1dCBQb3dlciBMZXZlbCAoaW4gdGVudGhzIGRCKSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyOworCisvKiogQ01DIE9BTSBQRFUgYmFzZSBzdHJ1Y3R1cmUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZQoreworICAgIHVpbnQ4X3QgdmVyc2lvbjsgICAgLyoqPCBWZXJzaW9uIG51bWJlciAqLworICAgIHVpbnQxNl90IHBhY2tldF9pZDsgLyoqPCBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3BlY2lmaWMgQlJDTSBPQU0gdHJhbnNhY3Rpb24uICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgb3Bjb2RlOyAvKio8IFRoZSBhY3R1YWwgY29tbWFuZFxmdW5jdGlvbiBiZWluZyByZWZlcmVuY2VkIGJ5IHRoZSBPQU0gbWVzc2FnZSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gRG93bnN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgIC8qKjwgUGVyIGRvd25zdHJlYW0gY2hhbm5lbCBwcm9wZXJ0aWVzICovCisgICAgICAgIH0gc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIERvd25zdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICpkb3duc3RyZWFtX2NoYW5uZWxzOyAgIC8qKjwgUGVyIGRvd25zdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICpkb3duc3RyZWFtX2NoYW5uZWxzOyAgICAgICAvKio8IFBlciBkb3duc3RyZWFtIGNoYW5uZWwgSURzIHRvIGdldCAqLworICAgICAgICB9IGdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqZG93bnN0cmVhbV9jaGFubmVsczsgICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBnZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnVwc3RyZWFtX2NoYW5uZWxzOyAgICAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIHByb3BlcnRpZXMgKi8KKyAgICAgICAgfSBzZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICp1cHN0cmVhbV9jaGFubmVsczsgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgdWludDhfdCAqdXBzdHJlYW1fY2hhbm5lbHM7ICAgICAgICAgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCBJRHMgdG8gZ2V0ICovCisgICAgICAgIH0gZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICp1cHN0cmVhbV9jaGFubmVsczsgICAgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cF9pZDsgICAvKio8IEdyb3VwIElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kIG1ldGhvZDsgICAgLyoqPCBMb2FkIEJhbGFuY2luZyBNZXRob2QgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiByZXF1ZXN0X29wdGlvbjsgLyoqPCBSZXF1ZXN0IE9wdGlvbiAqLworICAgICAgICB9IHNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cF9pZDsgICAvKio8IEdyb3VwIElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSByZXN1bHRfY29kZTsgICAvKio8IFJlc3VsdCBDb2RlICovCisgICAgICAgIH0gc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cF9pZDsgICAgICAgICAgICAgICAgICAgLyoqPCBHcm91cCBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIERvd25zdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICpkb3duc3RyZWFtX2NoYW5uZWxzOyAgIC8qKjwgUGVyIGRvd25zdHJlYW0gY2hhbm5lbCBvcHRpb25zICovCisgICAgICAgIH0gc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gRG93bnN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBzZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICp1cHN0cmVhbV9jaGFubmVsczsgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCBvcHRpb25zICovCisgICAgICAgIH0gc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cF9pZDsgICAgICAgICAgICAgICAgICAgLyoqPCBHcm91cCBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdXBzdHJlYW1fY2hhbm5lbHM7IC8qKjwgUGVyIHVwc3RyZWFtIGNoYW5uZWwgcmVzdWx0cyAqLworICAgICAgICB9IHNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIEludGVyZmFjZXMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICp1cHN0cmVhbV9pbnRlcmZhY2VzOyAgICAgIC8qKjwgUGVyIHVwc3RyZWFtIGlmSW5kaWNlcyB0byBnZXQgKi8KKyAgICAgICAgfSBnZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkgKnVwc3RyZWFtX2ludGVyZmFjZXM7ICAvKio8IFBlciB1cHN0cmVhbSBpZkluZGljZXMgdG8gZ2V0ICovCisgICAgICAgIH0gZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjbnVfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBDTlVzIHRvIHJldHJpZXZlIHN0YXR1cyBmcm9tICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqY251X21hY19hZGRyZXNzOyAvKio8IExpc3Qgb2YgQ05VIE1BQyBBZGRyZXNzZXMgKi8KKyAgICAgICAgfSBnZXRfY251X3N0YXR1c19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjbnVfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBDTlVzIHdpdGggaW5mbyBpbiB0aGUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqY251X3N0YXR1c19kYXRhOyAgLyoqPCBMaXN0IG9mIENOVSBTdGF0dXMgRGF0YSBzdHJ1Y3R1cmVzICovCisgICAgICAgIH0gZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3ZjX2Zsb3dfaWRjb3VudDsgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3cgSURzIGluIHJlcXVlc3QgKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICpzdmNfZmxvd19pZHM7ICAgICAvKio8IFNlcnZpY2UgRmxvdyBJRCBMaXN0ICovCisgICAgICAgIH0gZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgU2VydmljZSBGbG93cyBpbiByZXNwb25zZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgKnN2Y19mbG93X2RhdGE7ICAvKio8IFNlcnZpY2UgRmxvdyBkYXRhIGxpc3QgKi8KKyAgICAgICAgfSBnZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBpbnRmX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBDTUMgSW50ZXJmYWNlcyB3aXRoIGluZm8gaW4gdGhlIHJlc3BvbnNlICovCisgICAgICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXA7ICAgICAvKio8IFRpbWVzdGFtcCB3aGVuIGludGVyZmFjZXMgdGFibGUgd2FzIGxhc3QgbW9kaWZpZWQgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqY21jX2ludGVyZmFjZV9kYXRhOyAgICAvKio8IExpc3Qgb2YgQ01DIEludGVyZmFjZSBEYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgfSBnZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGludGVyZmFjZV9pbmRleDsgICAvKio8IE1BQyBEb21haW4gaWZJbmRleCAqLworICAgICAgICAgICAgdWludDMyX3QgaW52YWxpZF9ybmdfcmVxczsgIC8qKjwgQ291bnQgb2YgaW52YWxpZCByYW5nZSByZXF1ZXN0cyByZWNlaXZlZCAqLworICAgICAgICAgICAgdWludDMyX3Qgcm5nX2Fib3J0czsgICAgICAgIC8qKjwgQ291bnQgb2YgcmFuZ2luZyBhdHRlbXB0cyBhYm9ydGVkICovCisgICAgICAgICAgICB1aW50MzJfdCBpbnZhbGlkX3JlZ19yZXFzOyAgLyoqPCBDb3VudCBvZiBpbnZhbGlkIFJFRy1SRVEgbWVzc2FnZXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGZhaWxlZF9yZWdfcmVxczsgICAvKio8IENvdW50IG9mIGZhaWxlZCByZWdpc3RyYXRpb24gYXR0ZW1wdHMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGludmFsaWRfZGF0YV9yZXFzOyAvKio8IENvdW50IG9mIGludmFsaWQgZGF0YSByZXF1ZXN0IG1lc3NhZ2VzIHJlY2VpdmVkICovCisgICAgICAgICAgICB1aW50MzJfdCB0NXRpbWVvdXRzOyAgICAgICAgLyoqPCBDb3VudCBvZiBUNSBUaW1lciBleHBpcmF0aW9ucyAqLworICAgICAgICB9IGdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaW50Zl9jb3VudDsgICAgICAgICAvKio8IE51bWJlciBvZiBDTUMgaW50ZXJmYWNlcyB0byByZXRyaWV2ZSBzdGF0dXMgZnJvbSAqLworICAgICAgICAgICAgdWludDE2X3QgKmludGZfaW5kZXg7ICAgICAgIC8qKjwgTGlzdCBvZiBDTUMgaW50ZXJmYWNlIGlmSW5kaWNlcyAqLworICAgICAgICB9IGdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaW50ZXJmYWNlc19jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBOZXR3b3JrIEludGVyZmFjZXMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEgKm5ldHdvcmtfaW50ZXJmYWNlczsgICAvKio8IFBlciBuZXR3b3JrIGludGVyZmFjZSBzdGF0cyBkYXRhICovCisgICAgICAgIH0gZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3ZjX2Zsb3dfaWRjb3VudDsgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3cgSURzIGluIHJlcXVlc3QgKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICpzdmNfZmxvd19pZHM7ICAgICAvKio8IFNlcnZpY2UgRmxvdyBJRCBMaXN0ICovCisgICAgICAgIH0gZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3ZjX2Zsb3dfY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3dzIGluIHJlc3BvbnNlICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgKnN2Y19mbG93X2RhdGE7IC8qKjwgU2VydmljZSBGbG93IGNvbmZpaWd1cmF0aW9uIGRhdGEgbGlzdCAqLworICAgICAgICB9IGdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OyAgIC8qKjwgTnVtYmVyIG9mIFNlcnZpY2UgRmxvdyBJRHMgaW4gcmVxdWVzdCAqLworICAgICAgICAgICAgdWludDE2X3QgKnN2Y19mbG93X2lkczsgICAgIC8qKjwgU2VydmljZSBGbG93IElEIExpc3QgKi8KKyAgICAgICAgfSBnZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGNsYXNzaWZpZXJfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgU2VydmljZSBGbG93L0NsYXNzaWZpZXIgcGFpcnMgaW4gcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICpjbGFzc2lmaWVyX2RhdGE7ICAgLyoqPCBTZXJ2aWNlIEZsb3cvQ2xhc3NpZmllciBwYWlyIGRhdGEgbGlzdCAqLworICAgICAgICB9IGdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgdWludDhfdCAqdXBzdHJlYW1fY2hhbm5lbHM7ICAgICAgICAgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCBJRHMgdG8gZ2V0ICovCisgICAgICAgIH0gZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp1cHN0cmVhbV9jaGFubmVsczsgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciAqdXBzdHJlYW1fY2hhbm5lbHM7IC8qKjwgUGVyIHVwc3RyZWFtIGNoYW5uZWwgcmVzdWx0cyAqLworICAgICAgICB9IHNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgcmVzdWx0X2NvZGU7ICAgICAgICAgICAgICAgLyoqPCBSZXN1bHQgb2Ygb3BlcmF0aW9uICovCisgICAgICAgICAgICB1aW50MTZfdCBjaGFubmVsX29uZV9wb3dlcjsgICAgIC8qKjwgSW5wdXQgcG93ZXIgbGV2ZWwgZm9yIFVTIENoYW5uZWwgMSAqLworICAgICAgICAgICAgdWludDE2X3QgY2hhbm5lbF90d29fcG93ZXI7ICAgICAvKio8IElucHV0IHBvd2VyIGxldmVsIGZvciBVUyBDaGFubmVsIDIgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNoYW5uZWxfdGhyZWVfcG93ZXI7ICAgLyoqPCBJbnB1dCBwb3dlciBsZXZlbCBmb3IgVVMgQ2hhbm5lbCAzICovCisgICAgICAgICAgICB1aW50MTZfdCBjaGFubmVsX2ZvdXJfcG93ZXI7ICAgIC8qKjwgSW5wdXQgcG93ZXIgbGV2ZWwgZm9yIFVTIENoYW5uZWwgNCAqLworICAgICAgICB9IHNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cF9pZDsgICAgICAgICAgICAgICAvKio8IEdyb3VwIElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiByZXF1ZXN0X29wdGlvbjsgLyoqPCBSZXF1ZXN0IE9wdGlvbiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlIGNudV9tYWNfcmFuZ2U7ICAvKio8IENOVSBNYWMgQWRkcmVzcyBSYW5nZSAqLworICAgICAgICB9IHNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHJlc3VsdF9jb2RlOyAgICAgICAvKio8IFJlc3VsdCBDb2RlICovCisgICAgICAgIH0gc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb24gcmVxdWVzdF9vcHRpb247IC8qKjwgUmVxdWVzdCBPcHRpb24gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGNudV9tYWNfYWRkcmVzc19zdGFydDsgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBvZiBDTlUgTWFjIEFkZHJlc3MgUmFuZ2UgKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGNudV9tYWNfYWRkcmVzc19lbmQ7ICAgICAgICAgICAgICAgICAgLyoqPCBFbmQgb2YgQ05VIE1hYyBBZGRyZXNzIFJhbmdlICovCisgICAgICAgIH0gc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSByZXN1bHRfY29kZTsgICAgICAgLyoqPCBSZXN1bHQgQ29kZSAqLworICAgICAgICB9IHNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cF9pZDsgICAvKio8IEdyb3VwIElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kIG1ldGhvZDsgICAgLyoqPCBMb2FkIEJhbGFuY2luZyBNZXRob2QgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gRG93bnN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgdWludDhfdCAqZG93bnN0cmVhbV9jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExpc3Qgb2YgRG93bnN0cmVhbSBDaGFubmVsIElEcyAqLworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgdWludDhfdCAqdXBzdHJlYW1fY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExpc3Qgb2YgVXBzdHJlYW0gQ2hhbm5lbCBJRHMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzdHJpY3Rpb25zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUmVzdHJpY3Rpb25zICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgKnJlc3RyaWN0aW9uczsgIC8qKjwgTGlzdCBvZiBSZXN0cmljdGlvbiByYW5nZXMgKi8KKyAgICAgICAgfSBzZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHJlc3VsdF9jb2RlOyAgIC8qKjwgUmVzdWx0IENvZGUgKi8KKyAgICAgICAgfSBzZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZTsKKworLyoqIENlcnRpZmljYXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlCit7CisgICAgdWludDI0X3Qgc2l6ZTsgICAgICAgICAgICAgIC8qKjwgU2l6ZS4gKi8KKyAgICB1aW50OF90ICpjZXJ0aWZpY2F0ZV9kYXRhOyAgLyoqPCBDZXJ0aWZpY2F0ZSBEYXRhLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGU7CisKKy8qKiBDVEMgQWN0aW9uIFZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IHBoeV9hZG1pbl9jb250cm9sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBhdXRvX2FkbWluX2NvbnRyb2w7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZTsKKworLyoqIEN0YyBBbGFybSBFbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3Qgb2JqZWN0X3R5cGU7IC8qKjwgT2JqZWN0IFR5cGUuICovCisgICAgdWludDMyX3Qgb2JqZWN0X2luc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3QgSW5zdGFuY2UuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgYWxhcm1faWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBBbGFybSBJRC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWVfc3RhbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRpbWUgU3RhbXAuICovCisgICAgICAgICAgICB1aW50OF90IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAweDAwIDogUmVwb3J0aW5nIEFsYXJtICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB0aW1lX3N0YW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lIFN0YW1wLiAqLworICAgICAgICAgICAgdWludDhfdCBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMHgwMCA6IFJlcG9ydGluZyBBbGFybSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlIGFsYXJtX2NvZGU7ICAgIC8qKjwgQWxhcm0gQ29kZS4gKi8KKyAgICAgICAgfSBvbnVfcG93ZXJfYWxhcm07CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWVfc3RhbXA7ICAgIC8qKjwgVGltZSBTdGFtcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGU7ICAgICAgICAgIC8qKjwgMHgwMCA6IFJlcG9ydGluZyBBbGFybSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGUgYWxhcm1fY29kZTsgIC8qKjwgQWxhcm0gQ29kZS4gKi8KKyAgICAgICAgfSBvbnVfcG9uX2lmX3N3aXRjaDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnk7CisKKy8qKiBDVEMgQXR0cmlidXRlIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gcGh5X2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gYXV0b19uZWdfYWRtaW5fc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlY2hub2xvZ2llc19jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVGVjaG5vbG9naWVzICovCisgICAgICAgICAgICB1aW50MzJfdCAqdGVjaG5vbG9naWVzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXV0by1uZWdvdGlhdGlvbiB0ZWNobm9sb2d5IGJpdG1hcHMgKElFRUUgODAyLjMtMjAwNSBjbGF1c2UgNDApICovCisgICAgICAgIH0gYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB0ZWNobm9sb2dpZXNfY291bnQ7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFRlY2hub2xvZ2llcyAqLworICAgICAgICAgICAgdWludDMyX3QgKnRlY2hub2xvZ2llczsgICAgICAgICAgICAgICAgICAgICAvKio8IEF1dG8tbmVnb3RpYXRpb24gdGVjaG5vbG9neSBiaXRtYXBzIChJRUVFIDgwMi4zLTIwMDUgY2xhdXNlIDQwKSAqLworICAgICAgICB9IGF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0IHN1cHBvcnQ7ICAgIC8qKjwgU3VwcG9ydC4gKi8KKyAgICAgICAgfSBmZWNfYWJpbGl0eTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGUgc3RhdGU7ICAgICAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IGZlY19tb2RlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZTsKKworLyoqIENUQyBDaHVybmluZyBQcm92IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZSBjb2RlOyAgLyoqPCBDb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpbl91c2Vfa2V5X2luZGV4OyAgICAgICAgICAgLyoqPCBJbi1Vc2UgS2V5IEluZGV4LiAqLworICAgICAgICB9IG5ld19rZXlfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBuZXdfa2V5X2luZGV4OyAgICAgICAgICAgICAgLyoqPCBOZXcgS2V5IEluZGV4LiAqLworICAgICAgICAgICAgdWludDhfdCBjaHVybmluZ19rZXkwWzNdOyAgICAgICAgICAgLyoqPCAzLWJ5dGUgY2h1cm5pbmcga2V5IDAuICBGb3IgMUcsIHRoaXMgaXMgdGhlIG9ubHkga2V5LiAgRm9yIDEwRywgdGhpcyBpcyB0aGUgZmlyc3Qgb2YgMyAzLWJ5dGUga2V5cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY2h1cm5pbmdfa2V5MVszXTsgICAgICAgICAgIC8qKjwgMy1ieXRlIGNodXJuaW5nIGtleSAxLiAgT25seSBwcmVzZW50IGluIDEwRy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY2h1cm5pbmdfa2V5MlszXTsgICAgICAgICAgIC8qKjwgMy1ieXRlIGNodXJuaW5nIGtleSAyLiAgT25seSBwcmVzZW50IGluIDEwRy4gKi8KKyAgICAgICAgfSBuZXdfY2h1cm5pbmdfa2V5OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2U7CisKKy8qKiBDVEMgQ29tbWl0IEltYWdlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlIG9wY29kZTsgICAgIC8qKjwgT3Bjb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZyBmbGFnOyAvKio8IEZsYWcuICovCisgICAgICAgIH0gY29tbWl0X2ltYWdlX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayBhY2s7ICAgLyoqPCBBY2suICovCisgICAgICAgIH0gY29tbWl0X2ltYWdlX3Jlc3BvbnNlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZTsKKworLyoqIENUQyBEQkEgcmVwb3J0aW5nIHF1ZXVlIHNldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldAoreworICAgIHVpbnQ4X3QgcmVwb3J0X2JpdG1hcDsgIC8qKjwgQml0bWFwIG9mIHdoaWNoIHF1ZXVlcyBhcmUgcHJlc2VudCBpbiB0aGUgcXVldWUgc2V0LiAqLworICAgIHVpbnQxNl90IHF1ZXVlMDsgICAgICAgIC8qKjwgUXVldWUgMC4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZTE7ICAgICAgICAvKio8IFF1ZXVlIDEuICovCisgICAgdWludDE2X3QgcXVldWUyOyAgICAgICAgLyoqPCBRdWV1ZSAyLiAqLworICAgIHVpbnQxNl90IHF1ZXVlMzsgICAgICAgIC8qKjwgUXVldWUgMy4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZTQ7ICAgICAgICAvKio8IFF1ZXVlIDQuICovCisgICAgdWludDE2X3QgcXVldWU1OyAgICAgICAgLyoqPCBRdWV1ZSA1LiAqLworICAgIHVpbnQxNl90IHF1ZXVlNjsgICAgICAgIC8qKjwgUXVldWUgNi4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZTc7ICAgICAgICAvKio8IFF1ZXVlIDcuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldDsKKworLyoqIENUQyBEYmEgUHJvdiBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSBkYmFfY29kZTsgICAvKio8IERCQSBDb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9zZXRzX2NvdW50OyAgICAgICAgICAgLyoqPCBRdWV1ZSBTZXRzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICpxdWV1ZV9zZXRzOyAgLyoqPCBRdWV1ZSBTZXRzLiAqLworICAgICAgICB9IGdldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9zZXRzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBRdWV1ZSBTZXRzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICpxdWV1ZV9zZXRzOyAgLyoqPCBRdWV1ZSBTZXRzLiAqLworICAgICAgICB9IHNldF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX3NldHNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFF1ZXVlIFNldHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnF1ZXVlX3NldHM7ICAvKio8IFF1ZXVlIFNldHMuICovCisgICAgICAgIH0gc2V0X3Jlc3BvbnNlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlOworCisvKiogQ1RDIE9sZCBNYW5hZ2VtZW50IE9iamVjdCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3QgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3QgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwb3J0OyAgIC8qKjwgUG9ydC4gKi8KKyAgICAgICAgfSBwb3J0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZTsKKworLyoqIENUQyBNYW5hZ2VtZW50IE9iamVjdCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0IGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IGxlbmd0aDsgLyoqPCBMZW5ndGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSBwb3J0X3R5cGU7ICAgIC8qKjwgUG9ydCBUeXBlLiAqLworICAgICAgICAgICAgdWludDhfdCBjYXNjYWRlX3Nsb3RfbnVtYmVyOyAgICAgICAgICAgICAgICAvKio8IENhc2NhZGUgLyBTbG90IE51bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHBvcnRfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IE51bWJlci4gKi8KKyAgICAgICAgfSBwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjYXJkOyAgICAgIC8qKjwgQ2FyZC4gKi8KKyAgICAgICAgfSBjYXJkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBsbGlkOyAgICAgIC8qKjwgTExJRC4gKi8KKyAgICAgICAgfSBsbGlkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb25faWY7ICAgIC8qKjwgUE9OIEkvRi4gKi8KKyAgICAgICAgfSBwb25faWY7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2U7CisKKy8qKiBDVEMgRW1wdHkgVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7ICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlIGVycm9yOyAgICAgICAgICAgICAgICAgICAvKio8IEVycm9yLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiBsZWFmOyAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlIG9iamVjdDsgIC8qKjwgT2JqZWN0LiAqLworICAgICAgICB9IG9sZF9tYW5hZ2VtZW50X29iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIG9iamVjdDsgICAgICAvKio8IE9iamVjdC4gKi8KKyAgICAgICAgfSBtYW5hZ2VtZW50X29iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgbGVhZjsgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gZXh0X2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gZXh0X2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0ga3RhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlIGVycm9yOyAgICAgICAgICAgICAgICAgICAvKio8IEVycm9yLiAqLworICAgICAgICB9IGt0YWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2U7CisKKy8qKiBDVEMgRXRoIFBvcnQgUG9saWNpbmcgQ29uZmlnIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgc3RhdGU7IC8qKjwgU3RhdGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MjRfdCBjaXI7ICAgICAgICAgICAvKio8IENJUi4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGJ1Y2tldDsgICAgICAgIC8qKjwgQnVja2V0LiAqLworICAgICAgICAgICAgdWludDI0X3QgZXh0cmFfYnVyc3Q7ICAgLyoqPCBFeHRyYSBCdXJzdC4gKi8KKyAgICAgICAgfSBlbmFibGVkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZTsKKworLyoqIENUQyBFdmVudCBFbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3Qgb2JqZWN0X3R5cGU7IC8qKjwgT2JqZWN0IFR5cGUuICovCisgICAgdWludDMyX3Qgb2JqZWN0X2luc3RhbmNlOyAgICAgICAgICAgICAgICAgICAvKio8IE9iamVjdCBJbnN0YW5jZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCBhbGFybV9pZDsgIC8qKjwgQWxhcm0gSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnk7CisKKy8qKiBDVEMgRXZlbnQgU3RhdHVzIEVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5IGV2ZW50X2VudHJ5OyAgICAvKio8IEV2ZW50IEVudHJ5LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzIGV2ZW50X3N0YXR1czsgIC8qKjwgRXZlbnQgU3RhdHVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeTsKKworLyoqIENUQyBFdmVudCBUaHJlc2hvbGQgRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgZXZlbnRfZW50cnk7ICAgIC8qKjwgRXZlbnQgRW50cnkuICovCisgICAgdWludDMyX3Qgc2V0X3RocmVzaG9sZDsgICAgIC8qKjwgU2V0IFRocmVzaG9sZC4gKi8KKyAgICB1aW50MzJfdCBjbGVhcl90aHJlc2hvbGQ7ICAgLyoqPCBDbGVhciBUaHJlc2hvbGQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5OworCisvKiogQ1RDIEV2ZW50IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlIHN1Yl90eXBlOyAgICAgICAgICAgICAgICAvKio8IFN1YiBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW50cnkgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5ICplbnRyaWVzOyAgICAgICAgICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IHN0YXR1c19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFbnRyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5ICplbnRyaWVzOyAgICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gc3RhdHVzX3NldDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7ICAgLyoqPCBFbnRyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5ICplbnRyaWVzOyAgICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gc3RhdHVzX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW50cnkgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5ICplbnRyaWVzOyAgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSB0aHJlc2hvbGRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEVudHJ5IENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKmVudHJpZXM7IC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSB0aHJlc2hvbGRfc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAvKio8IEVudHJ5IENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKmVudHJpZXM7IC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSB0aHJlc2hvbGRfcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2U7CisKKy8qKiBDVEMgRXh0IEFjdGlvbiBWYWx1ZSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiBsZWFmOyAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uIGFjdGl2YXRlX2Zhc3RfbGVhdmU7IC8qKjwgQWN0aXZhdGUgRmFzdCBMZWF2ZS4gKi8KKyAgICAgICAgfSBmYXN0X2xlYXZlX2FkbWluX2NvbnRyb2w7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3QgbnVtX2xsaWRzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIExMSURzIHRvIEFjdGl2YXRlICovCisgICAgICAgIH0gbXVsdGlfbGxpZF9hZG1pbl9jb250cm9sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHNsZWVwX2R1cmF0aW9uOyAgICAvKio8IFNsZWVwIER1cmF0aW9uIChVbml0OiBUUSkgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHdha2VfZHVyYXRpb247ICAgICAvKio8IFdha2UgRHVyYXRpb24gKFVuaXQ6IFRRKSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyBzbGVlcF9mbGFnOyAgLyoqPCBTbGVlcCBGbGFnLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSBzbGVlcF9tb2RlOyAgLyoqPCBTbGVlcCBNb2RlLiAqLworICAgICAgICB9IHNsZWVwX2NvbnRyb2w7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZTsKKworLyoqIENUQyAyLjEgT05VIFNlcnZpY2UgU0xBIFRhYmxlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZQoreworICAgIHVpbnQ4X3QgcXVldWVfbnVtYmVyOyAgICAgICAgICAgLyoqPCBRdWV1ZSBudW1iZXIgb2Ygc2VydmljZSAqLworICAgIHVpbnQxNl90IGZpeGVkX3BhY2tldF9zaXplOyAgICAgLyoqPCBGaXhlZCBQYWNrZXQgc2l6ZSBvZiBzZXJ2aWNlICovCisgICAgdWludDE2X3QgZml4ZWRfYmFuZHdpZHRoOyAgICAgICAvKio8IEZpeGVkIGJhbmR3aWR0aCBvZiBzZXJ2aWNlICovCisgICAgdWludDE2X3QgZ3VhcmFudGVlZF9iYW5kd2lkdGg7ICAvKio8IEd1YXJhbnRlZWQgYmFuZHdpZHRoIG9mIHNlcnZpY2UgKi8KKyAgICB1aW50MTZfdCBiZXN0X2VmZm9ydF9iYW5kd2lkdGg7IC8qKjwgQmVzdCBlZmZvcnQgYmFuZHdpZHRoIG9mIHNlcnZpY2UgKi8KKyAgICB1aW50OF90IHdycl93ZWlnaHQ7ICAgICAgICAgICAgIC8qKjwgV1JSIHdlaWdodCBvZiBzZXJ2aWNlICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlOworCisvKiogQ1RDIE9OVSBTZXJ2aWNlIFNMQSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIG9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYTsgLyoqPCBPcGVyYXRpb24gb2YgU2VydmljZSBEQkEgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHNlcnZpY2VzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBzZXJ2aWNlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnNlcnZpY2VzOyAgICAgICAgICAvKio8IFNlcnZpY2VzLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lIHNjaGVtZTsgICAvKio8IEJlc3QgZWZmb3J0IHNjaGVkdWxpbmcgc2NoZW1lICovCisgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5OyAgICAgICAvKio8IEhpZ2ggcHJpb3JpdHkgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGN5Y2xlX2xlbmd0aDsgIC8qKjwgQ3ljbGUgTGVuZ3RoICovCisgICAgICAgICAgICB1aW50OF90IHNlcnZpY2VzX2NvdW50OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBTZXJ2aWNlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgKnNlcnZpY2VzOyAgICAvKio8IEN0YyBPbnUgU0xBIFRhYmxlICovCisgICAgICAgIH0gYWN0aXZhdGU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlOworCisvKiogQ1RDIDIuMSBPTlUgSW50ZXJmYWNlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZSB0eXBlOyAgICAvKio8IENUQyBPTlUgSW50ZXJmYWNlIFR5cGUgKi8KKyAgICB1aW50MTZfdCBudW1fcG9ydHM7IC8qKjwgTnVtYmVyIG9mIFBvcnRzICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZTsKKworLyoqIENUQyBNeFUgR2xvYmFsIFBhcmFtcyBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3Mgb251X2lwYWRkcmVzczsgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBPTlUgSVAgQWRkcmVzcyAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIG9udV9uZXR3b3JrX21hc2s7ICAgICAgICAvKio8IE1hbmFnZW1lbnQgT05VIE1hc2sgQWRkcmVzcyAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIG9udV9kZWZhdWx0X2d3OyAgICAgICAgICAvKio8IE1hbmFnZW1lbnQgT05VIGRlZmF1bHQgR2F0ZXdheSAqLworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9jdmxhbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1hbmFnZW1lbnQgRGF0YSBDdXN0b21lciBWTEFOICovCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX3N2bGFuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBEYXRhIFNlcnZpY2UgVkxBTiAqLworICAgICAgICAgICAgdWludDhfdCBkYXRhX3ByaW9yaXR5OyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1hbmFnZW1lbnQgRGF0YSBQcmlvcml0eSAqLworICAgICAgICB9IGlwdjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2lwdjZfYWRkcmVzcyBvbnVfaXBhZGRyZXNzOyAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9OVSBJUCBBZGRyZXNzICovCisgICAgICAgICAgICB1aW50MzJfdCBpcHY2cHJlZml4X2xlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBPTlUgSVB2NiBwcmVmaXggbGVuZ3RoICovCisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3Mgb251X2RlZmF1bHRfZ3c7ICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBPTlUgZGVmYXVsdCBHYXRld2F5ICovCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2N2bGFuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBEYXRhIEN1c3RvbWVyIFZMQU4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfc3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IERhdGEgU2VydmljZSBWTEFOICovCisgICAgICAgICAgICB1aW50OF90IGRhdGFfcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBEYXRhIFByaW9yaXR5ICovCisgICAgICAgIH0gaXB2NjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZTsKKworLyoqIENUQyBNeFUgU05NUCBQYXJhbXMgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aCB3aWR0aDsgICAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc25tcF92ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTTk1QIFZlcnNpb24gKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyB0cmFwX2hvc3RfaXA7ICAgICAgICAgICAgLyoqPCBUcmFwIEhvc3QgSVAgQWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgdHJhcF9wb3J0OyAgICAgICAgICAgICAgICAgLyoqPCBUcmFwIFBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNubXBfcG9ydDsgICAgICAgICAgICAgICAgIC8qKjwgU05NUCBQb3J0ICovCisgICAgICAgICAgICB1aW50OF90IHNlY3VyaXR5X25hbWVbMzJdOyAgICAgICAgICAvKio8IFNlY3VyaXR5IE5hbWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29tbXVuaXR5X2Zvcl9yZWFkWzMyXTsgICAgIC8qKjwgQ29tbXVuaXR5IEZvciBSZWFkICovCisgICAgICAgICAgICB1aW50OF90IGNvbW11bml0eV9mb3Jfd3JpdGVbMzJdOyAgICAvKio8IENvbW11bml0eSBGb3IgV3JpdGUgKi8KKyAgICAgICAgfSBpcHY0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHNubXBfdmVyc2lvbjsgICAgICAgICAgICAgICAvKio8IFNOTVAgVmVyc2lvbiAqLworICAgICAgICAgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIHRyYXBfaG9zdF9pcDsgICAgLyoqPCBUcmFwIEhvc3QgSVAgQWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgdHJhcF9wb3J0OyAgICAgICAgICAgICAgICAgLyoqPCBUcmFwIFBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNubXBfcG9ydDsgICAgICAgICAgICAgICAgIC8qKjwgU05NUCBQb3J0ICovCisgICAgICAgICAgICB1aW50OF90IHNlY3VyaXR5X25hbWVbMzJdOyAgICAgICAgICAvKio8IFNlY3VyaXR5IE5hbWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29tbXVuaXR5X2Zvcl9yZWFkWzMyXTsgICAgIC8qKjwgQ29tbXVuaXR5IEZvciBSZWFkICovCisgICAgICAgICAgICB1aW50OF90IGNvbW11bml0eV9mb3Jfd3JpdGVbMzJdOyAgICAvKio8IENvbW11bml0eSBGb3IgV3JpdGUgKi8KKyAgICAgICAgfSBpcHY2OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZTsKKworLyoqIENUQyBWTEFOIEVsZW1lbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudAoreworICAgIHVpbnQxNl90IGV0aGVyX3R5cGU7ICAgICAgICAvKio8IEV0aGVyVHlwZS4gKi8KKyAgICBiY21vc192bGFuX3RhZyB2bGFuX3RhZzsgICAgLyoqPCBWTEFOIFRhZy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQ7CisKKy8qKiBDVEMgVkxBTiBUcmFuc2xhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbgoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IG9sZF92bGFuOyAgLyoqPCBPbGQgVkxBTi4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCBuZXdfdmxhbjsgIC8qKjwgTmV3IFZMQU4uICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbjsKKworLyoqIENUQyBWTEFOIEFnZ3JlZ2F0ZSBUYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUKK3sKKyAgICB1aW50MTZfdCB2bGFuc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVkxBTnMgQ291bnQuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgc3ZsYW47ICAgICAvKio8IFMtVkxBTi4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqdmxhbnM7ICAgIC8qKjwgVkxBTnMuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGU7CisKKy8qKiBDVEMgVmxhbiBQcm92IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGUgbW9kZTsgLyoqPCBNb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgdmxhbjsgICAgICAgICAgICAgIC8qKjwgVkxBTi4gKi8KKyAgICAgICAgfSB0YWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IGRlZmF1bHRfdmxhbjsgICAgICAvKio8IERlZmF1bHQgVkxBTi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHRyYW5zbGF0aW9uc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0cmFuc2xhdGlvbnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24gKnRyYW5zbGF0aW9uczsgLyoqPCBUcmFuc2xhdGlvbnMuICovCisgICAgICAgIH0gdHJhbnNsYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IGRlZmF1bHRfdmxhbjsgICAgICAvKio8IERlZmF1bHQgVkxBTi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHBlcm1pdHRlZF92bGFuc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwZXJtaXR0ZWRfdmxhbnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqcGVybWl0dGVkX3ZsYW5zOyAgLyoqPCBQZXJtaXR0ZWQgVkxBTnMuICovCisgICAgICAgIH0gdHJ1bms7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IGRlZmF1bHRfdmxhbjsgICAgICAvKio8IERlZmF1bHQgVkxBTi4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHRhYmxlc19jb3VudDsgIC8qKjwgVGFibGVzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqdGFibGVzOyAgIC8qKjwgVGFibGVzLiAqLworICAgICAgICB9IGFnZ3JlZ2F0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBlcm1pdHRlZF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICpwZXJtaXR0ZWRfdmxhbnM7ICAvKio8IFBlcm1pdHRlZCBWTEFOcy4gKi8KKyAgICAgICAgfSB0cnVua19tZHU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IGRlZmF1bHRfdmxhbjsgICAgICAvKio8IERlZmF1bHQgVkxBTi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHBlcm1pdHRlZF92bGFuc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwZXJtaXR0ZWRfdmxhbnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqcGVybWl0dGVkX3ZsYW5zOyAgLyoqPCBQZXJtaXR0ZWQgVkxBTnMuICovCisgICAgICAgIH0gaHlicmlkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZTsKKworLyoqIEN0YyBPTlUgY2xhc3NpZmljYXRpb24gRmllbGQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkIGZpZWxkOyAgICAgICAgICAgIC8qKjwgQ1RDIE9OVSBDbGFzc2lmaWNhdGlvbiBGaWVsZCAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB2YWxbMTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gZGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gc2E7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSB2bGFuX3ByaTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs0XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWw7ICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHZsYW5faWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNF07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDE2X3QgdmFsOyAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBldGhfdHlwZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFsyXTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGRlc3RfaXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMl07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIHZhbDsgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBzb3VyY2VfaXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzVdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmFsOyAgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gaXBfdG9zOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzVdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmFsOyAgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gaXBfcHJlYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs0XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWw7ICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHNvdXJjZV9wb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzRdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbDsgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gZGVzdF9wb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzE1XTsgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmFsOyAgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gaXBfdmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzEyXTsgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHZhbDsgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gaXBfZmxvd19sYWJlbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIHZhbDsgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBkc3RfaXB2NjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIHZhbDsgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBzcmNfaXB2NjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIHZhbDsgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKHRoZSBwcmVmaXggbGVuZ3RoIG11c3QgYmUgcGFja2VkIGludG8gdGhlIExTQikgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBkc3RfaXB2NnByZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIHZhbDsgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKHRoZSBwcmVmaXggbGVuZ3RoIG11c3QgYmUgcGFja2VkIGludG8gdGhlIExTQikgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBzcmNfaXB2NnByZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFsxNV07ICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50OF90IHZhbDsgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IG54dF9oZHI7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlOworCisvKiogQ1RDIFJ1bGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUKK3sKKyAgICB1aW50OF90IHByZWNlZGVuY2U7ICAgICAvKio8IFByZWNlZGVuY2UuICovCisgICAgdWludDhfdCBxdWV1ZTsgICAgICAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICB1aW50OF90IHByaV9tYXJraW5nOyAgICAvKio8IFByaSBNYXJraW5nLiAqLworICAgIHVpbnQ4X3QgY2xhdXNlc19jb3VudDsgIC8qKjwgQ2xhdXNlcyBDb3VudC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlICpjbGF1c2VzOyAgIC8qKjwgQ2xhdXNlcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlOworCisvKiogQ1RDIE11bHRpY2FzdCBWTEFOIFByb3YuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiBvcGVyYXRpb247IC8qKjwgT3BlcmF0aW9uLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbXVsdGljYXN0X3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbXVsdGljYXN0X3ZsYW5zLiAqLworICAgICAgICAgICAgYmNtb3Nfdmxhbl90YWcgKm11bHRpY2FzdF92bGFuczsgICAgICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgVkxBTnMuICovCisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtdWx0aWNhc3RfdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtdWx0aWNhc3RfdmxhbnMuICovCisgICAgICAgICAgICBiY21vc192bGFuX3RhZyAqbXVsdGljYXN0X3ZsYW5zOyAgICAgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBWTEFOcy4gKi8KKyAgICAgICAgfSBhZGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG11bHRpY2FzdF92bGFuc19jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG11bHRpY2FzdF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9zX3ZsYW5fdGFnICptdWx0aWNhc3RfdmxhbnM7ICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFZMQU5zLiAqLworICAgICAgICB9IGxpc3Q7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3Y7CisKKy8qKiBDVEMgSVBUViBWTEFOIEVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkKK3sKKyAgICBiY21vc192bGFuX3RhZyBtdWx0aWNhc3RfdmxhbjsgIC8qKjwgTXVsdGljYXN0IFZMQU4uICovCisgICAgYmNtb3Nfdmxhbl90YWcgaXB0dl91c2VyX3ZsYW47ICAvKio8IElQVFYgVXNlciBWTEFOLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeTsKKworLyoqIENUQyBNdWx0aWNhc3QgVGFnIE9wZXJhdGlvbiBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgdGFnX21vZGU7ICAgIC8qKjwgVGFnIE1vZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG11bHRpY2FzdF92bGFuc19jb3VudDsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIE11bHRpY2FzdCBWTEFOcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgKm11bHRpY2FzdF92bGFuczsgICAvKio8IE11bHRpY2FzdCBWTEFOcy4gKi8KKyAgICAgICAgfSBzdHJpcF9kYXRhX3F1ZXJ5X2lwdHY7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2U7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIE1BQyBPbmx5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkKK3sKKyAgICB1aW50MTZfdCB1c2VyX2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyIElELiAqLworICAgIHVpbnQxNl90IHJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlc2VydmVkLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGdyb3VwX21hY19hZGRyZXNzOyAgICAvKio8IEdyb3VwIE1BQyBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seTsKKworLyoqIENUQyBNdWx0aWNhc3QgQ29udHJvbCBFbnRyeSBHREEgTUFDICsgVkxBTiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQKK3sKKyAgICB1aW50MTZfdCB1c2VyX2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyIElELiAqLworICAgIHVpbnQxNl90IG11bHRpY2FzdF92bGFuOyAgICAgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBWTEFOLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGdyb3VwX21hY19hZGRyZXNzOyAgICAvKio8IEdyb3VwIE1BQyBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkOworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIEVudHJ5IEdEQSBNQUMgKyBJUHY0IFNBLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhCit7CisgICAgdWludDE2X3QgdXNlcl9pZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlciBJRC4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBncm91cF9tYWNfYWRkcmVzczsgICAgLyoqPCBHcm91cCBNQUMgQWRkcmVzcy4gKi8KKyAgICBiY21vc19pcHY0X2FkZHJlc3MgaXBzb3VyY2VfYWRkcmVzczsgICAgLyoqPCBJUCBTb3VyY2UgQWRkcmVzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhOworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIEVudHJ5IEdEQSBJUCArIE1jYXN0IFZMQU4gSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZAoreworICAgIHVpbnQxNl90IHVzZXJfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgSUQuICovCisgICAgdWludDE2X3QgbXVsdGljYXN0X3ZsYW47ICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFZMQU4uICovCisgICAgdWludDE2X3QgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwbXVsdGljYXN0X2FkZHJlc3M7IC8qKjwgSVAgTXVsdGljYXN0IEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkOworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIEVudHJ5IEdEQSBJUHY2ICsgTWNhc3QgVkxBTiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQKK3sKKyAgICB1aW50MTZfdCB1c2VyX2lkOyAgICAgICAgICAgLyoqPCBVc2VyIElELiAqLworICAgIHVpbnQxNl90IG11bHRpY2FzdF92bGFuOyAgICAvKio8IE11bHRpY2FzdCBWTEFOLiAqLworICAgIGJjbW9zX2lwdjZfYWRkcmVzcyBpcHY2bXVsdGljYXN0X2FkZHJlc3M7ICAgLyoqPCBJUHY2IE11bHRpY2FzdCBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkOworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIEVudHJ5IEdEQSBNQUMgKyBJUHY2IFNBLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhCit7CisgICAgdWludDE2X3QgdXNlcl9pZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlciBJRC4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBncm91cF9tYWNfYWRkcmVzczsgICAgLyoqPCBHcm91cCBNQUMgQWRkcmVzcy4gKi8KKyAgICBiY21vc19pcHY2X2FkZHJlc3MgaXBzb3VyY2VfYWRkcmVzczsgICAgLyoqPCBJUCBTb3VyY2UgQWRkcmVzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhOworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbAoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uIGFjdGlvbjsgICAgLyoqPCBBY3Rpb24uICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlIHR5cGU7ICAgICAgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHRvdGFsX2VudHJpZXNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiByZW1haW5pbmcgbGlzdCBlbGVtZW50cyBpbiBhbGwgcmVtYWluaW5nIHZhcmlhYmxlIGNvbnRhaW5lcnMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seSAqZW50cmllczsgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBnZGFfbWFjX29ubHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICplbnRyaWVzOyAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9tYWNfcGx1c192bGFuX2lkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHRvdGFsX2VudHJpZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIHJlbWFpbmluZyBsaXN0IGVsZW1lbnRzIGluIGFsbCByZW1haW5pbmcgdmFyaWFibGUgY29udGFpbmVycyAqLworICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19jb3VudDsgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBlbnRyaWVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhICplbnRyaWVzOyAgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBnZGFfbWFjX3BsdXNfaXB2NHNhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHRvdGFsX2VudHJpZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIHJlbWFpbmluZyBsaXN0IGVsZW1lbnRzIGluIGFsbCByZW1haW5pbmcgdmFyaWFibGUgY29udGFpbmVycyAqLworICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19jb3VudDsgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBlbnRyaWVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgKmVudHJpZXM7ICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHRvdGFsX2VudHJpZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIHJlbWFpbmluZyBsaXN0IGVsZW1lbnRzIGluIGFsbCByZW1haW5pbmcgdmFyaWFibGUgY29udGFpbmVycyAqLworICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19jb3VudDsgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBlbnRyaWVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCAqZW50cmllczsgICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHRvdGFsX2VudHJpZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIHJlbWFpbmluZyBsaXN0IGVsZW1lbnRzIGluIGFsbCByZW1haW5pbmcgdmFyaWFibGUgY29udGFpbmVycyAqLworICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19jb3VudDsgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBlbnRyaWVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhICplbnRyaWVzOyAgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBnZGFfbWFjX3BsdXNfaXB2NnNhOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbDsKKworLyoqIENUQyAyLjEgT05VIExMSUQvUXVldWUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUKK3sKKyAgICB1aW50MTZfdCBxdWV1ZV9pZDsgICAgICAvKio8IElEIG9mIHF1ZXVlIG51bWJlciBmb3IgdGhlIExMSUQgKi8KKyAgICB1aW50MTZfdCB3cnJfd2VpZ2h0OyAgICAvKio8IFdSUiBXZWlnaHQgb2YgcXVldWUgbnVtYmVyICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWU7CisKKy8qKiBadGUgVmxhbiBNYWMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjCit7CisgICAgYmNtb3Nfdmxhbl90YWcgdmxhbl9pZDsgICAgICAgICAvKio8IFZsYW4gSUQuICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2ZpbHRlcjsgICAvKio8IE1hYyBGaWx0ZXIuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWM7CisKKy8qKiBDVEMgRXh0IEF0dHJpYnV0ZSBWYWx1ZSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyBzdGF0dXM7ICAgICAgIC8qKjwgU3RhdHVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb24gcmVhc29uOyAgLyoqPCBSZWFzb24uICovCisgICAgICAgIH0gcHBwb19ldGVzdF9yZXN1bHQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiBzdGFydF9vcl9zdG9wOyAvKio8IFN0YXJ0T3JTdG9wLiAqLworICAgICAgICAgICAgdWludDhfdCB1c2VyX25hbWVbNjRdOyAgICAgICAgICAgICAgICAgIC8qKjwgVXNlck5hbWUuICovCisgICAgICAgICAgICB1aW50OF90IHBhc3N3b3JkWzMyXTsgICAgICAgICAgICAgICAgICAgLyoqPCBQYXNzd29yZC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUgbW9kZTsgICAvKio8IE1vZGUuICovCisgICAgICAgICAgICB1aW50MTZfdCB2bGFuOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZsYW4uICovCisgICAgICAgIH0gcHBwb19ldGVzdF9jb25maWd1cmF0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmVuZG9yX2lkWzRdOyAgICAgICAgICAgICAgIC8qKjwgVmVuZG9yIElELiAqLworICAgICAgICAgICAgdWludDMyX3Qgb251X21vZGVsOyAgICAgICAgICAgICAgICAgLyoqPCBPTlUgTW9kZWwuICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBvbnVfbWFjOyAgICAgICAgICAvKio8IE9OVSBNQUMuICovCisgICAgICAgICAgICB1aW50OF90IGh3dmVyc2lvbls4XTsgICAgICAgICAgICAgICAvKio8IEhXIFZlcnNpb24uICovCisgICAgICAgICAgICB1aW50OF90IHN3dmVyc2lvblsxNl07ICAgICAgICAgICAgICAvKio8IFNXIFZlcnNpb24uICovCisgICAgICAgICAgICB1aW50OF90IGV4dF9vbnVfbW9kZWxbMTZdOyAgICAgICAgICAvKio8IEV4dCBPTlUgTW9kZWwuICovCisgICAgICAgIH0gb251X3NlcmlhbF9udW1iZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCBmaXJtd2FyZV92ZXJzaW9uX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBmaXJtd2FyZV92ZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDhfdCAqZmlybXdhcmVfdmVyc2lvbjsgICAgICAgICAgLyoqPCBGaXJtd2FyZSBWZXJzaW9uLiAqLworICAgICAgICB9IGZpcm13YXJlX3ZlcnNpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MTZfdCB2ZW5kb3JfaWQ7ICAgICAgICAgICAgICAgICAvKio8IFZlbmRvciBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNoaXBfbW9kZWw7ICAgICAgICAgICAgICAgIC8qKjwgQ2hpcCBNb2RlbC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmV2aXNpb247ICAgICAgICAgICAgICAgICAgIC8qKjwgUmV2aXNpb24uICovCisgICAgICAgICAgICB1aW50OF90IGRlc2lnbl9kYXRlWzNdOyAgICAgICAgICAgICAvKio8IERlc2lnbiBEYXRlLiAqLworICAgICAgICB9IGNoaXBzZXRfaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlcyBzZXJ2aWNlczsgICAgLyoqPCBTZXJ2aWNlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2dlcG9ydHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gR0UgUG9ydHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBnZWJpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR0UgQml0bWFwLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fZmVwb3J0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bSBGRSBQb3J0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGZlYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGRSBCaXRtYXAuICovCisgICAgICAgICAgICB1aW50OF90IG51bV9wb3RzX3BvcnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtIFBPVFMgUG9ydHMuICovCisgICAgICAgICAgICB1aW50OF90IG51bV9lMXBvcnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtIEUxIFBvcnRzLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fdXBzdHJlYW1fcXVldWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bSBVcHN0cmVhbSBRdWV1ZXMuICovCisgICAgICAgICAgICB1aW50OF90IG1heF9xdWV1ZXNfcGVyX3BvcnRfdXA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IFF1ZXVlcyBQZXIgUG9ydCBVcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2Rvd25zdHJlYW1fcXVldWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gRG93bnN0cmVhbSBRdWV1ZXMuICovCisgICAgICAgICAgICB1aW50OF90IG1heF9xdWV1ZXNfcGVyX3BvcnRfZG93bjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IFF1ZXVlcyBQZXIgUG9ydCBEb3duLiAqLworICAgICAgICAgICAgdWludDhfdCBiYXR0ZXJ5X2JhY2t1cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhdHRlcnkgQmFja3VwLiAqLworICAgICAgICB9IG9udV9jYXBhYmlsaXRpZXMxOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MTZfdCB0cmFuc2NlaXZlcl90ZW1wZXJhdHVyZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNjZWl2ZXIgVGVtcGVyYXR1cmUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHN1cHBseV92Y2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdXBwbHkgVm9sdGFnZSAoVmNjKSAqLworICAgICAgICAgICAgdWludDE2X3QgdHhfYmlhc19jdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFR4IEJpYXMgQ3VycmVudCAqLworICAgICAgICAgICAgdWludDE2X3QgdHhfcG93ZXJfb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFR4IFBvd2VyIE91dHB1dCAqLworICAgICAgICAgICAgdWludDE2X3QgcnhfcG93ZXJfaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJ4IFBvd2VyIElucHV0ICovCisgICAgICAgIH0gb3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2Ugc2VydmljZV9zbGE7ICAgLyoqPCBTZXJ2aWNlIFNMQSAqLworICAgICAgICB9IHNlcnZpY2Vfc2xhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUgb251X3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ1RDIE9OVSBUeXBlICovCisgICAgICAgICAgICB1aW50OF90IG51bV9saW5rczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBsaW5rcyB0aGUgT05VIHN1cHBvcnRzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGUgcHJvdGVjdGlvbl90eXBlOyAgICAvKio8IENUQyBPTlUgUHJvdGVjdGlvbiBUeXBlICovCisgICAgICAgICAgICB1aW50OF90IG51bV9wb25faWZzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgUE9OIEludGVyZmFjZXMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3Nsb3RzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBTbG90ICovCisgICAgICAgICAgICB1aW50OF90IGludGVyZmFjZXNfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlICppbnRlcmZhY2VzOyAgLyoqPCBMaXN0IG9mIGludGVyZmFjZXMgKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgYmF0dGVyeV9iYWNrdXA7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmF0dGVyeSBCYWNrdXAgKi8KKyAgICAgICAgfSBvbnVfY2FwYWJpbGl0aWVzMjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgaG9sZG92ZXJfc3RhdGU7ICAgLyoqPCBDdXJyZW50IHN0YXRlIG9mIE9OVSBob2xkb3ZlciAqLworICAgICAgICAgICAgdWludDMyX3QgaG9sZG92ZXJfdGltZTsgLyoqPCBPTlUgc3RhdGUgaG9sZG92ZXIgdGltZSwgaW4gbXMgKi8KKyAgICAgICAgfSBob2xkb3Zlcl9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSBwYXJhbXM7ICAvKio8IFBhcmFtZXRlcnMgKi8KKyAgICAgICAgfSBteHVfbWFuYWdlX2dsb2JhbF9wYXJhbWV0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgcGFyYW1zOyAgICAvKio8IFBhcmFtZXRlcnMgKi8KKyAgICAgICAgfSBteHVfbWFuYWdlX3NubXBfcGFyYW1ldGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9uX251bWJlcjsgICAgICAgICAvKio8IEFjdGl2ZSBQT04gUG9ydCBOdW1iZXIgKi8KKyAgICAgICAgfSBhY3RpdmVfcG9uX2lmYWRtaW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBpc19pcHY2YXdhcmU7ICAgIC8qKjwgSWYgdGhpcyBpcyBzZXQsIElQdjYgYXdhcmUgaXMgc3VwcG9ydGVkICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlIHBvd2VyX2NvbnRyb2xfdHlwZTsgICAvKio8IE9OVSBQb3dlciBTdXBwbHkgQ29udHJvbCAqLworICAgICAgICAgICAgdWludDhfdCBzZXJ2aWNlX3NsYTsgICAgLyoqPCAweDAxOiBOb3Qgc3VwcG9ydCBTZXJ2aWNlIFNMQS4gMHgwMi0weDA4OiBUaGUgbnVtYmVyIG9mIHNlcnZpY2Ugc3VwcG9ydGVkICovCisgICAgICAgIH0gb251X2NhcGFiaWxpdGllczM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIGxpbmtfc3RhdGU7ICAvKio8IExpbmsgU3RhdGUuICovCisgICAgICAgIH0gZXRoX2xpbmtfc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZWQ7ICAgICAvKio8IEVuYWJsZWQuICovCisgICAgICAgIH0gZXRoX3BvcnRfcGF1c2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlIGNvbmZpZzsgICAvKio8IENvbmZpZy4gKi8KKyAgICAgICAgfSBldGhfcG9ydF9wb2xpY2luZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgcG9ydF9zdGF0ZTsgICAgICAgICAgICAgIC8qKjwgUG9ydCBTdGF0ZS4gKi8KKyAgICAgICAgfSB2b2lwX3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIHBvcnRfc3RhdGU7ICAgICAgICAgICAgICAvKio8IFBvcnQgU3RhdGUuICovCisgICAgICAgIH0gZTFwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCByYXRlX2xpbWl0aW5nX2VuYWJsZWQ7ICAgLyoqPCBSYXRlIExpbWl0aW5nIEVuYWJsZWQuICovCisgICAgICAgICAgICB1aW50MjRfdCBjaXI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gQ29tbWl0dGVkIEluZm9ybWF0aW9uIFJhdGUgaW4gS2JwcyAqLworICAgICAgICAgICAgdWludDI0X3QgcGlyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIFBlYWsgSW5mb3JtYXRpb24gUmF0ZSBpbiBLYnBzICovCisgICAgICAgIH0gZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHN0YXRlOyAgICAvKio8IFN0YXRlIG9mIHRoZSBsb29wYmFjayBkZXRlY3Rpb24gZmVhdHVyZSAqLworICAgICAgICB9IHBvcnRfbG9vcF9kZXRlY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSB2bGFuX2luZm87ICAgLyoqPCBWTEFOIEluZm8uICovCisgICAgICAgIH0gdmxhbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbiBvcDsgICAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcnVsZXNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJ1bGVzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlICpydWxlczsgICAgICAgICAgICAgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92IHZsYW5faW5mbzsgIC8qKjwgVkxBTiBJbmZvLiAqLworICAgICAgICB9IG11bHRpY2FzdF92bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSB0YWdfb3BlcmF0aW9uOyAvKio8IFRhZyBPcGVyYXRpb24uICovCisgICAgICAgIH0gbXVsdGljYXN0X3RhZ19vcGVyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGUgbW9kZTsgLyoqPCBNb2RlLiAqLworICAgICAgICB9IG11bHRpY2FzdF9zd2l0Y2g7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtdWx0aWNhc3RfY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X2dyb3VwczsgICAgICAgICAgICAgICAgIC8qKjwgTWF4IEdyb3Vwcy4gKi8KKyAgICAgICAgfSBncm91cF9tYXg7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCBmYXN0X2xlYXZlX21vZGVzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBGYXN0IExlYXZlIE1vZGVzICovCisgICAgICAgICAgICB1aW50MzJfdCAqZmFzdF9sZWF2ZV9tb2RlczsgICAgICAgICAvKio8IEJpdG1hcHMgZm9yIGVhY2ggZW51bWVyYXRlZCBmYXN0IGxlYXZlIG1vZGUgKi8KKyAgICAgICAgfSBmYXN0X2xlYXZlX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCBsbGlkX3F1ZXVlX3RhYmxlX2NvdW50OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBMTElEL1F1ZXVlIFRhYmxlICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICpsbGlkX3F1ZXVlX3RhYmxlOyAgIC8qKjwgQ1RDIDIuMSBPTlUgTExJRCBRdWV1ZSBDb25maWd1cmF0aW9uIFRhYmxlICovCisgICAgICAgIH0gbGxpZF9xdWV1ZV9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgaWFkX21hYzsgIC8qKjwgSUFEIE1BQyBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgcHJvdG9jb2xfc3VwcG9ydDsgLyoqPCBQcm90b2NvbCBTdXBwb3J0ICovCisgICAgICAgICAgICB1aW50OF90IGlhZF9zb2Z0d2FyZV92ZXJbMzJdOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJQUQgU29mdHdhcmUgdmVyc2lvbiAqLworICAgICAgICAgICAgdWludDhfdCBpYWRfc29mdHdhcmVfdGltZVszMl07ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSUFEIHNvZnR3YXJlIHRpbWUsIHZlcnNpb24gdGltZSBmb3JtYXQgdXNlczpZWVlZTU1EREhITU1TUyAqLworICAgICAgICAgICAgdWludDhfdCB2b2lwX3VzZXJfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZSBQT1RTIG51bWJlciBvZiBJQUQgbW9kdWxlICovCisgICAgICAgIH0gaWFkX2luZm9ybWF0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGUgdm9pY2VfaXBtb2RlOyAgLyoqPCBDVEMgVm9pY2UgSVAgTW9kZSAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlhZF9pcGFkZHI7ICAgICAgICAgICAgICAgICAgLyoqPCBJQUQgSVAgQWRkcmVzcyAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlhZF9uZXRfbWFzazsgICAgICAgICAgICAgICAgLyoqPCBJQUQgTmV0IE1hc2sgQWRkcmVzcyAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlhZF9kZWZhdWx0X2d3OyAgICAgICAgICAgICAgLyoqPCBJQUQgRGVmYXVsdCBHYXRld2F5ICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUgcHBwb2VfbW9kZTsgICAgICAvKio8IFBQUG9FIE1vZGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHBwb2VfdXNlcm5hbWVbMzJdOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUFBQb0UgVXNlcm5hbWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHBwb2VfcGFzc3dvcmRbMzJdOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUFBQb0UgUGFzc3dvcmQgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlIHRhZ2dpbmdfbW9kZTsgICAgLyoqPCBUYWdnaW5nIE1vZGUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZvaWNlX2N2bGFuOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWb2ljZSBDVkxBTiAqLworICAgICAgICAgICAgdWludDE2X3Qgdm9pY2Vfc3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZvaWNlIFNWTEFOICovCisgICAgICAgICAgICB1aW50OF90IHZvaWNlX3ByaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVm9pY2UgUHJpb3JpdHkgKi8KKyAgICAgICAgfSB2b2lwX2dsb2JhbF9wYXJhbWV0ZXJzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MTZfdCBtZ3BvcnRfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTUcgUG9ydCBOdW1iZXIgKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBtZ2NfaXA7ICAgICAgICAgICAgICAgICAgLyoqPCBBY3RpdmF0ZSBzb2Z0c3dpdGNoIHBsYXRmb3JtIElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1nY19jb21fcG9ydDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBY3RpdmF0ZSBzb2Z0c3dpdGNoIHBsYXRmb3JtIENPTSBwb3J0IG51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGJhY2t1cF9tZ2NfaXA7ICAgICAgICAgICAvKio8IEJhY2t1cCBzb2Z0c3dpdGNoIHBsYXRmb3JtIElQIGFkZHJlc3MuIElmIGl0IGlzIDB4MDAwMDAwMDAsIGR1YWwgaG9taW5nIGlzIG5vdCBlbmFibGUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGJhY2t1cF9tZ2NfY29tX3BvcnQ7ICAgICAgICAgICAgICAgLyoqPCBCYWNrdXAgc29mdHN3aXRjaCBwbGF0Zm9ybSBDT00gcG9ydCBudW1iZXIsIGlmIGl0IGlzIDAsIGR1YWwgaG9taW5nIGlzIG5vdCBlbmFibGVkICovCisgICAgICAgICAgICBiY21vc19ib29sIHVzZV9hY3RpdmVfbWdjOyAgICAgICAgICAgICAgICAgIC8qKjwgU2hvdWxkIHdlIHVzZSB0aGUgYWN0aXZlIHNvZnRzd2l0Y2ggcGxhdGZvcm0gaW5zdGVhZCBvZiB0aGUgYmFja3VwPyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUgcmVnX21vZGU7ICAvKio8IEgyNDggUmVnIE1vZGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWlkWzY0XTsgICAgLyoqPCBNSUQgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlIGhlYXJ0YmVhdF9tb2RlOyAgLyoqPCBIZWFydGJlYXQgTW9kZSAqLworICAgICAgICAgICAgdWludDE2X3QgaGVhcnRiZWF0X2N5Y2xlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIZWFydGJlYXQgQ3ljbGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaGVhcnRiZWF0X2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSGVhcnRiZWF0IENvdW50ICovCisgICAgICAgIH0gaDI0OHBhcmFtZXRlcnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IG5hbWVbMzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgVElEIE5hbWUgKi8KKyAgICAgICAgfSBoMjQ4dXNlcl90aWRfaW5mb3JtYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IG51bV9ydHBfdGlkczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBSVFAgVElEcyAqLworICAgICAgICAgICAgdWludDhfdCBwcmVmaXhbMTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQcmVmaXggaW4gQVNDSUkgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGRpZ2l0X2JlZ2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUlRQIFRJRCBkaWdpdGFsIHBvcnRpb24gc3RhcnQgdmFsdWUgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlIHJ0cF90aWRfbW9kZTsgIC8qKjwgUlRQIFRJRCBNb2RlICovCisgICAgICAgICAgICB1aW50OF90IHJ0cF90aWRfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUlRQIFRJRCBEaWdpdCBMZW5ndGggKi8KKyAgICAgICAgfSBoMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IG51bV9ydHBfdGlkczsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFJUUCBUSURzICovCisgICAgICAgICAgICB1aW50OF90IGZpcnN0X3J0cF90aWRfbmFtZVszMl07ICAgICAgICAgICAgIC8qKjwgRnJpc3QgUlRQIFRJRCBOYW1lICovCisgICAgICAgIH0gaDI0OHJ0cF90aWRfaW5mb3JtYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1ncG9ydF9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBNRyBQb3J0IE51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGFjdGl2ZV9zaXBfaXA7ICAgICAgICAgICAvKio8IEFjdGl2ZSBTSVAgYWdlbnQgc2VydmVyIElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGFjdGl2ZV9zaXBfY29tX3BvcnQ7ICAgICAgICAgICAgICAgLyoqPCBBY3RpdmUgU0lQIGFnZW50IHNlcnZlciBwb3J0IG51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGJhY2t1cF9zaXBfaXA7ICAgICAgICAgICAvKio8IEJhY2t1cCBTSVAgYWdlbnQgc2VydmVyIElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGJhY2t1cF9zaXBfY29tX3BvcnQ7ICAgICAgICAgICAgICAgLyoqPCBCYWNrdXAgU0lQIFByb3h5IFNlcnZlciBDb20gUG9ydCBOdW1iZXIgKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBhY3RpdmVfc2lwX3Byb3h5X3NlcnZlcjsgLyoqPCBBY3RpdmUgU0lQIFByb3h5IFNlcnZlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGFjdGl2ZV9zaXBfcmVnaXN0cmF0aW9uX3NlcnZlcl9pcDsgICAvKio8IFNJUCBSZWdpc3RlciBTZXJ2ZXIgSVAgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGFjdGl2ZV9zaXBfcmVnaXN0cmF0aW9uX3NlcnZlcl9jb21fcG9ydDsgICAgICAgLyoqPCBBY3RpdmUgU0lQIHJlZ2lzdHJhdGlvbiBzZXJ2ZXIgcG9ydCBudW1iZXIgKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBiYWNrdXBfc2lwX3JlZ19pcDsgICAgICAgICAgICAgICAgICAgLyoqPCBCYWNrdXAgU0lQIFJlZ2lzdHJhdGlvbiBTZXJ2ZXIgSVAgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGJhY2t1cF9zaXBfcmVnX2NvbV9wb3J0OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCYWNrdXAgU0lQIFJlZ2lzdHJhdGlvbiBTZXJ2ZXIgQ29tIFBvcnQgTnVtYmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3Mgb3V0Ym91bmRfc2VydmVyX2lwOyAgICAgICAgICAgICAgICAgIC8qKjwgT3V0IEJvdW5kIFNlcnZlciBJUCAqLworICAgICAgICAgICAgdWludDE2X3Qgb3V0Ym91bmRfc2VydmVyX3BvcnQ7ICAgICAgICAgIC8qKjwgT3V0IEJvdW5kIFNlcnZlciBQb3J0IE51bWJlciAqLworICAgICAgICAgICAgdWludDMyX3Qgc2lwX3JlZ2lzdHJhdGlvbl9pbnRlcnZhbDsgICAgIC8qKjwgUmVnaXN0cmF0aW9uIHJlZnJlc2ggY3ljbGUsIHVuaXQgaXMgc2Vjb25kLCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgMzYwMHMgKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZGlzYWJsZV9oZWFydGJlYXRfc3dpdGNoOyAgICAvKio8IERpc2FibGUgSGVhcnRiZWF0IFN3aXRjaCBGZWF0dXJlICovCisgICAgICAgICAgICB1aW50MTZfdCBoZWFydGJlYXRfY3ljbGU7ICAgICAgICAgICAgICAgLyoqPCBIZWFydGJlYXQgQ3ljbGUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGhlYXJ0YmVhdF9jb3VudDsgICAgICAgICAgICAgICAvKio8IEhlYXJ0YmVhdCBDb3VudCAqLworICAgICAgICB9IHNpcF9wYXJhbWV0ZXJzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCBhY2NvdW50WzE2XTsgICAgLyoqPCBVc2VyIGFjY291bnQsIFVzZXIgcGhvbmUgbnVtYmVyLCBhbmQgc2hvdWxkIHVzZSBBU0NJSSBjb2RlICovCisgICAgICAgICAgICB1aW50OF90IG5hbWVbMzJdOyAgICAgICAvKio8IFVzZXIgbmFtZSwgU0lQIHBvcnQgdXNlcm5hbWUsIGFuZCBzaG91bGQgdXNlIEFTQ0lJIGNvZGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcGFzc3dvcmRbMTZdOyAgIC8qKjwgVXNlciBwYXNzd29yZCwgU0lQIHBvcnQgcGFzc3dvcmQsIGFuZCBzaG91bGQgdXNlIEFTQ0lJIGNvZGUuICovCisgICAgICAgIH0gc2lwX3VzZXJfcGFyYW1ldGVyczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSB2b2ljZV90MzhlbmFibGU7ICAvKio8IEN0YyBWb2ljZSBUMzggRW5hYmxlIE1vZGUgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZSB2b2ljZV9mYXhfbW9kZW1fY29udHJvbDsgICAvKio8IENUQyBWb2ljZSBGYXggTW9kZW0gQ29udHJvbCBNb2RlICovCisgICAgICAgIH0gZmF4X21vZGVtX2NvbmZpZ3VyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cyBpYWRfb3BlcmF0aW9uX3N0YXR1czsgIC8qKjwgQ1RDIElBRCBPcGVyYXRpb24gU3RhdHVzICovCisgICAgICAgIH0gaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzIGlhZF9wb3J0X3N0YXR1czsgICAgICAgICAgICAgICAgLyoqPCBDVEMgSUFEIFBvcnQgU3RhdHVzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgaWFkX3BvcnRfc2VydmljZV9zdGF0ZTsgIC8qKjwgQ1RDIElBRCBQb3J0IFNlcnZpY2UgU3RhdGUgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZSBpYWRfcG9ydF9jb2RlY19tb2RlOyAgICAgICAgLyoqPCBDVEMgSUFEIFBvcnQgQ29kZWMgTW9kZSAqLworICAgICAgICB9IHBvdHNfc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiBpYWRfb3BlcmF0aW9uOyAgICAvKio8IENUQyBJQUQgT3BlcmF0aW9uICovCisgICAgICAgIH0gaWFkX29wZXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDE2X3Qgc2lwX2RpZ2l0YWxfbWFwX2NvdW50OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBTSVAgRGlnaXRhbCBNYXAgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnNpcF9kaWdpdGFsX21hcDsgICAgICAgLyoqPCBTSVAgUHJvdG9jb2wgRGlnaXRhbCBNYXAsIEFTQ0lJIGNvZGUgdHlwZSAqLworICAgICAgICB9IHNpcF9kaWdpdF9tYXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIGlkOyAgICAgICAgLyoqPCBBbGFybSBJRCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIGNvbmZpZzsgICAvKio8IEFsYXJtIGNvbmZpZ3VyYXRpb24gc3RhdGUgKi8KKyAgICAgICAgfSBhbGFybV9hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCBpZDsgICAgLyoqPCBBbGFybSBJRCAqLworICAgICAgICAgICAgdWludDMyX3QgdGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWxhcm0gVGhyZXNob2xkICovCisgICAgICAgICAgICB1aW50MzJfdCBjbGVhcmluZ190aHJlc2hvbGQ7ICAgICAgICAgICAgLyoqPCBDbGVhcmluZyBBbGFybSBUaHJlc2hvbGQgKi8KKyAgICAgICAgfSBhbGFybV90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcGFkZHJlc3M7ICAgLyoqPCBJUCBBZGRyZXNzLiAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwbWFzazsgICAgICAvKio8IElQIE1hc2suICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgZ2F0ZXdheTsgICAgIC8qKjwgR2F0ZVdheS4gKi8KKyAgICAgICAgICAgIGJjbW9zX3ZsYW5fdGFnIHZsYW5faWQ7ICAgICAgICAgLyoqPCBWbGFuIElELiAqLworICAgICAgICAgICAgdWludDhfdCB1c2VyX25hbWVbOF07ICAgICAgICAgICAvKio8IFVzZXIgTmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcGFzc3dvcmRbOF07ICAgICAgICAgICAgLyoqPCBQYXNzd29yZC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgYWN0aW9uOyAgICAgICAgICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgICAgICB1aW50OF90IHZlcnNpb25fbnVtYmVyOyAgICAgICAgIC8qKjwgVmVyc2lvbiBOdW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90IHZlcjFuYW1lWzE2XTsgICAgICAgICAgIC8qKjwgVmVyMSBOYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCB2ZXIybmFtZVsxNl07ICAgICAgICAgICAvKio8IFZlcjIgTmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyM25hbWVbMTZdOyAgICAgICAgICAgLyoqPCBWZXIzIE5hbWUuICovCisgICAgICAgIH0gdmVyc2lvbl9zZXJ2ZXJfcGFyYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDE2X3QgbWFjX2xpbWl0X251bWJlcjsgICAgICAvKio8IE1hYyBMaW1pdCBOdW1iZXIuICovCisgICAgICAgIH0gb251X21hY19saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3QgbWFjX2FnaW5nX3RpbWU7ICAgICAgICAvKio8IE1hYyBBZ2luZyBUaW1lLiAqLworICAgICAgICB9IG9udV9tYWNfYWdpbmdfdGltZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIG9wOyAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2VudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIEVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICpjbGF1c2U7ICAgICAgICAgICAvKio8IENsYXVzZS4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9tYWNfZmlsdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbiBvcDsgIC8qKjwgT3AuICovCisgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9lbnRyaWVzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBPZiBFbnRyaWVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqY2xhdXNlOyAgICAgICAgICAgLyoqPCBDbGF1c2UuICovCisgICAgICAgIH0gb251X3BvcnRfbWFjX2JpbmRpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIG9wOyAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2VudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIEVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICpjbGF1c2U7ICAgICAgICAgICAvKio8IENsYXVzZS4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9tYWNfc3RhdGljOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5vY3RldHM7ICAgICAgICAvKio8IElmSW5PY3RldHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmludWNhc3Rwa3RzOyAgICAgLyoqPCBJZkluVWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbm51Y2FzdHBrdHM7ICAgIC8qKjwgSWZJbk5VY2FzdFBrdHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmluZGlzY2FyZHM7ICAgICAgLyoqPCBJZkluRGlzY2FyZHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmluZXJyb3JzOyAgICAgICAgLyoqPCBJZkluRXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRvY3RldHM7ICAgICAgIC8qKjwgSWZPdXRPY3RldHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dHVjYXN0cGt0czsgICAgLyoqPCBJZk91dFVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0bnVjYXN0cGt0czsgICAvKio8IElmT3V0TlVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0ZGlzY2FyZHM7ICAgICAvKio8IElmT3V0RGlzY2FyZHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dGVycm9yczsgICAgICAgLyoqPCBJZk91dEVycm9ycy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJlc2VydmVkMTsgICAgICAgICAvKio8IFJlc2VydmVkMS4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJlc2VydmVkMjsgICAgICAgICAvKio8IFJlc2VydmVkMi4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJlc2VydmVkMzsgICAgICAgICAvKio8IFJlc2VydmVkMy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJlc2VydmVkNDsgICAgICAgICAvKio8IFJlc2VydmVkNC4gKi8KKyAgICAgICAgfSBvbnVfcGVyZm9ybWFuY2Vfc3RhdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSBwb3J0X2lzb2xhdGU7ICAvKio8IFBvcnQgSXNvbGF0ZS4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9pc29sYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBvbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBwb25tYWNkc3JhdGVsaW1pdGluZ2VuYWJsZTsgIC8qKjwgUG9uTWFjRFNyYXRlTGltaXRpbmdFbmFibGUuICovCisgICAgICAgICAgICB1aW50MjRfdCBjaXI7ICAgLyoqPCBDSVIuICovCisgICAgICAgICAgICB1aW50MjRfdCBjYnM7ICAgLyoqPCBDQlMuICovCisgICAgICAgIH0gb251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlIGJ1ZmZlcl9tYW5hZ2VtZW50X2NhcGFiaWxpdHk7ICAgIC8qKjwgQnVmZmVyIE1hbmFnZW1lbnQgQ2FwYWJpbGl0eS4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGRzYnVmZmVyX3NpemVfbWluaW11bV92YWx1ZTsgICAvKio8IERTIEJ1ZmZlciBTaXplIE1pbmltdW0gVmFsdWUuICovCisgICAgICAgICAgICB1aW50MjRfdCBkc2J1ZmZlcl9zaXplX21heGltdW1fdmFsdWU7ICAgLyoqPCBEUyBCdWZmZXIgU2l6ZSBNYXhpbXVtIFZhbHVlLiAqLworICAgICAgICAgICAgdWludDI0X3QgdXNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlOyAgIC8qKjwgVVMgQnVmZmVyIFNpemUgTWluaW11bSBWYWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IHVzYnVmZmVyX3NpemVfbWF4aW11bV92YWx1ZTsgICAvKio8IFVTIEJ1ZmZlciBTaXplIE1heGltdW0gVmFsdWUuICovCisgICAgICAgIH0gb251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgYnVmZmVyX21hbmFnZW1lbnRfaW5kaWNhdGlvbjsgICAgICAgIC8qKjwgQnVmZmVyIE1hbmFnZW1lbnQgSW5kaWNhdGlvbi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uIGRpcmVjdGlvbjsgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgICAgICAgICAgdWludDI0X3QgYnVmZmVyX3NpemU7ICAgLyoqPCBCdWZmZXIgU2l6ZS4gKi8KKyAgICAgICAgfSBvbnVfcG9uX21hY191c2RzYnVmZmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlIHN0YXRpc3RpY3NfYWN0aW9uOyAgIC8qKjwgU3RhdGlzdGljcyBBY3Rpb24uICovCisgICAgICAgICAgICB1aW50MjRfdCBzdGF0aXN0aWNzX2ludGVydmFsOyAgICAgICAvKio8IFN0YXRpc3RpY3MgSW50ZXJ2YWwuICovCisgICAgICAgICAgICB1aW50MzJfdCBzdGF0aXN0aWNzX2R1cmF0aW9uX3RpbWU7ICAvKio8IFN0YXRpc3RpY3MgRHVyYXRpb24gVGltZS4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlIHN0YXRpc3RpY3NfcmVzZXQ7IC8qKjwgU3RhdGlzdGljcyBSZXNldC4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUgdW5pZmxvd3N0YXRpc3RpY3Njb2xsZWN0Y29udHJvbGluZGljYXRpb247IC8qKjwgVW5pRmxvd1N0YXRpc3RpY3NDb2xsZWN0Q29udHJvbEluZGljYXRpb24uICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmlub2N0ZXRzOyAgICAgICAgLyoqPCBJZkluT2N0ZXRzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbnVjYXN0cGt0czsgICAgIC8qKjwgSWZJblVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5udWNhc3Rwa3RzOyAgICAvKio8IElmSW5OVWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbmRpc2NhcmRzOyAgICAgIC8qKjwgSWZJbkRpc2NhcmRzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbmVycm9yczsgICAgICAgIC8qKjwgSWZJbkVycm9ycy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0b2N0ZXRzOyAgICAgICAvKio8IElmT3V0T2N0ZXRzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXR1Y2FzdHBrdHM7ICAgIC8qKjwgSWZPdXRVY2FzdFBrdHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dG51Y2FzdHBrdHM7ICAgLyoqPCBJZk91dE5VY2FzdFBrdHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dGRpc2NhcmRzOyAgICAgLyoqPCBJZk91dERpc2NhcmRzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRlcnJvcnM7ICAgICAgIC8qKjwgSWZPdXRFcnJvcnMuICovCisgICAgICAgIH0gb251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCBwb25wb3J0bnVtYmVyOyAgICAgIC8qKjwgUG9uUG9ydE51bWJlci4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUgbWFpbl9saWdodF9pbmRpY2F0aW9uOyAgICAvKio8IE1haW4gTGlnaHQgSW5kaWNhdGlvbi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUgcmVzZXJ2ZV9saWdodF9pbmRpY2F0aW9uOyAvKio8IFJlc2VydmUgTGlnaHQgSW5kaWNhdGlvbi4gKi8KKyAgICAgICAgfSBvbnVfbGlnaHRfZXhjZXB0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlIG1hdGNoX21hY19hZGRyZXNzOyAgIC8qKjwgTWF0Y2ggTUFDIEFkZHJlc3MuICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBwb25fbWFjX2FkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUG9uIE1BQyBBZGRyZXNzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlIGFjdGlvbjsgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGR1cmF0aW9uX3RpbWU7ICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIFRpbWUuICovCisgICAgICAgIH0gb251X2xpZ2h0X2NvbnRyb2w7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVzX3RyYW5zbWl0dGVkb2s7ICAgICAgICAgIC8qKjwgRnJhbWVzIFRyYW5zbWl0dGVkT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBvY3RldHNfdHJhbnNtaXR0ZWRvazsgICAgICAgICAgLyoqPCBPY3RldHMgVHJhbnNtaXR0ZWRPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG11bHRpY2FzdF9mcmFtZXN4bWl0dGVkX29rOyAgICAvKio8IE11bHRpY2FzdCBGcmFtZXNYbWl0dGVkIE9LLiAqLworICAgICAgICAgICAgdWludDY0X3QgYnJvYWRjYXN0X2ZyYW1lc3htaXR0ZWRfb2s7ICAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lc1htaXR0ZWQgT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZXNfcmVjZWl2ZWRfb2s7ICAgICAgICAgICAgLyoqPCBGcmFtZXMgUmVjZWl2ZWQgT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBvY3RldHNfcmVjZWl2ZWRfb2s7ICAgICAgICAgICAgLyoqPCBPY3RldHMgUmVjZWl2ZWQgT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBtdWx0aWNhc3RfZnJhbWVzX3JlY2VpdmVkX29rOyAgLyoqPCBNdWx0aWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LLiAqLworICAgICAgICAgICAgdWludDY0X3QgYnJvYWRjYXN0X2ZyYW1lc19yZWNlaXZlZF9vazsgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcyBSZWNlaXZlZCBPSy4gKi8KKyAgICAgICAgfSBvbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDY0X3QgY3JjOGVycm9yczsgICAgICAgICAgICAgICAgLyoqPCBDUkM4IEVycm9ycy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGZlY19jb3JyZWN0ZWRfYmxvY2tzOyAgICAgIC8qKjwgRkVDIENvcnJlY3RlZCBCbG9ja3MuICovCisgICAgICAgICAgICB1aW50NjRfdCBmZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3M7ICAvKio8IEZFQyBVbmNvcnJlY3RhYmxlIEJsb2Nrcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG1wY3BfbWFjX2N0cmxfZnJhbWVzX3RyYW5zbWl0dGVkOyAgLyoqPCBNcGNwIE1hYyBDdHJsIEZyYW1lcyBUcmFuc21pdHRlZC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG1wY3BfbWFjX2N0cmxfZnJhbWVzX3JlY2VpdmVkOyAgICAgLyoqPCBNcGNwIE1hYyBDdHJsIEZyYW1lcyBSZWNlaXZlZC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG1wY3BfdHhfcmVnaXN0ZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBNcGNwIFR4IFJlZ2lzdGVyLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF90eF9yZWdyZXF1ZXN0OyAgICAgICAgICAgICAgICAvKio8IE1wY3AgVHggUmVnUmVxdWVzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG1wY3BfdHhfcmVwb3J0OyAgICAgICAgICAgICAgICAgICAgLyoqPCBNcGNwIFR4IFJlcG9ydC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG1wY3BfcnhfZ2F0ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNcGNwIFJ4IEdhdGUuICovCisgICAgICAgICAgICB1aW50NjRfdCBtcGNwX3J4X3JlZ2lzdGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgTXBjcCBSeCBSZWdpc3RlLiAqLworICAgICAgICB9IG9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlIGFsYXJtX2NvbmZpZzsgLyoqPCBBbGFybSBDb25maWcuICovCisgICAgICAgIH0gYWxhcm1fY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5IGFiaWxpdHk7ICAgLyoqPCBBYmlsaXR5LiAqLworICAgICAgICB9IHJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGUgc2xlZXBfbW9kZV9jYXBhYmlsaXR5OyAgICAgICAgICAgICAgIC8qKjwgT05VIFNsZWVwIE1vZGUgQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5IGVhcmx5X3dha2VfdXBfY2FwYWJpbGl0eTsgLyoqPCBPTlUgRWFybHkgV2FrZS1VcCBDYXBhYmlsaXR5ICovCisgICAgICAgIH0gb251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgZWFybHlfd2FrZV91cDsgICAvKio8IDB4MDA6IEVuYWJsZTsgMHgwMTogRGlzYWJsZTsgMHhGRjogTm90IFN1cHBvcnRlZDsgT3RoZXJzOiBSZXNlcnZlZCAqLworICAgICAgICAgICAgdWludDhfdCBzbGVlcF9kdXJhdGlvbl9tYXhbNl07ICAvKio8IE1heGltdW0gcmVmcmVzaCB0aW1lIGluIHBvd2VyIHNhdmluZyAoVW5pdDogVFEpICovCisgICAgICAgIH0gb251X3Bvd2VyX3NhdmluZ19jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG9wdGljYWxfbG9zX3RpbWU7ICAgICAgLyoqPCBUaW1lIG9mIE9wdGljYWwgTG9TIGluIFByb3RlY3Rpb24gU3dpdGNoaW5nIChVbml0OiBtcykgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1hY19sb3NfdGltZTsgICAgICAgICAgLyoqPCBUaW1lIG9mIE1BQyBMb1MgaW4gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgKFVuaXQ6IG1zKSAqLworICAgICAgICB9IG9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGUgc3RhdGU7ICAvKio8IEluZGljYXRlcyB3aGV0aGVyIGRpc2FibGUgcG9ydCBhdXRvbWF0aWNhbGx5IHdoZW4gZGV0ZWN0aW5nIHRoZSBwb3J0IGxvb3BiYWNrICovCisgICAgICAgIH0gcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCBhZ2luZ190aW1lOyAgICAvKio8IE1BQyBBZ2luZyBUaW1lIChVbml0OiBzKSAqLworICAgICAgICB9IG1hY19hZ2luZ190aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyBtb25pdG9yaW5nX3N0YXR1czsgICAgLyoqPCBNb25pdG9yaW5nIFN0YXR1cy4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG1vbml0b3JpbmdfcGVyaW9kOyAvKio8IFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgUGVyaW9kIChVbml0OiBzKSAqLworICAgICAgICB9IHBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTsgICAgICAvKio8IERvd25zdHJlYW0gRHJvcEV2ZW50cywgRG93bnN0cmVhbSBGcmFnbWVudHMsIERvd25zdHJlYW0gRGlzY2FyZHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMjsgICAgICAvKio8IFVwc3RyZWFtIERyb3BFdmVudHMsIFVwc3RyZWFtIEZyYWdtZW50cywgVXBzdHJlYW0gRGlzY2FyZHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMzsgICAgICAvKio8IERvd25zdHJlYW0gT2N0ZXRzLCBEb3duc3RyZWFtIEphYmJlcnMsIERvd25zdHJlYW0gRXJyb3MgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNDsgICAgICAvKio8IFVwc3RyZWFtIE9jdGV0cywgVXBzdHJlYW0gSmFiYmVycywgVXBzdHJlYW0gRXJyb3JzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDU7ICAgICAgLyoqPCBEb3duc3RyZWFtIEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgNjQgT2N0ZXRzLCBTdGF0dXMgQ2hhbmdlIFRpbWVzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDY7ICAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDY1IHRvIDEyNyBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNzsgICAgICAvKio8IERvd25zdHJlYW0gQnJvYWRjYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgMTI4IHRvIDI1NSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkODsgICAgICAvKio8IFVwc3RyZWFtIEJyb2FkY2FzdCBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDI1NiB0byA1MTEgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDk7ICAgICAgLyoqPCBEb3duc3RyZWFtIE11bHRpY2FzdCBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDUxMiB0byAxMDIzIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMDsgICAgIC8qKjwgVXBzdHJlYW0gTXVsdGljYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgMTAyNCB0byAxNTE4IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMTsgICAgIC8qKjwgRG93bnN0cmVhbSBDUkMgRXJyb3JlZCBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyA2NCBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTI7ICAgICAvKio8IFVwc3RyZWFtIENSQyBFcnJvcmVkIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDY1IHRvIDEyNyBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTM7ICAgICAvKio8IERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDEyOCB0byAyNTUgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDE0OyAgICAgLyoqPCBVcHN0cmVhbSBVbmRlcnNpemUgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgMjU2IHRvIDUxMSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTU7ICAgICAvKio8IERvd25zdHJlYW0gT3ZlcnNpemUgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgNTEyIHRvIDEwMjMgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDE2OyAgICAgLyoqPCBVcHN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzICovCisgICAgICAgIH0gcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxOyAgICAgIC8qKjwgRG93bnN0cmVhbSBEcm9wRXZlbnRzLCBEb3duc3RyZWFtIEZyYWdtZW50cywgRG93bnN0cmVhbSBEaXNjYXJkcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQyOyAgICAgIC8qKjwgVXBzdHJlYW0gRHJvcEV2ZW50cywgVXBzdHJlYW0gRnJhZ21lbnRzLCBVcHN0cmVhbSBEaXNjYXJkcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQzOyAgICAgIC8qKjwgRG93bnN0cmVhbSBPY3RldHMsIERvd25zdHJlYW0gSmFiYmVycywgRG93bnN0cmVhbSBFcnJvcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ0OyAgICAgIC8qKjwgVXBzdHJlYW0gT2N0ZXRzLCBVcHN0cmVhbSBKYWJiZXJzLCBVcHN0cmVhbSBFcnJvcnMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNTsgICAgICAvKio8IERvd25zdHJlYW0gRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyA2NCBPY3RldHMsIFN0YXR1cyBDaGFuZ2UgVGltZXMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNjsgICAgICAvKio8IFVwc3RyZWFtIEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ3OyAgICAgIC8qKjwgRG93bnN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAxMjggdG8gMjU1IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ4OyAgICAgIC8qKjwgVXBzdHJlYW0gQnJvYWRjYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgMjU2IHRvIDUxMSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkOTsgICAgICAvKio8IERvd25zdHJlYW0gTXVsdGljYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgNTEyIHRvIDEwMjMgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDEwOyAgICAgLyoqPCBVcHN0cmVhbSBNdWx0aWNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDExOyAgICAgLyoqPCBEb3duc3RyZWFtIENSQyBFcnJvcmVkIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDY0IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMjsgICAgIC8qKjwgVXBzdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMzsgICAgIC8qKjwgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgMTI4IHRvIDI1NSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTQ7ICAgICAvKio8IFVwc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyAyNTYgdG8gNTExIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxNTsgICAgIC8qKjwgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyA1MTIgdG8gMTAyMyBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTY7ICAgICAvKio8IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDEwMjQgdG8gMTUxOCBPY3RldHMgKi8KKyAgICAgICAgfSBwZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWN0aW9uOyAgICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3Mgb251X2lkOyAgIC8qKjwgT251IElkLiAqLworICAgICAgICAgICAgdWludDMyX3Qgb3B0X2lkOyAgICAgICAgICAgIC8qKjwgT3B0aWNhbCBUcmFuc21pdHRlciBJZC4gKi8KKyAgICAgICAgfSBvbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2w7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZTsKKworLyoqIENUQyBGaWxlIENoZWNrIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgb3Bjb2RlOyAgIC8qKjwgT3Bjb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmlsZV9zaXplOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmlsZSBTaXplLiAqLworICAgICAgICB9IGVuZF9kb3dubG9hZF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlIHJwc19jb2RlOyAgLyoqPCBSUFMgQ29kZS4gKi8KKyAgICAgICAgfSBlbmRfZG93bmxvYWRfcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZTsKKworLyoqIENUQyBPVUkgVmVyc2lvbiBQYWlyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgLyoqPCBPVUkuICovCisgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXI7CisKKy8qKiBDVEMgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBEYXRhLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEKK3sKKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2Ryb3BfZXZlbnRzOyAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBEcm9wIEV2ZW50cy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9kcm9wX2V2ZW50czsgICAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gRHJvcCBFdmVudHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9vY3RldHM7ICAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX29jdGV0czsgICAgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBPY3RldHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9mcmFtZXM7ICAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczsgICAgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9icm9hZGNhc3RfZnJhbWVzOyAgICAgICAvKio8IERvd25zdHJlYW0gQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9icm9hZGNhc3RfZnJhbWVzOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX211bHRpY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgRG93bnN0cmVhbSBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX211bHRpY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBVcHN0cmVhbSBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fY3JjX2Vycm9yZWRfZnJhbWVzOyAgICAgLyoqPCBEb3duc3RyZWFtIENSQyBFcnJvcmVkIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXM7ICAgICAgIC8qKjwgVXBzdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fdW5kZXJzaXplX2ZyYW1lczsgICAgICAgLyoqPCBEb3duc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fdW5kZXJzaXplX2ZyYW1lczsgICAgICAgICAvKio8IFVwc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9vdmVyc2l6ZV9mcmFtZXM7ICAgICAgICAvKio8IERvd25zdHJlYW0gT3ZlcnNpemUgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX292ZXJzaXplX2ZyYW1lczsgICAgICAgICAgLyoqPCBVcHN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9mcmFnbWVudHM7ICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gRnJhZ21lbnRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYWdtZW50czsgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBGcmFnbWVudHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9qYWJiZXJzOyAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gSmFiYmVycy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9qYWJiZXJzOyAgICAgICAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gSmFiYmVycy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYW1lczY0b2N0ZXRzOyAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMgNjQgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzNjV0bzEyN29jdGV0czsgICAgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyA2NSB0byAxMjcgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzMTI4dG8yNTVvY3RldHM7ICAgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyAxMjggdG8gMjU1IE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYW1lczI1NnRvNTExb2N0ZXRzOyAgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMgMjU2IHRvIDUxMSBPY3RldHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9mcmFtZXM1MTJ0bzEwMjNvY3RldHM7ICAvKio8IERvd25zdHJlYW0gRnJhbWVzIDUxMiB0byAxMDIzIE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYW1lczEwMjR0bzE1MThvY3RldHM7IC8qKjwgRG93bnN0cmVhbSBGcmFtZXMgMTAyNCB0byAxNTE4IE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9mcmFtZXM2NG9jdGV0czsgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gRnJhbWVzIDY0IE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzOyAgICAgIC8qKjwgVXBzdHJlYW0gRnJhbWVzIDY1IHRvIDEyNyBPY3RldHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhbWVzMTI4dG8yNTVvY3RldHM7ICAgICAvKio8IFVwc3RyZWFtIEZyYW1lcyAxMjggdG8gMjU1IE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9mcmFtZXMyNTZ0bzUxMW9jdGV0czsgICAgIC8qKjwgVXBzdHJlYW0gRnJhbWVzIDI1NiB0byA1MTEgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0czsgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgNTEyIHRvIDEwMjMgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczEwMjR0bzE1MThvY3RldHM7ICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgMTAyNCB0byAxNTE4IE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2Rpc2NhcmRzOyAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBEaXNjYXJkcy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9kaXNjYXJkczsgICAgICAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gRGlzY2FyZHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9lcnJvcnM7ICAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gRXJyb3JzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2Vycm9yczsgICAgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBFcnJvcnMuICovCisgICAgdWludDY0X3Qgc3RhdHVzX2NoYW5nZV90aW1lczsgICAgICAgICAgICAgICAvKio8IFN0YXR1cyBDaGFuZ2UgVGltZXMuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhOworCisvKiogQ1RDIFRGVFAgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgb3Bjb2RlOyAgICAvKio8IE9wY29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZpbGVuYW1lX2NvdW50OyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZpbGVuYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlbmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG1vZGVfY291bnQ7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG1vZGUuICovCisgICAgICAgICAgICB1aW50OF90ICptb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgIH0gd3JpdGVfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmxvY2tfbnVtYmVyOyAgICAgICAgICAgICAgLyoqPCBCbG9jayBOdW1iZXIuICovCisgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2NvdW50OyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBkYXRhLiAqLworICAgICAgICAgICAgdWludDhfdCAqZGF0YTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhLiAqLworICAgICAgICB9IGRhdGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrX251bWJlcjsgICAgICAgICAgICAgIC8qKjwgQmxvY2sgTnVtYmVyLiAqLworICAgICAgICB9IGFjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgY29kZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb2RlLiAqLworICAgICAgICAgICAgdWludDMyX3QgbWVzc2FnZV9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbWVzc2FnZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZS4gKi8KKyAgICAgICAgfSBlcnJvcjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlOworCisvKiogQ1RDIFMvVyBNaXJyb3IgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlIG9wY29kZTsgICAgICAgICAgICAgICAgICAgICAvKio8IE9wY29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyBmbGFnOyAgLyoqPCBGbGFnLiAqLworICAgICAgICB9IGFjdGl2YXRlX2ltYWdlX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrIGFjazsgICAgICAgICAgICAgICAgICAgLyoqPCBBY2suICovCisgICAgICAgIH0gYWN0aXZhdGVfaW1hZ2VfcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2U7CisKKy8qKiBDVEMgU29mdHdhcmUgRG93bmxvYWQgUHJvdiBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZSBkYXRhX3R5cGU7ICAvKio8IERhdGEgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVElELiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgdGZ0cDsgLyoqPCBURlRQLiAqLworICAgICAgICB9IHRmdHA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVElELiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgZmlsZV9jaGVjazsgLyoqPCBGaWxlIENoZWNrLiAqLworICAgICAgICB9IGRhdGFfY2hlY2tpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpZDsgICAvKio8IFRJRC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSBzd21pcnJvcjsgLyoqPCBTL1cgTWlycm9yLiAqLworICAgICAgICB9IHN3bWlycm9yaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB0aWQ7ICAgLyoqPCBUSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlIGNvbW1pdF9pbWFnZTsgLyoqPCBDb21taXQgSW1hZ2UuICovCisgICAgICAgIH0gY29tbWl0X2ltYWdlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2U7CisKKy8qKiBLVCBRdWV1ZSBEcm9wIENvdW50ZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIKK3sKKyAgICB1aW50MzJfdCB0eGJ5dGVzOyAgICAgICAgICAgLyoqPCBUWCBCeXRlcy4gKi8KKyAgICB1aW50MzJfdCBkcm9wcGVkX2ZyYW1lczsgICAgLyoqPCBEcm9wcGVkIEZyYW1lcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyOworCisvKiogS1QgQXR0cmlidXRlIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIGxlYWY7ICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgaXNfYWN0aXZhdGVkOyAgICAvKio8IFdoZXRoZXIgb3Igbm90IHNoYXBpbmcgaXMgZW5hYmxlZCAqLworICAgICAgICAgICAgdWludDI0X3QgcmF0ZTsgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBzaGFwaW5nIHJhdGUgb2YgdGhlIHBvcnQgaW4gS2JwcyAqLworICAgICAgICB9IHBvcnRfZG93bnN0cmVhbV9yYXRlX3NoYXBpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgaXNfYWN0aXZhdGVkOyAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkICovCisgICAgICAgICAgICB1aW50OF90IGxpbWl0OyAgICAgICAgICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGxlYXJuZWQgTUFDcyAqLworICAgICAgICB9IG9udV9tYWNfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgYmxvY2s7ICAgICAgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRvIGJsb2NrIHVzZXIgdHJhZmZpYyAqLworICAgICAgICB9IGJsb2NrX3VuYmxvY2tfb251X3RyYWZmaWM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG9wdGljc19tb2R1bGVfdGVtcGVyYXR1cmU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPcHRpY3MgTW9kdWxlIFRlbXBlcmF0dXJlLiAqLworICAgICAgICAgICAgdWludDE2X3QgdHhvcHRpY3NfcG93ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRYIE9wdGljcyBQb3dlci4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHJ4b3B0aWNzX3Bvd2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSWCBPcHRpY3MgUG93ZXIuICovCisgICAgICAgIH0gb251X2RpYWdub3N0aWNzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX3F1ZXVlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIFF1ZXVlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyICp1cHN0cmVhbV9xdWV1ZXM7ICAvKio8IFVwc3RyZWFtIFF1ZXVlcy4gKi8KKyAgICAgICAgfSBvbnVfcXVldWVfZHJvcF9jb3VudGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjb3VudGVyX2JpdF9tYXNrOyAgLyoqPCBDb3VudGVyIEJpdCBNYXNrLiAqLworICAgICAgICAgICAgdWludDY0X3QgdHhmcmFtZXM7ICAgICAgICAgIC8qKjwgVFggRnJhbWVzLiAqLworICAgICAgICAgICAgdWludDY0X3QgdHhieXRlczsgICAgICAgICAgIC8qKjwgVFggQnl0ZXMuICovCisgICAgICAgICAgICB1aW50NjRfdCB0eG11bHRpY2FzdDsgICAgICAgLyoqPCBUWCBNdWx0aWNhc3QuICovCisgICAgICAgICAgICB1aW50NjRfdCB0eGJyb2FkY2FzdDsgICAgICAgLyoqPCBUWCBCcm9hZGNhc3QuICovCisgICAgICAgICAgICB1aW50NjRfdCB0eGRyb3BwZWQ7ICAgICAgICAgLyoqPCBUWCBEcm9wcGVkLiAqLworICAgICAgICAgICAgdWludDY0X3QgcnhmcmFtZXM7ICAgICAgICAgIC8qKjwgUlggRnJhbWVzLiAqLworICAgICAgICAgICAgdWludDY0X3QgcnhieXRlczsgICAgICAgICAgIC8qKjwgUlggQnl0ZXMuICovCisgICAgICAgICAgICB1aW50NjRfdCByeG11bHRpY2FzdDsgICAgICAgLyoqPCBSWCBNdWx0aWNhc3QuICovCisgICAgICAgICAgICB1aW50NjRfdCByeGJyb2FkY2FzdDsgICAgICAgLyoqPCBSWCBCcm9hZGNhc3QuICovCisgICAgICAgICAgICB1aW50NjRfdCByeG92ZXJzaXplZDsgICAgICAgLyoqPCBSWCBPdmVyc2l6ZWQuICovCisgICAgICAgICAgICB1aW50NjRfdCByeHVuZGVyc2l6ZWQ7ICAgICAgLyoqPCBSWCBVbmRlcnNpemVkLiAqLworICAgICAgICAgICAgdWludDY0X3QgcnhjcmNfZXJyb3JzOyAgICAgIC8qKjwgUlggQ1JDIEVycm9ycy4gKi8KKyAgICAgICAgfSBldGhlcm5ldF9wb3J0X2NvdW50ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZW5hYmxlZDsgICAgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IFJTVFAgaXMgZW5hYmxlZCAqLworICAgICAgICB9IGV0aGVybmV0X3BvcnRfcnN0cDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGVkOyAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3QgbG9vcCBkZXRlY3QgaXMgZW5hYmxlZCAqLworICAgICAgICAgICAgdWludDhfdCBpbnRlcnZhbDsgICAgICAgICAgIC8qKjwgVGhlIHNlbmRpbmcgaW50ZXJ2YWwgb2YgaGVsbG8gcGFja2V0IGluIHNlY29uZHMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgYmxvY2tfdGltZTsgICAgICAgICAvKio8IFRoZSBibG9jayB0aW1lIG9mIHRoZSBsb29wZWQgcG9ydCBpbiBzZWNvbmRzICgwIGZvciBwZXJtYW5lbnQpICovCisgICAgICAgIH0gbG9vcF9kZXRlY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvdW50ZXJfYml0X21hc2s7ICAvKio8IENvdW50ZXIgQml0IE1hc2suICovCisgICAgICAgICAgICB1aW50NjRfdCByeGhlY19lcnJvcnM7ICAgICAgLyoqPCBSWCBIRUMgRXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgcnhyZWdpc3RlcjsgICAgICAgIC8qKjwgUlggUmVnaXN0ZXIuICovCisgICAgICAgICAgICB1aW50NjRfdCB0eHJlZ2lzdGVyX2FjazsgICAgLyoqPCBUWCBSZWdpc3RlciBBQ0suICovCisgICAgICAgICAgICB1aW50NjRfdCByeGdhdGVfZnJhbWVzOyAgICAgLyoqPCBSWCBHYXRlIEZyYW1lcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4cmVwb3J0X2ZyYW1lczsgICAvKio8IFRYIFJlcG9ydCBGcmFtZXMuICovCisgICAgICAgIH0gb251X21wY3BfY291bnRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGVkOyAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3Qgb3B0aWNhbCBwb3dlciBhbGFybSBpcyBlbmFibGVkICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyBhbGFybV9zdGF0dXM7ICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICAgICAgfSBvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBtYWNzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIE1hY3MgKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWNzOyAgICAvKio8IE1hY3MuICovCisgICAgICAgIH0gc3RhdGljX21hYzsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlOworCisvKiogS1QgQWN0aW9uIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIGxlYWY7IC8qKjwgTGVhZi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSByZXN0b3JlX29udTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7ICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBpc19wb3dlcl9vZmY7ICAgIC8qKjwgV2hldGhlciBvciBub3QgdGhlIHBvd2VyIHNob3VsZCBiZSBvZmYgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZHVyYXRpb247ICAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGltZSB0byBwb3dlciBvZmYgZm9yIGluIHNlY29uZHMgKDB4RkYgZm9yIHBlcm1hbmVudCkgKi8KKyAgICAgICAgfSB0eHBvd2VyX29mZjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlOworCisvKiogQ1RDIFZhciBDb250YWluZXIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggYnJhbmNoOyAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7ICAgICAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSBhdHRyaWJ1dGU7ICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlIGFjdGlvbjsgICAgICAgICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgIH0gYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlIG9iamVjdDsgIC8qKjwgT2JqZWN0LiAqLworICAgICAgICB9IG9sZF9tYW5hZ2VtZW50X29iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIG9iamVjdDsgICAgICAvKio8IE9iamVjdC4gKi8KKyAgICAgICAgfSBtYW5hZ2VtZW50X29iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgYXR0cmlidXRlOyAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBleHRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSBhdHRyaWJ1dGU7ICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGV4dF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlIGF0dHJpYnV0ZTsgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0ga3RhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlIGF0dHJpYnV0ZTsgICAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0ga3RhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZTsKKworLyoqIENUQyBWYXIgRGVzY3JpcHRvci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBhY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvbGRfbWFuYWdlbWVudF9vYmplY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSB2YWx1ZTsgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYW5hZ2VtZW50X29iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgbGVhZjsgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0X2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0X2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0ga3RhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGt0YWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcjsKKworLyoqIEtUIE9OVSBFdmVudCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZSB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudCBldmVudDsgICAgICAgICAgLyoqPCBFdmVudC4gKi8KKyAgICAgICAgfSBsb29wX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudCBldmVudDsgIC8qKjwgRXZlbnQuICovCisgICAgICAgIH0gb3B0aWNhbF9wb3dlcl9hbGFybTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlOworCisvKiogQ1RDIFZlbmRvciBFeHRlbmRlZCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIG9wOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE9wLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciAqdmFyczsgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBnZXRfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgLyoqPCBWYXJzLiAqLworICAgICAgICB9IHNldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbWVzc2FnZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG1lc3NhZ2VzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKm1lc3NhZ2VzOyAgLyoqPCBNZXNzYWdlcy4gKi8KKyAgICAgICAgfSBzb2Z0d2FyZV9kb3dubG9hZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlIGNvZGU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb2RlLiAqLworICAgICAgICAgICAgdWludDE2X3QgYXV0aGVudGljYXRpb25fZGF0YV9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gQXV0aGVudGljYXRpb24gRGF0YSAqLworICAgICAgICAgICAgdWludDhfdCAqYXV0aGVudGljYXRpb25fZGF0YTsgICAgICAgICAgICAgICAgICAgLyoqPCBBdXRoZW50aWNhdGlvbiBEYXRhLiAqLworICAgICAgICB9IG9udV9hdXRoZW50aWNhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjaHVybmluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlIHZhbHVlOyAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkYmE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGV2ZW50c19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZXZlbnRzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgKmV2ZW50czsgICAvKio8IEV2ZW50cy4gKi8KKyAgICAgICAgfSBrdG9udV9ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlIGV2ZW50czsgICAgICAvKio8IEV2ZW50cy4gKi8KKyAgICAgICAgfSBldmVudDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2U7CisKKy8qKiBEYXNhbiBDbGFzc2lmaWVyIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZCBjb21tYW5kOyAgIC8qKjwgQ29tbWFuZC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uIGRpcmVjdGlvbjsgICAgICAgICAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIGZpZWxkOyAgIC8qKjwgRmllbGQuICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uIGFjdGlvbjsgLyoqPCBBY3Rpb24uICovCisgICAgICAgIH0gYWRkX2ZpbHRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCBmaWVsZDsgICAvKio8IEZpZWxkLiAqLworICAgICAgICAgICAgdWludDE2X3QgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiBhY3Rpb247IC8qKjwgQWN0aW9uLiAqLworICAgICAgICB9IHJlbW92ZV9maWx0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSBwcmlfdHlwZTsgICAgLyoqPCBQcmkgVHlwZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaW5fcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbiBQcmlvcml0eS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgb3V0X3ByaW9yaXR5OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdXQgUHJpb3JpdHkuICovCisgICAgICAgIH0gcXVldWVfbWFwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIGZpZWxkOyAgIC8qKjwgRmllbGQuICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgICAgICB1aW50OF90IHByaV92bGFuOyAgIC8qKjwgUHJpIFZMQU4uICovCisgICAgICAgICAgICB1aW50OF90IHByaV9xdWV1ZTsgIC8qKjwgVGhlIHF1ZXVlIGlkIHRoZSBmcmFtZSB3aWxsIGJlIHRvICovCisgICAgICAgIH0gYWRkX3ByaW9yaXR5X2Zvcl92bGFuOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZTsKKworLyoqIERhc2FuIFBvcnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydAoreworICAgIHVpbnQxNl90IHBvcnRfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAvKio8IFBvcnQgTnVtYmVyLiAqLworICAgIGJjbW9zX2Jvb2wgZW5hYmxlZDsgICAgICAgICAgICAgICAgICAgICAvKio8IEVuYWJsZWQuICovCisgICAgYmNtb3NfYm9vbCBhdXRvX25lZ290aWF0aW9uX2VuYWJsZWQ7ICAgIC8qKjwgQXV0by1OZWdvdGlhdGlvbiBFbmFibGVkLiAqLworICAgIHVpbnQxNl90IHNwZWVkOyAgICAgICAgICAgICAgICAgLyoqPCBTcGVlZC4gKi8KKyAgICB1aW50OF90IHJlc2VydmVkOyAgICAgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgYmNtb3NfYm9vbCBpc19mdWxsX2R1cGxleDsgICAgICAvKio8IElzIEZ1bGwgRHVwbGV4LiAqLworICAgIHVpbnQxNl90IGxlYXJuaW5nX3RhYmxlX3NpemU7ICAgLyoqPCBMZWFybmluZyBUYWJsZSBTaXplLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydDsKKworLyoqIERhc2FuIFZMQU4uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbgoreworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7ICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgYmNtb3NfYm9vbCBpc190YWdnZWQ7ICAgLyoqPCBJcyBUYWdnZWQuICovCisgICAgdWludDE2X3Qgdmxhbl9pZDsgICAgICAgLyoqPCBWTEFOIElELiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbjsKKworLyoqIERhc2FuIFZMQU4gUG9ydC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQKK3sKKyAgICB1aW50MTZfdCBwb3J0X251bWJlcjsgICAgICAgICAgICAgICAvKio8IFBvcnQgTnVtYmVyLiAqLworICAgIHVpbnQxNl90IHZsYW5zX2NvdW50OyAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFZMQU5zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gKnZsYW5zOyAgLyoqPCBWTEFOcy4gKi8KKyAgICB1aW50MTZfdCBwdmlkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFBWSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQ7CisKKy8qKiBEYXNhbiBQb3J0IENvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZworeworICAgIHVpbnQ4X3QgcG9ydF9udW1iZXI7ICAgICAgICAvKio8IFBvcnQgTnVtYmVyLiAqLworICAgIGJjbW9zX2Jvb2wgaXNfbGlua2VkOyAgICAgICAvKio8IElzIExpbmtlZC4gKi8KKyAgICB1aW50OF90IHNwZWVkOyAgICAgICAgICAgICAgLyoqPCBTcGVlZCBpbiBNYnBzICovCisgICAgYmNtb3NfYm9vbCBpc19mdWxsX2R1cGxleDsgIC8qKjwgSXMgRnVsbCBEdXBsZXguICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZzsKKworLyoqIERhc2FuIFBvcnQgU3RhdHMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cworeworICAgIHVpbnQ2NF90IGluX2dvb2Rfb2N0ZXRzOyAgICAvKio8IEluIEdvb2QgT2N0ZXRzLiAqLworICAgIHVpbnQzMl90IGluX2dvb2RfZnJhbWVzOyAgICAvKio8IEluIEdvb2QgRnJhbWVzLiAqLworICAgIHVpbnQzMl90IGluX2Jyb2FkY2FzdDsgICAgICAvKio8IEluIEJyb2FkY2FzdC4gKi8KKyAgICB1aW50MzJfdCBpbl9tdWx0aWNhc3Q7ICAgICAgLyoqPCBJbiBNdWx0aWNhc3QuICovCisgICAgdWludDY0X3Qgb3V0X2dvb2Rfb2N0ZXRzOyAgIC8qKjwgT3V0IEdvb2QgT2N0ZXRzLiAqLworICAgIHVpbnQzMl90IG91dF9nb29kX2ZyYW1lczsgICAvKio8IE91dCBHb29kIEZyYW1lcy4gKi8KKyAgICB1aW50MzJfdCBvdXRfYnJvYWRjYXN0OyAgICAgLyoqPCBPdXQgQnJvYWRjYXN0LiAqLworICAgIHVpbnQzMl90IG91dF9tdWx0aWNhc3Q7ICAgICAvKio8IE91dCBNdWx0aWNhc3QuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzOworCisvKiogRGFzYW4gUG9ydCBFcnJvciBTdGF0cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzCit7CisgICAgdWludDMyX3QgdW5kZXJzaXplZDsgICAgICAgICAgICAvKio8IFVuZGVyc2l6ZWQuICovCisgICAgdWludDMyX3Qgb3ZlcnNpemVkOyAgICAgICAgICAgICAvKio8IE92ZXJzaXplZC4gKi8KKyAgICB1aW50MzJfdCBqYWJiZXI7ICAgICAgICAgICAgICAgIC8qKjwgSmFiYmVyLiAqLworICAgIHVpbnQzMl90IGluX21hY19yZWNlaXZlX2Vycm9yOyAgLyoqPCBJbiBNQUMgUmVjZWl2ZSBFcnJvci4gKi8KKyAgICB1aW50MzJfdCBpbl9mY3NfZXJyb3I7ICAgICAgICAgIC8qKjwgSW4gRkNTIEVycm9yLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0czsKKworLyoqIERhc2FuIFN0YXRzIFNlcSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlIHR5cGU7ICAgICAgICAgICAgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyBwb3J0MDsgICAgICAgICAvKio8IFBvcnQgMC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzIHBvcnQxOyAgICAgICAgIC8qKjwgUG9ydCAxLiAqLworICAgICAgICB9IHBvcnQwYW5kMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgcG9ydDI7ICAgICAgICAgLyoqPCBQb3J0IDIuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyBwb3J0MzsgICAgICAgICAvKio8IFBvcnQgMy4gKi8KKyAgICAgICAgfSBwb3J0MmFuZDM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzIHBvcnQwOyAgIC8qKjwgUG9ydCAwLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgcG9ydDE7ICAgLyoqPCBQb3J0IDEuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyBwb3J0MjsgICAvKio8IFBvcnQgMi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzIHBvcnQzOyAgIC8qKjwgUG9ydCAzLiAqLworICAgICAgICB9IGVycm9yczsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZTsKKworLyoqIERhc2FuIFN0YXQgVmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkIGlkOyAgIC8qKjwgSUQuICovCisgICAgdWludDMyX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWU7CisKKy8qKiBEYXNhbiBDb25maWcgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGUgb3Bjb2RlOyAgICAgICAgICAgIC8qKjwgT3Bjb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgcG9ydHNfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFBvcnRzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydCAqcG9ydHM7ICAgICAgLyoqPCBQb3J0cy4gKi8KKyAgICAgICAgfSBwb3J0X2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgcG9ydHNfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFBvcnRzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICpwb3J0czsgLyoqPCBQb3J0cy4gKi8KKyAgICAgICAgfSBzZXRfdmxhbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGxpZDsgICAgICAgICAgLyoqPCBMTElELiAqLworICAgICAgICAgICAgdWludDY0X3Qgb3A7ICAgICAgICAgICAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHByb2ZpbGVfb3A7ICAgIC8qKjwgUHJvZmlsZSBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbHVlX3NpemU7ICAgIC8qKjwgVmFsdWUgU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFBvcnRzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcgKnBvcnRzOyAgIC8qKjwgUG9ydHMuICovCisgICAgICAgIH0gZ2V0X29udV9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7ICAgICAgICAgICAvKio8IFJlc2VydmVkLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICAgICAgdWludDE2X3QgbWF4X2FnZTsgICAgICAgICAgIC8qKjwgVGhlIGFtb3VudCBvZiB0aW1lIGluIHNlY29uZHMgdGhhdCB0aGUgYnJpZGdlIHNwZW5kcyBpbiB0aGUgQmxvY2tpbmcgc3RhdGUgd2l0aG91dCByZWNlaXZpbmcgYSBCUERVIGJlZm9yZSBpdCB0cmFuc2l0aW9ucyB0byB0aGUgTGlzdGVuaW5nIHN0YXRlICovCisgICAgICAgICAgICB1aW50MTZfdCBmb3J3YXJkX2RlbGF5OyAgICAgLyoqPCBUaGUgYW1vdW50IG9mIHRpbWUgaW4gc2Vjb25kcyB0aGUgYnJpZGdlIHNwZW5kcyBpbiB0aGUgTGlzdGVuaW5nIGFuZCBMZWFybmluZyBzdGF0ZXMgYmVmb3JlIGZvcndhcmRpbmcgcGFja2V0cyAqLworICAgICAgICAgICAgdWludDE2X3QgaGVsbG9fdGltZTsgICAgICAgIC8qKjwgVGhlIGFtb3VudCBvZiB0aW1lIGluIHNlY29uZHMgdGhlIFJvb3QgQnJpZGdlIHdhaXRzIGJldHdlZW4gc2VuZGluZyBCUERVcyAqLworICAgICAgICB9IHNldF9zdHA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGVuYWJsZV90aW1lOyAgICAgICAvKio8IFRpbWUgaW4gc2Vjb25kcyB0byByZS1lbmFibGUgdGhlIFRYICovCisgICAgICAgIH0gc2V0X3R4cG93ZXJfb2ZmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBsbGlkX2JpdG1hcDsgICAgICAgLyoqPCBMTElEIEJpdG1hcC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgYmxvY2tfY2FwOyAgICAgICAgICAvKio8IEJsb2NrIENhcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VuZF9jYXA7ICAgICAgICAgICAvKio8IFNlbmQgQ2FwLiAqLworICAgICAgICAgICAgdWludDhfdCBvbHRfbWFjX2NhcDsgICAgICAgIC8qKjwgT0xUIE1BQyBDYXAuICovCisgICAgICAgICAgICB1aW50MzJfdCBzZW5kX3BlcmlvZDsgICAgICAgLyoqPCBIZWxsbyB0aW1lIGluIFJTVFAgdGVybXMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrX3RpbWU7ICAgICAgICAvKio8IFRpbWUgdG8gZGlzYWJsZSBwb3J0IGlmIGxvb3BlZCAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3Mgb2x0X21hYzsgIC8qKjwgT0xUIE1BQy4gKi8KKyAgICAgICAgfSBzZXRfbG9vcF9kZXRlY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGxsaWRfYml0bWFwOyAgICAgICAvKio8IExMSUQgQml0bWFwLiAqLworICAgICAgICB9IHNldF9sb29wX2RldGVjdF91bmJsb2NrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlIGNsYXNzaWZpZXI7ICAgLyoqPCBDbGFzc2lmaWVyLiAqLworICAgICAgICB9IGNsYXNzaWZpZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWQ7ICAgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50MzJfdCBvcDsgICAgICAgICAgICAgICAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGluZm9fY291bnQ7ICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBJbmZvICovCisgICAgICAgICAgICB1aW50OF90ICppbmZvOyAgICAgICAgICAgICAgLyoqPCBJbmZvLiAqLworICAgICAgICB9IG9udV92ZXJzaW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgICAgICAgICAgLyoqPCBMTElELiAqLworICAgICAgICAgICAgdWludDhfdCBib290X21vZGU7ICAgICAgICAgIC8qKjwgQm9vdCBNb2RlLiAqLworICAgICAgICAgICAgdWludDhfdCBhY3RpdmU7ICAgICAgICAgICAgIC8qKjwgQWN0aXZlLiAqLworICAgICAgICAgICAgdWludDhfdCBpbWFnZTFzdHJpbmdbMTZdOyAgIC8qKjwgSW1hZ2UgMSBTdHJpbmcuICovCisgICAgICAgICAgICB1aW50OF90IGltYWdlMnN0cmluZ1sxNl07ICAgLyoqPCBJbWFnZSAyIFN0cmluZy4gKi8KKyAgICAgICAgfSBvbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGxpZDsgICAgICAgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgYWN0aXZlOyAgICAgICAgICAgICAvKio8IEFjdGl2ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1aWxkX3RpbWU7ICAgICAgICAvKio8IEJ1aWxkIFRpbWUuICovCisgICAgICAgIH0gb251X2FjdGl2ZV9pbWFnZV90aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgICAgICAgICAgLyoqPCBMTElELiAqLworICAgICAgICAgICAgdWludDY0X3Qgb3A7ICAgICAgICAgICAgICAgIC8qKjwgT3AuICovCisgICAgICAgICAgICB1aW50MzJfdCBzZXF1ZW5jZXNfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc2VxdWVuY2VzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlICpzZXF1ZW5jZXM7ICAgIC8qKjwgU2VxdWVuY2VzLiAqLworICAgICAgICB9IG9udV9zdGF0aXN0aWM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWRfYml0bWFwOyAgICAgICAvKio8IExMSUQgQml0bWFwLiAqLworICAgICAgICAgICAgdWludDhfdCBzdGF0aXN0aWNzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFN0YXRpc3RpY3MgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlICpzdGF0aXN0aWNzOyAgIC8qKjwgU3RhdGlzdGljcy4gKi8KKyAgICAgICAgfSBvbnVfc3RhdGlzdGljX2dldDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGU7ICAvKio8IEVuYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X2dyb3VwczsgLyoqPCBNYXggR3JvdXBzLiAqLworICAgICAgICB9IG9udV9pZ21wX3NldDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGU7ICAvKio8IEVuYWJsZS4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9pZ21wX2ZpbHRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZDsgICAvKio8IFJlc2VydmVkLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGU7ICAvKio8IEVuYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHJhdGU7ICAgICAgLyoqPCBEYXRhIHJhdGUgaW4ga2JwcyAqLworICAgICAgICB9IG9udV9zaGFwaW5nOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlOworCisvKiogRGlzdGluZ3Vpc2hlZCBOYW1lLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZQoreworICAgIHVpbnQ4X3QgbGVuZ3RoOyAvKio8IExlbmd0aC4gKi8KKyAgICB1aW50OF90ICpuYW1lOyAgLyoqPCBOYW1lLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lOworCisvKiogRGlzdGluZ3Vpc2hlZCBOYW1lIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3QKK3sKKyAgICB1aW50MzJfdCBuYW1lc19jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBuYW1lcy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lICpuYW1lczsgIC8qKjwgTmFtZXMuICovCit9IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdDsKKworLyoqIEEgbGlzdCBvZiBNQUMgYWRkcmVzc2VzIGluIERQb0UgT0FNIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlCit7CisgICAgdWludDMyX3QgbWFjX2FkZHJlc3NfY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtYWNfYWRkcmVzcy4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjX2FkZHJlc3M7IC8qKjwgTGlzdCBvZiBNQUMgYWRkcmVzc2VzICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZTsKKworLyoqIERQb0UgQWN0aW9uIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIGxlYWY7ICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgbWFjX2FkZGVzczsgICAgICAgICAgLyoqPCBNQUMgQWRkZXNzLiAqLworICAgICAgICB9IGFkZF9keW5fbWFjX2FkZHI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSBtYWNfYWRkcmVzczsgICAgICAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IGRlbF9keW5fbWFjX2FkZHI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSBtYWNfYWRkcmVzczsgICAgICAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IGFkZF9zdGF0aWNfbWFjX2FkZHI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSBtYWNfYWRkcmVzczsgICAgICAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IGRlbF9zdGF0aWNfbWFjX2FkZHI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uIGxvY2F0aW9uOyAgICAvKio8IExvY2F0aW9uLiAqLworICAgICAgICB9IGxvb3BiYWNrX2VuYWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gbG9jYXRpb247ICAgIC8qKjwgTG9jYXRpb24uICovCisgICAgICAgIH0gbG9vcGJhY2tfZGlzYWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZGlzYWJsZV90aW1lOyAgLyoqPCBVbml0czogc2Vjb25kcyAqLworICAgICAgICB9IGxhc2VyX3R4X3Bvd2VyX29mZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb24gbGxpZF9hY3Rpb247ICAgLyoqPCBMTElEIEFjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWRfdmFsdWU7ICAgIC8qKjwgTExJRCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb25maWd1cmVfbWNhc3RfbGxpZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlOworCisvKiogRFBvRSBRdWV1ZSBTZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQKK3sKKyAgICB1aW50OF90IHF1ZXVlX2NvdW50OyAgICAvKio8IFF1ZXVlIENvdW50LiAqLworICAgIHVpbnQ4X3QgKnF1ZXVlX3NpemVzOyAgIC8qKjwgUXVldWUgU2l6ZXMuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldDsKKworLyoqIERQb0UgUXVldWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIHR5cGU7ICAvKio8IFR5cGUuICovCisgICAgdWludDhfdCBpbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5zdGFuY2UuICovCisgICAgdWludDhfdCBxdWV1ZTsgIC8qKjwgUXVldWUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlOworCisvKiogRFBvRSBPYmplY3QgQ29udGV4dCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIG9iamVjdF90eXBlOyAgIC8qKjwgT2JqZWN0IFR5cGUuICovCisgICAgdWludDhfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaW5zdGFuY2U7ICAgICAgIC8qKjwgSW5zdGFuY2UuICovCisgICAgICAgIH0gb251OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb24uICovCisgICAgICAgICAgICB1aW50OF90ICpwb247ICAgICAgICAgICAvKio8IFBPTi4gKi8KKyAgICAgICAgfSBuZXR3b3JrX3BvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbGlua19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbGluay4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmxpbms7ICAgICAgICAgIC8qKjwgTGluay4gKi8KKyAgICAgICAgfSBsaW5rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb3J0X2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb3J0LiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9ydDsgICAgICAgICAgLyoqPCBQb3J0LiAqLworICAgICAgICB9IHVzZXJfcG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgcXVldWU7ICAgLyoqPCBRdWV1ZS4gKi8KKyAgICAgICAgfSBxdWV1ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbWNhc3RfbGxpZDsgICAgICAgICAgICAgICAgLyoqPCBNY2FzdCBMTElELiAqLworICAgICAgICB9IG1jYXN0X2xpbms7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGJyaWRnZV9jb3VudDsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGJyaWRnZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmJyaWRnZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgQnJpZGdlLiAqLworICAgICAgICB9IGJyaWRnZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcG9ydF9jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcG9ydC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBvcnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydC4gKi8KKyAgICAgICAgfSBicmlkZ2VfcG9ydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2U7CisKKy8qKiBEUG9FIFZhciBEZXNjcmlwdG9yLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggYnJhbmNoOyAgICAgICAgICAgICAgICAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gc3RhbmRhcmRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Ugb2JqZWN0X2NvbnRleHQ7ICAgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0ZW5kZWRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0ZW5kZWRfYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3I7CisKKy8qKiBEUG9FIFN0YXRpc3RpYyBUaHJlc2hvbGQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Igc3RhdGlzdGljOyAgLyoqPCBTdGF0aXN0aWMuICovCisgICAgdWludDMyX3QgcmlzaW5nX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaHJlc2hvbGQgYXQgd2hpY2ggdG8gc2V0IGFsYXJtICgwIHRvIGRpc2FibGUpICovCisgICAgdWludDMyX3QgZmFsbGluZ190aHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaHJlc2hvbGQgYXQgd2hpY2ggdG8gY2xlYXIgYWxhcm0gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZDsKKworLyoqIERQb0UgRmllbGQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZAoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgY29kZTsgICAvKio8IENvZGUuICovCisgICAgdWludDhfdCBpbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5zdGFuY2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkOworCisvKiogRFBvRSBSdWxlIFJlc3VsdCBGaWVsZCBWMi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgZmllbGQ7ICAgLyoqPCBGaWVsZC4gKi8KKyAgICB1aW50OF90IG1zYl9tYXNrOyAgICAgICAgICAgICAgICAgICAvKio8IE1TQiBNYXNrLiAqLworICAgIHVpbnQ4X3QgbHNiX21hc2s7ICAgICAgICAgICAgICAgICAgIC8qKjwgTFNCIE1hc2suICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyOworCisvKiogRFBvRSBSdWxlIFJlc3VsdCBGaWVsZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgZmllbGQ7ICAgLyoqPCBGaWVsZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQ7CisKKy8qKiBBIHNpbmdsZSByZXN1bHQgb2YgdGhlIHJ1bGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0Cit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0IHJlc3VsdDsgICAgICAgICAvKio8IFJlc3VsdCBvZiB0aGUgcnVsZSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgcXVldWU7ICAgLyoqPCBUYXJnZXQgcXVldWUgKi8KKyAgICAgICAgfSBxdWV1ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgZmllbGQ7ICAgIC8qKjwgRmllbGQgdG8gc2V0ICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUgdG8gc2V0ICovCisgICAgICAgIH0gc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiBmaWVsZDsgICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgfSBjb3B5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmaWVsZDsgICAgICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgfQorICAgICAgICBkZWxldGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkIGZpZWxkOyAgICAgICAvKio8IEZpZWxkLiAqLworICAgICAgICB9IGluc2VydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgZmllbGQ7ICAgICAgIC8qKjwgRmllbGQuICovCisgICAgICAgIH0gcmVwbGFjZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgZmllbGQ7ICAgICAgIC8qKjwgRmllbGQuICovCisgICAgICAgIH0gY2xlYXJfZGVsZXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmaWVsZDsgICAgICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgfSBjbGVhcl9pbnNlcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdDsKKworLyoqIFBhcnQgb2YgYSBEUG9FIE9BTSBydWxlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSBzdWJ0eXBlOyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIFN1YnR5cGUgb2YgdGhpcyBwaWVjZSBvZiB0aGUgcnVsZSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwcmVjZWRlbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFByZWNlZGVuY2Ugb2YgdGhlIHJ1bGUgKi8KKyAgICAgICAgfSBoZWFkZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkIGZpZWxkX2NvZGU7ICAgICAgLyoqPCBUaGUgZmllbGQgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbXNiX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWZ0IG1hc2sgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbHNiX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSaWdodCBtYXNrICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciBvcGVyYXRvcjsgICAgIC8qKjwgTWF0Y2ggb3BlcmF0aW9uICovCisgICAgICAgICAgICB1aW50OF90IG1hdGNoX3ZhbHVlX2xlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgQnl0ZXMgaW4gbWF0Y2ggdmFsdWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1hdGNoX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZSB0byBtYXRjaCAqLworICAgICAgICB9IGNsYXVzZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgcmVzdWx0OyAgICAvKio8IFJlc3VsdC4gKi8KKyAgICAgICAgfSByZXN1bHQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlOworCisvKiogRFBvRSBTaGFwZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIKK3sKKyAgICB1aW50OF90IHF1ZXVlX2JpdG1hcDsgICAvKio8IFF1ZXVlIEJpdG1hcC4gKi8KKyAgICB1aW50MzJfdCBtYXhpbXVtX3JhdGU7ICAvKio8IE1heGltdW0gUmF0ZS4gKi8KKyAgICB1aW50MTZfdCBidXJzdF9zaXplOyAgICAvKio8IEJ1cnN0IFNpemUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcjsKKworLyoqIERQb0UgUmF0ZSBMZXZlbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXAgdHJhZmZpY190eXBlOyAgICAvKio8IFRyYWZmaWMgVHlwZS4gKi8KKyAgICB1aW50MzJfdCBtYXhpbXVtX3JhdGU7ICAvKio8IE1heGltdW0gUmF0ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbDsKKworLyoqIERQb0UgRXZlbnQgT3B0aW9ucy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMKK3sKKyAgICB1aW50OF90IGV2ZW50X2NvZGU7ICAgICAgICAgLyoqPCBFdmVudCBDb2RlLiAqLworICAgIHVpbnQ4X3QgZW5hYmxlZF9kaXNhYmxlZDsgICAvKio8IEVuYWJsZWQgLyBEaXNhYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9uczsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFUxNi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OAoreworICAgIHVpbnQ4X3QgbGVuOyAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIHVpbnQxNl90ICp2YWw7ICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91ODsKKworLyoqIERQb0UgQXR0cmlidXRlIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBzZXF1bmNlX251bWJlcjsgICAgLyoqPCBCaXQgMTUsIHdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBsYXN0IG1lc3NhZ2Ugb2YgaXRzIHNlcXVlbmNlLiAgKi8KKyAgICAgICAgfSBzZXF1ZW5jZV9udW1iZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGlkOyAgICAgICAvKio8IFRoZSBsb3dlc3QgKG51bWVyaWNhbGx5IHNtYWxsZXN0KSBNQUMgYWRkcmVzcyBhbW9uZyBhbGwgTUFDIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFRVIGludGVyZmFjZSBwb3J0IG9mIGEgRFBvRSBPTlUgKi8KKyAgICAgICAgfSBvbnVfaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJvb3RfdmVyc2lvbjsgICAgICAvKio8IFZlcnNpb24gb2YgYm9vdHN0cmFwIGxvYWRlciAoaWYgYW55KSAqLworICAgICAgICAgICAgdWludDMyX3QgYm9vdF9jcmMzMjsgICAgICAgIC8qKjwgQ1JDLTMyIG9mIGJvb3QgbG9hZGVyIHNlcnZlcyBhcyBhZGRpdGlvbmFsIHVuaXF1ZSBpZGVudGlmaWVyIGFuZCB2ZXJpZmljYXRpb24gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGFwcGxpY2F0aW9uX3ZlcnNpb247ICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uIG9mIG1haW4gYXBwbGljYXRpb24gc29mdHdhcmUgcnVubmluZyBvbiB0aGUgRFBvRSBPTlUgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGFwcGxpY2F0aW9uX2NyYzMyOyAgICAgICAgICAgICAgICAgLyoqPCBDUkMtMzIgb2YgYXBwbGljYXRpb24gc29mdHdhcmUgc2VydmVzIGFzIHVuaXF1ZSBJRCBhbmQgdmVyaWZpY2F0aW9uICovCisgICAgICAgIH0gZmlybXdhcmVfaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgamVkZWNfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDE2LWJpdCBjaGlwIG1hbnVmYWN0dXJlciBJRCBjb2RlIGFzIGFzc2lnbmVkIGJ5IEpFREVDICovCisgICAgICAgICAgICB1aW50MzJfdCBjaGlwX21vZGVsOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWRlbnRpZmllcyB0aGUgcGFydGljdWxhciBraW5kIG9mIEVQTiBjaGlwLiBGb3JtYXQgZGVmaW5lZCBieSBjaGlwc2V0IHZlbmRvciAqLworICAgICAgICAgICAgdWludDMyX3QgY2hpcF92ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAvKio8IElkZW50aWZpZXMgdGhlIHZlcnNpb24gb3Igc3RlcHBpbmcgb2YgdGhlIGNoaXAgbW9kZWwuIEZvcm1hdCBkZWZpbmVkIGJ5IGNoaXBzZXQgdmVuZG9yICovCisgICAgICAgIH0gY2hpcF9pbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB5ZWFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQkNEICovCisgICAgICAgICAgICB1aW50OF90IG1vbnRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQkNEICovCisgICAgICAgICAgICB1aW50OF90IGRheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQkNEICovCisgICAgICAgIH0gZGF0ZV9vZl9tYW51ZmFjdHVyZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZGVmX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBkZWYuICovCisgICAgICAgICAgICB1aW50OF90ICpkZWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRm9ybWF0IGlzIGRlZmluZWQgYnkgdGhlIE9OVSB2ZW5kb3IuICovCisgICAgICAgIH0gbWFudWZhY3R1cmVyX2luZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJpZGlyZWN0aW9uYWw7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBsaW5rcyB3aGljaCBjYW4gYm90aCB0cmFuc21pdCBhbmQgcmVjZWl2ZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRvd25zdHJlYW1fb25seTsgICAgICAgICAgICAgICAgICAgLyoqPCBJbiBhZGRpdGlvbiB0byB0aGUgYmlkaXJlY3Rpb25hbCBsaW5rcywgdGhlIG1heGltdW0gbnVtYmVyIG9mIExMSURzIHdoaWNoIGNhbiByZWNlaXZlIGRhdGEsIGJ1dCBub3QgdHJhbnNtaXQgKHVuaWRpcmVjdGlvbmFsLCBkb3duc3RyZWFtIG9ubHkpICovCisgICAgICAgIH0gbWF4X2xvZ2ljYWxfbGlua3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHBvcnRfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdG90YWwgbnVtYmVyIG9mIFRVIGludGVyZmFjZSBwb3J0cyBvbiB0aGUgT05VLiAqLworICAgICAgICB9IG51bV9lcG9uX3BvcnRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBwb3J0X2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBTMSBpbnRlcmZhY2VzIG9uIHRoZSBEUG9FIE9OVS4gKi8KKyAgICAgICAgfSBudW1fdW5pX3BvcnRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX3F1ZXVlczsgICAgICAgICAgICAgICAgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIHF1ZXVlcyBhdmFpbGFibGUgdG8gYmUgYXNzaWduZWQgdG8gbG9naWNhbCBsaW5rcyBpbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uICovCisgICAgICAgICAgICB1aW50OF90IHVwX3F1ZXVlc19tYXhfcGVyX2xpbms7ICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgcXVldWVzIHdoaWNoIGNhbiBiZSBhc3NpZ25lZCB0byBhIHNpbmdsZSBsb2dpY2FsIGxpbmsgaW4gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiAqLworICAgICAgICAgICAgdWludDhfdCB1cF9xdWV1ZV9pbmNyZW1lbnQ7ICAgICAgICAgICAgICAgICAvKio8IFRoZSBzbWFsbGVzdCBhbGxvY2F0YWJsZSBpbmNyZW1lbnQgb2YgcGFja2V0IGJ1ZmZlciBtZW1vcnkgaW4gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiwgaW4ga2lsb2J5dGVzLiAqLworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX3F1ZXVlczsgICAgICAgICAgICAgICAgICAvKio8IFRvdGFsIG51bWJlciBvZiBxdWV1ZXMgYXZhaWxhYmxlIHRvIGJlIGFzc2lnbmVkIHRvIGxvZ2ljYWwgbGlua3MgaW4gdGhlIGRvd25zdHJlYW0gZGlyZWN0aW9uICovCisgICAgICAgICAgICB1aW50OF90IGRuX3F1ZXVlc19tYXhfcGVyX3BvcnQ7ICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgcXVldWVzIHdoaWNoIGNhbiBiZSBhc3NpZ25lZCB0byBhIHNpbmdsZSBVTkkgcG9ydCBpbiB0aGUgZG93bnN0cmVhbSBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZG5fcXVldWVfaW5jcmVtZW50OyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgc21hbGxlc3QgYWxsb2NhdGFibGUgaW5jcmVtZW50IG9mIHBhY2tldCBidWZmZXIgbWVtb3J5IGluIHRoZSBkb3duc3RyZWFtIGRpcmVjdGlvbiwgaW4ga2lsb2J5dGVzLiAqLworICAgICAgICAgICAgdWludDE2X3QgdG90YWxfcGFja2V0X2J1ZmZlcjsgICAgICAgICAgICAgICAvKio8IFRvdGFsIHBhY2tldCBidWZmZXIgbWVtb3J5IG9uIHRoZSBPTlUgKEtCKSAqLworICAgICAgICAgICAgdWludDE2X3QgdXBzdHJlYW1fcGFja2V0X2J1ZmZlcjsgICAgICAgICAgICAvKio8IE1heGltdW0gYW1vdW50IG9mIHBhY2tldCBidWZmZXIgbWVtb3J5IHdoaWNoIGNhbiBiZSBhbGxvY2F0ZWQgdG8gdXBzdHJlYW0gcXVldWVzICovCisgICAgICAgICAgICB1aW50MTZfdCBkb3duc3JlYW1fcGFja2V0X2J1ZmZlcjsgICAgICAgICAgIC8qKjwgTWF4aW11bSBhbW91bnQgb2YgcGFja2V0IGJ1ZmZlciBtZW1vcnkgd2hpY2ggY2FuIGJlIGFsbG9jYXRlZCB0byBkb3duc3RyZWFtIHF1ZXVlcyAqLworICAgICAgICB9IHBhY2tldF9idWZmZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3F1ZXVlX3NldHM7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgUXVldWUgU2V0cyAqLworICAgICAgICAgICAgdWludDhfdCByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7ICAgICAgICAvKio8IFJlcG9ydCBWYWx1ZXMgUGVyIFF1ZXVlIFNldCAqLworICAgICAgICAgICAgdWludDE2X3QgKnF1ZXVlX3NldDA7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzIGZvciBRdWV1ZSBTZXQgMCAqLworICAgICAgICAgICAgdWludDE2X3QgKnF1ZXVlX3NldDE7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzIGZvciBRdWV1ZSBTZXQgMSAqLworICAgICAgICAgICAgdWludDE2X3QgKnF1ZXVlX3NldDI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzIGZvciBRdWV1ZSBTZXQgMiAqLworICAgICAgICAgICAgdWludDE2X3QgKnF1ZXVlX3NldDM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzIGZvciBRdWV1ZSBTZXQgMyAqLworICAgICAgICB9IHJlcG9ydF90aHJlc2hvbGRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlIGxpbmtfc3RhdGU7IC8qKjwgTGluayBTdGF0ZS4gKi8KKyAgICAgICAgfSBsaW5rX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG1heGltdW1fb2FtX3JhdGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBPQU0gUmF0ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWluaW11bV9vYW1fcmF0ZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNaW5pbXVtIE9BTSBSYXRlLiAqLworICAgICAgICB9IG9hbV9yYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBtYXhfbWFjX2FsbG93ZWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBhbGxvd2VkIGxpbWl0ICovCisgICAgICAgIH0gZHluX2xlYXJuX3RhYmxlX3NpemU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGR5bmFtaWNfYWRkcmVzc19hZ2VfbGltaXQ7ICAgICAgICAgLyoqPCBVbml0cyA4Ljc1IG1zICovCisgICAgICAgIH0gZHluX2xlYXJuX2FnZV9saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IGR5bl9tYWNfdGFibGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSBtYWNfYWRkcmVzczsgLyoqPCBNQUMgQWRkcmVzcy4gKi8KKyAgICAgICAgfSBzdGF0aWNfbWFjX3RhYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5IG1heGltdW1fY2FwYWJpbGl0aWVzOyAgIC8qKjwgTWF4aW11bSBDYXBhYmlsaXRpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5IGN1cnJlbnRfY2FwYWJpbGl0aWVzOyAgIC8qKjwgQ3VycmVudCBDYXBhYmlsaXRpZXMuICovCisgICAgICAgIH0gcG9ydF9jYXBhYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlIGxlYXJuaW5nX21vZGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgODAyLjEgbGVhcm5pbmcgbW9kZSBhbHdheXMgZm9yd2FyZHMgZnJhbWVzLiBNQUMgYWNjZXNzIGNvbnRyb2wgbW9kZSBmb3J3YXJkcyBmcmFtZXMgb25seSBpZiB0aGUgU0Egb2YgdGhlIGZyYW1lIGlzIGluIHRoZSBNQUMgYWRkcmVzcyB0YWJsZSBmb3IgdGhhdCBwb3J0OyB0aGF0IGlzLCB0aGUgYWRkcmVzcyBoYXMgYmVlbiBsZWFybmVkIG9uIHRoYXQgcG9ydCwgb3IgcHJvdmlzaW9uZWQgb24gdGhhdCBwb3J0IGJ5IG1hbmFnZW1lbnQuIEEgZnJhbWUgd2l0aCB0aGUgc2FtZSBTQSBhdHRlbXB0aW5nIHRvIGluZ3Jlc3Mgc29tZSBvdGhlciBwb3J0IHdvdWxkIGJlIGRpc2NhcmRlZC4gKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fbW9kZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9ndWFyYW50ZWVkX2xpbWl0OyAgICAgICAgICAgICAgICAgIC8qKjwgTWluaW11bSBHdWFyYW50ZWVkIExpbWl0LiAqLworICAgICAgICB9IG1pbl9tYWNfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG1heF9hbGxvd2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1heCBBbGxvd2VkLiAqLworICAgICAgICB9IG1heF9tYWNfYWxsb3dlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWdncmVnYXRlX21hY19saW1pdDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIE9OVSBhZ2dyZWdhdGUgZHluYW1pYyBNQUMgYWRkcmVzcyBsaW1pdCAqLworICAgICAgICB9IGFnZ19tYWNfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgbGVuX2Vycm9yX2Rpc2NhcmQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IElmIExlbmd0aCBFcnJvciBEaXNjYXJkIEVuYWJsZSAqLworICAgICAgICB9IGxlbl9lcnJfZGlzY2FyZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBmbG9vZF91bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmxvb2QgVW5rbm93biBEQSBvcHRpb24gKi8KKyAgICAgICAgfSBmbG9vZF91bmtub3duOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGxvY2FsX3N3aXRjaGluZzsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb2NhbCBTd2l0Y2hpbmcgb3B0aW9uICovCisgICAgICAgIH0gbG9jYWxfc3dpdGNoaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9saW5rczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGxpbmtzIHRvIGNvbmZpZ3VyZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqbGlua19jb25maWd1cmF0aW9uOyAvKio8IExpbmsgQ29uZmlndXJhdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3BvcnRzOyAgICAvKio8IFRoZSBudW1iZXIgb2YgUG9ydHMgdG8gY29uZmlndXJlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICpwb3J0X2NvbmZpZ3VyYXRpb247IC8qKjwgUG9ydCBDb25maWd1cmF0aW9uLiAqLworICAgICAgICB9IHF1ZXVlX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmlybXdhcmVfZmlsZW5hbWVfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZpcm13YXJlX2ZpbGVuYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCAqZmlybXdhcmVfZmlsZW5hbWU7IC8qKjwgVGhlIGZpbGVuYW1lIGlzIGEgbnVsbC10ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYXMgcmVjZWl2ZWQgZnJvbSB0aGUgT1NTIGJ5IHRoZSB2Q00uICovCisgICAgICAgIH0gZmlybXdhcmVfZmlsZW5hbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgc3RhdF90aHJlc2hvbGQ7ICAgIC8qKjwgU3RhdCBUaHJlc2hvbGQuICovCisgICAgICAgIH0gcG9ydF9zdGF0X3RocmVzaDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCBzdGF0X3RocmVzaG9sZDsgICAgLyoqPCBTdGF0IFRocmVzaG9sZC4gKi8KKyAgICAgICAgfSBsaW5rX3N0YXRfdGhyZXNoOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB0aW1lOyAgLyoqPCBUaW1lb3V0IHZhbHVlIGluIHNlYyAqLworICAgICAgICB9IGtleV9leHBpcnlfdGltZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlIGVuY3J5cHRpb25fbWV0aG9kOyAvKio8IEVuY3J5cHRpb24gTWV0aG9kLiAqLworICAgICAgICB9IGVuY3J5cHRfbW9kZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSBydWxlOyAgICAgICAgICAgICAgICAgLyoqPCBSdWxlLiAqLworICAgICAgICB9IHBvcnRfaW5ncmVzc19ydWxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlIGZpZWxkX2NvZGU7ICAgICAvKio8IEZpZWxkIENvZGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgbGF5ZXJfc2VsZWN0OyAvKio8IExheWVyIFNlbGVjdC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgYml0X3dvcmRfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMzItYml0IFdvcmQgT2Zmc2V0LiAqLworICAgICAgICAgICAgdWludDhfdCBiaXRfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCaXQgT2Zmc2V0LiAqLworICAgICAgICAgICAgdWludDhfdCBiaXRfd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCaXQgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IHJlZmVyZW5jZV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBDb3VudC4gKi8KKyAgICAgICAgfSBsdWVfZmllbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWx0ZXJuYXRlIEMtVkxBTiBUUElEICovCisgICAgICAgICAgICBiY21vc19ib29sIGluc2VydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZSB0aGlzIFRQSUQgd2hlbiBpbnNlcnRpbmcgQy1WTEFOIHRhZ3MgKi8KKyAgICAgICAgfSBhbHRfY3ZsYW5fZXRoZXJ0eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB0cGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFsdGVybmF0ZSBTLVZMQU4gVFBJRCAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBpbnNlcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2UgdGhpcyBUUElEIHdoZW4gaW5zZXJ0aW5nIFMtVkxBTiB0YWdzICovCisgICAgICAgIH0gYWx0X3N2bGFuX2V0aGVydHlwZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnJvYWRjYXN0IHBhY2tldHMgYWxsb3dlZCBmcm9tIEV0aGVybmV0IHBvcnQgMSBpbiAxIHNlY29uZC4gKi8KKyAgICAgICAgfSBiY19yYXRlX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXAgdHJhZmZpY190eXBlczsgICAvKio8IFRyYWZmaWMgVHlwZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0cyByYXRlX3VuaXRzOyAgICAgICAgICAvKio8IFJhdGUgVW5pdHMuICovCisgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9zaGFwZXJzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBTaGFwZXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyICpzaGFwZXJzOyAgICAgICAgICAgLyoqPCBTaGFwZXJzLiAqLworICAgICAgICB9IGVncmVzc19zaGFwaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0cyByYXRlX3VuaXRzOyAgICAgICAgICAvKio8IFJhdGUgVW5pdHMuICovCisgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9yYXRlX2xldmVsczsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBSYXRlIExldmVscy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKnJhdGVfbGV2ZWxzOyAgIC8qKjwgUmF0ZSBMZXZlbHMuICovCisgICAgICAgIH0gaW5ncmVzc19wb2xpY2luZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGUgcnhfZG93bjsgICAgICAgICAgLyoqPCBSeC9Eb3duLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGUgdHhfdXA7ICAgICAgICAgICAgLyoqPCBUeC9VcC4gKi8KKyAgICAgICAgfSBmZWNfbW9kZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbWFuX25hbWVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbWFuX25hbWUuICovCisgICAgICAgICAgICB1aW50OF90ICptYW5fbmFtZTsgICAgICAgICAgICAgICAgICAvKio8IE1hbiBOYW1lLiAqLworICAgICAgICB9IG1mcl9uYW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGNvZGVfYWNjZXNzX3N0YXJ0WzEzXTsgICAgICAvKio8IENvZGUgQWNjZXNzIFN0YXJ0LiAqLworICAgICAgICAgICAgdWludDhfdCBjdmNfYWNjZXNzX3N0YXJ0WzEzXTsgICAgICAgLyoqPCBDVkMgQWNjZXNzIFN0YXJ0LiAqLworICAgICAgICB9IGZ3YXJlX21mZ190aW1lX3Zhcl9jdHJsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2ZW5kb3JfbmFtZV9jb3VudDsgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2ZW5kb3JfbmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZlbmRvcl9uYW1lOyAgICAgICAgICAgICAgIC8qKjwgT05VIFZlbmRvciBOYW1lICovCisgICAgICAgIH0gdmVuZG9yX25hbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1vZGVsX251bWJlcl9jb3VudDsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG1vZGVsX251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1vZGVsX251bWJlcjsgICAgICAgICAgICAgIC8qKjwgT05VIE1vZGVsIE51bWJlciAqLworICAgICAgICB9IG1vZGVsX251bWJlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgaHdfdmVyc2lvbl9jb3VudDsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gaHdfdmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmh3X3ZlcnNpb247ICAgICAgICAgICAgICAgIC8qKjwgT05VIEhhcmR3YXJlIFZlcnNpb24gKi8KKyAgICAgICAgfSBod192ZXJzaW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjdXJyZW50X3RlbXBlcmF0dXJlLiAqLworICAgICAgICAgICAgdWludDE2X3QgKmN1cnJlbnRfdGVtcGVyYXR1cmU7ICAgICAgLyoqPCBDdXJyZW50IFRlbXBlcmF0dXJlLiAqLworICAgICAgICB9IG9wdF9tb25fdGVtcGVyYXR1cmU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdmNjX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGN1cnJlbnRfdmNjLiAqLworICAgICAgICAgICAgdWludDE2X3QgKmN1cnJlbnRfdmNjOyAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IFZjYy4gKi8KKyAgICAgICAgfSBvcHRfbW9uX3ZjYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF90eF9iaWFzX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY3VycmVudF90eF9iaWFzLiAqLworICAgICAgICAgICAgdWludDE2X3QgKmN1cnJlbnRfdHhfYmlhczsgICAgICAgICAgLyoqPCBDdXJyZW50IFR4IEJpYXMuICovCisgICAgICAgIH0gb3B0X21vbl90eF9iaWFzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3R4X3Bvd2VyX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjdXJyZW50X3R4X3Bvd2VyLiAqLworICAgICAgICAgICAgdWludDE2X3QgKmN1cnJlbnRfdHhfcG93ZXI7ICAgICAgICAgLyoqPCBDdXJyZW50IFR4IFBvd2VyLiAqLworICAgICAgICB9IG9wdF9tb25fdHhfcG93ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfcnhfcG93ZXJfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGN1cnJlbnRfcnhfcG93ZXIuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF9yeF9wb3dlcjsgICAgICAgICAvKio8IEN1cnJlbnQgUnggUG93ZXIuICovCisgICAgICAgIH0gb3B0X21vbl9yeF9wb3dlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfdW5pY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBSeCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICAgICAgfSByeF91bmljYXN0X2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdHhfdW5pY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBUeCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICAgICAgfSB0eF91bmljYXN0X2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzX3Rvb19zaG9ydDsgICAgICAgLyoqPCBSeCBGcmFtZXMgVG9vIFNob3J0LiAqLworICAgICAgICB9IHJ4X2ZyYW1lX3Rvb19zaG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzNjQ7ICAgICAgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgNjQuICovCisgICAgICAgIH0gcnhfZnJhbWU2NDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzNjUxMjc7ICAgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgNjVfMTI3LiAqLworICAgICAgICB9IHJ4X2ZyYW1lNjUxMjc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4X2ZyYW1lczEyODI1NTsgICAgICAgICAgIC8qKjwgUnggRnJhbWVzIDEyOF8yNTUuICovCisgICAgICAgIH0gcnhfZnJhbWUxMjgyNTU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4X2ZyYW1lczI1NjUxMTsgICAgICAgICAgIC8qKjwgUnggRnJhbWVzIDI1Nl81MTEuICovCisgICAgICAgIH0gcnhfZnJhbWUyNTY1MTE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4X2ZyYW1lczUxMjEwMjM7ICAgICAgICAgIC8qKjwgUnggRnJhbWVzIDUxMl8xMDIzLiAqLworICAgICAgICB9IHJ4X2ZyYW1lNTEyMTAyMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzMTAyNDE1MTg7ICAgICAgICAgLyoqPCBSeCBGcmFtZXMgMTAyNF8xNTE4LiAqLworICAgICAgICB9IHJ4X2ZyYW1lMTAyNDE1MTg7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4X2ZyYW1lczE1MTlwbHVzOyAgICAgICAgIC8qKjwgUnggRnJhbWVzIDE1MTkgUGx1cy4gKi8KKyAgICAgICAgfSByeF9mcmFtZTE1MTlwbHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXM2NDsgICAgICAgICAgICAgICAvKio8IFR4IEZyYW1lcyA2NC4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTY0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXM2NTEyNzsgICAgICAgICAgICAvKio8IFR4IEZyYW1lcyA2NV8xMjcuICovCisgICAgICAgIH0gdHhfZnJhbWU2NTEyNzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdHhfZnJhbWVzMTI4MjU1OyAgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgMTI4XzI1NS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTEyODI1NTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdHhfZnJhbWVzMjU2NTExOyAgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgMjU2XzUxMS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTI1NjUxMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdHhfZnJhbWVzNTEyMTAyMzsgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgNTEyXzEwMjMuICovCisgICAgICAgIH0gdHhfZnJhbWU1MTIxMDIzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXMxMDI0MTUxODsgICAgICAgICAvKio8IFR4IEZyYW1lcyAxMDI0XzE1MTguICovCisgICAgICAgIH0gdHhfZnJhbWUxMDI0MTUxODsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdHhfZnJhbWVzMTUxOXBsdXM7ICAgICAgICAgLyoqPCBUeCBGcmFtZXMgMTUxOSBQbHVzLiAqLworICAgICAgICB9IHR4X2ZyYW1lMTUxOXBsdXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfZGVsYXlfdGhyZXNob2xkOyAgICAgIC8qKjwgUXVldWUgRGVsYXkgVGhyZXNob2xkLiAqLworICAgICAgICB9IHF1ZXVlX2RlbGF5X3RocmVzaDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcXVldWVfZGVsYXk7ICAgICAgICAgICAgICAgLyoqPCBRdWV1ZSBEZWxheSAuICovCisgICAgICAgIH0gcXVldWVfZGVsYXk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lc19kcm9wcGVkOyAgICAgICAgICAgIC8qKjwgRnJhbWVzIERyb3BwZWQuICovCisgICAgICAgIH0gZnJhbWVzX2Ryb3BwZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ5dGVzX2Ryb3BwZWQ7ICAgICAgICAgICAgIC8qKjwgQnl0ZXMgRHJvcHBlZC4gKi8KKyAgICAgICAgfSBieXRlc19kcm9wcGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBieXRlc19kZWxheWVkOyAgICAgICAgICAgICAvKio8IEJ5dGVzIERlbGF5ZWQuICovCisgICAgICAgIH0gYnl0ZXNfZGVsYXllZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdHhfYnl0ZXNfdW51c2VkOyAgICAgICAgICAgLyoqPCBUeCBCeXRlcyBVbnVzZWQuICovCisgICAgICAgIH0gdHhfYnl0ZXNfdW51c2VkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb3J0X3R5cGVfY291bnQ7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb3J0X3R5cGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUgKnBvcnRfdHlwZTsgIC8qKjwgUG9ydCBUeXBlLiAqLworICAgICAgICB9IGRvbnVfcG9ydF90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBkZWZfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRlZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgKmRlZjsgICAgICAgICAgICAgICAgICAgIC8qKjwgRGVmYXVsdC4gKi8KKyAgICAgICAgfSBzdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFncyBmaWVsZF9iaXRtYXA7ICAgIC8qKjwgRmllbGQgQml0bWFwLiAqLworICAgICAgICB9IGlwbWNfZm9yd2FyZGluZ19ydWxlX2NvbmZpZ3VyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGFsdGVybmF0ZV9pdHBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbHRlcm5hdGUgSS1UUElELiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBpbnNlcnRfdGhpc190cGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluc2VydCBUaGlzIFRQSUQuICovCisgICAgICAgIH0gaXRwaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGFsdGVybmF0ZV9idHBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbHRlcm5hdGUgQi1UUElELiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBpbnNlcnRfdGhpc190cGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluc2VydCBUaGlzIFRQSUQuICovCisgICAgICAgIH0gYnRwaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbW1pdGVkX2J1cnN0X3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAyNTYgQnl0ZXMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGNvbW1pdGVkX2luZm9ybWF0aW9uX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCAxIEticHMgKi8KKyAgICAgICAgfSBxdWV1ZV9jaXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGV4Y2Vzc19idXJzdF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAyNTYgQnl0ZXMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlX2VpcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAxIEticHMgKi8KKyAgICAgICAgfSBxdWV1ZV9laXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZW5hYmxlX2NvbG9yX21hcmtpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgQ29sb3IgTWFya2luZy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZmllbGRfY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWVsZCBDb2RlLiAqLworICAgICAgICAgICAgdWludDhfdCBmaWVsZF9pbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZpZWxkIEluc3RhbmNlLiAqLworICAgICAgICAgICAgdWludDhfdCBtc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1TQiBNYXNrLiAqLworICAgICAgICAgICAgdWludDhfdCBsc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExTQiBNYXNrLiAqLworICAgICAgICAgICAgdWludDhfdCBncmVlbl92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEdyZWVuIFZhbHVlLiAqLworICAgICAgICAgICAgdWludDhfdCB5ZWxsb3dfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFllbGxvdyBWYWx1ZS4gKi8KKyAgICAgICAgfSBxdWV1ZV9jb2xvcl9tYXJraW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBudW1iZXJfb2ZfcmF0ZV9saW1pdGVyczsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIFJhdGUgTGltaXRlcnMuICovCisgICAgICAgICAgICB1aW50MTZfdCBjYnNfbWluX2luY3JlbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ0JTIE1pbiBJbmNyZW1lbnQuICovCisgICAgICAgICAgICB1aW50MTZfdCBjaXJfbWluX2luY3JlbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ0lSIE1pbiBJbmNyZW1lbnQuICovCisgICAgICAgICAgICB1aW50MTZfdCBlYnNfbWluX2luY3JlbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRUJTIE1pbiBJbmNyZW1lbnQuICovCisgICAgICAgICAgICB1aW50MTZfdCBlaXJfbWluX2luY3JlbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRUlSIE1pbiBJbmNyZW1lbnQuICovCisgICAgICAgICAgICB1aW50OF90IGNvbG9yX2F3YXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29sb3IgQXdhcmUuICovCisgICAgICAgICAgICB1aW50OF90IGNvdXBsaW5nX2NvbmZpZ3VyYWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ291cGxpbmcgQ29uZmlndXJhYmxlLiAqLworICAgICAgICAgICAgdWludDhfdCBjb3VwbGluZ19iZWhhdmlyb19kZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgICAvKio8IENvdXBsaW5nIEJlaGF2aXJvIERlZmF1bHQuICovCisgICAgICAgICAgICB1aW50OF90IGNvbG9yX21hcmtpbmdfc3VwcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29sb3IgTWFya2luZyBTdXBwb3J0LiAqLworICAgICAgICAgICAgdWludDhfdCBzbWFydF9jb2xvcl9kcm9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNtYXJ0IENvbG9yIERyb3AuICovCisgICAgICAgIH0gcXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBjb3VwbGluZ19mbGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENvdXBsaW5nIEZsYWcuICovCisgICAgICAgIH0gY291cGxpbmdfZmxhZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBwcHNfcHVsc2Vfc3VwcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDFQUFMgUHVsc2UgU3VwcG9ydC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgdG9kX3N0cmluZ19zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUT0QgU3RyaW5nIFN1cHBvcnQuICovCisgICAgICAgICAgICBiY21vc19ib29sIHYyZnJhbWVfc3VwcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgWzE1ODh2Ml0gRnJhbWUgU3VwcG9ydC4gKi8KKyAgICAgICAgfSBjbG9ja190cmFuc3BvcnRfY2FwYWJpbGl0aWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHBwc19wdWxzZV9vdXRwdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMSBQUFMgUHVsc2UgT3V0cHV0LiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCB0b2Rfc3RyaW5nX291dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRPRCBTdHJpbmcgT3V0cHV0LiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCB2MmZyYW1lX291dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFsxNTg4djJdIEZyYW1lIE91dHB1dC4gKi8KKyAgICAgICAgfSBlbmFibGVfY2xvY2tfdHJhbnNwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtcGNwX3JlZmVyZW5jZV9wb2ludDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTVBDUCBSZWZlcmVuY2UgUG9pbnQuICovCisgICAgICAgICAgICB1aW50MzJfdCB0b2Rfc3RyaW5nX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRvZF9zdHJpbmcuICovCisgICAgICAgICAgICB1aW50OF90ICp0b2Rfc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVE9EIFN0cmluZy4gKi8KKyAgICAgICAgfSB0aW1lX3RyYW5zZmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBuZG93bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTmRvd24uICovCisgICAgICAgICAgICB1aW50MzJfdCBudXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVwLiAqLworICAgICAgICB9IHByb3BhZ2F0aW9uX3BhcmFtZXRlcnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ0dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSVFQuICovCisgICAgICAgIH0gcnR0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBzdGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUy1UQUcuICovCisgICAgICAgICAgICB1aW50MzJfdCBjdGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQy1UQUcuICovCisgICAgICAgIH0gZGFjX2NvbmZpZ3VyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgbGxkcF9pbnN0YW5jZV9zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMTERQIEluc3RhbmNlIFN0YXR1cy4gKi8KKyAgICAgICAgfSBkYWNfY29uZmlndXJhdGlvbl9lbmFibGVfZGlzYWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfYnJvYWRjYXN0X2ZyYW1lczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJ4IEJyb2FkY2FzdCBGcmFtZXMuICovCisgICAgICAgIH0gcnhfZnJhbWVfYnJvYWRjYXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9icm9hZGNhc3RfZnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHggQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICAgICAgfSB0eF9mcmFtZXNfYnJvYWRjYXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9tdWx0aWNhc3RfZnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHggTXVsdGljYXN0IEZyYW1lcy4gKi8KKyAgICAgICAgfSB0eF9mcmFtZXNfbXVsdGljYXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9tdWx0aWNhc3RfZnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnggTXVsdGljYXN0IEZyYW1lcy4gKi8KKyAgICAgICAgfSByeF9mcmFtZXNfbXVsdGljYXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9ieXRlc19ncmVlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHggQnl0ZXMgR3JlZW4uICovCisgICAgICAgIH0gdHhfYnl0ZXNfZ3JlZW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4X2J5dGVzX2dyZWVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSeCBCeXRlcyBHcmVlbi4gKi8KKyAgICAgICAgfSByeF9ieXRlc19ncmVlbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4IGxsaWRfdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IExMSUQgVmFsdWUuICovCisgICAgICAgIH0gb251X21jYXN0X2xsaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYWMgQWRkcmVzcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdW5pX3BvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmkgUG9ydC4gKi8KKyAgICAgICAgfSB1bmlfbWFjX2xlYXJuZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgb3Zlcl93cml0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAwOiBEaXNjYXJkOyAxOiBPdmVyd3JpdGUgKi8KKyAgICAgICAgfSB1bmlfbWFjX3RhYmxlX2Z1bGxfYmVoYXZpb3I7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlIHB3cl9zYXZpbmdfbW9kZTsgLyoqPCBQd3IgU2F2aW5nIE1vZGUuICovCisgICAgICAgICAgICBiY21vc19ib29sIGVhcmx5X3dha2VfdXBfc3VwcG9ydDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRWFybHkgV2FrZSBVcCBTdXBwb3J0LiAqLworICAgICAgICAgICAgdWludDhfdCB2ZW5fc3BlY19maWVsZF9zaXplOyAgICAvKio8IFZlbiBTcGVjIEZpZWxkIFNpemUuICovCisgICAgICAgICAgICB1aW50OF90ICp2ZW5fc3BlY19maWVsZDsgICAgICAgIC8qKjwgVmVuIFNwZWMgRmllbGQgLiAqLworICAgICAgICB9IG9udV9wd3Jfc2F2aW5nX2NhcDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlOworCisvKiogRFBvRSBBdHRyaWJ1dGUgVmFsdWUgTUFDIFRhYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZQoreworICAgIHVpbnQzMl90IG1hY19hZGRyZXNzX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbWFjX2FkZHJlc3MuICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hY19hZGRyZXNzOyAvKio8IE1BQyBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlOworCisvKiogRFBvRSBFdmVudCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUgZXZlbnRfY29kZTsgLyoqPCBFdmVudCBDb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCByYWlzZWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBSYWlzZWQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsgICAvKio8IE9iamVjdCBUeXBlLiAqLworICAgICAgICAgICAgdWludDE2X3Qgb2JqZWN0X2luc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3QgSW5zdGFuY2UuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHJhaXNlZDsgIC8qKjwgUmFpc2VkLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7ICAgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG9iamVjdF9pbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IEluc3RhbmNlLiAqLworICAgICAgICAgICAgdWludDhfdCBzdGF0X2JyYW5jaDsgICAgLyoqPCBTdGF0IEJyYW5jaC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHN0YXRfbGVhZjsgICAgIC8qKjwgU3RhdCBMZWFmLiAqLworICAgICAgICB9IHN0YXRpc3RpY3NfYWxhcm07CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlOworCisvKiogRFBvRSBGaWxlIFRyYW5zZmVyIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSBvcGNvZGU7ICAgLyoqPCBPcGNvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgZmlsZV90eXBlOyAgIC8qKjwgRmlsZSBUeXBlLiAqLworICAgICAgICB9IGZpbGVfcmVhZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmlsZW5hbWVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBmaWxlbmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmZpbGVuYW1lOyAgLyoqPCBGaWxlbmFtZS4gKi8KKyAgICAgICAgfSBmaWxlX3dyaXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBibG9jazsgICAgIC8qKjwgQmxvY2suICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgIC8qKjwgTGVuZ3RoLiAqLworICAgICAgICAgICAgdWludDhfdCAqZGF0YTsgICAgICAvKio8IERhdGEuICovCisgICAgICAgIH0gZmlsZV9kYXRhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBibG9jazsgICAgIC8qKjwgQmxvY2suICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yIGVycm9yOyAvKio8IEVycm9yLiAqLworICAgICAgICB9IGZpbGVfYWNrOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlOworCisvKiogRFBvRSBJbmZvIFRMVi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2Cit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSB0eXBlOyAgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRwb2Vfb2FtX3ZlcnNpb247ICAgICAgICAgICAvKio8IERQb0UgT0FNIFZlcnNpb24uICovCisgICAgICAgIH0gZHBvZV9vYW1fc3VwcG9ydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2OworCisvKiogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIG51bWVyaWMgOC1iaXQgdmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZQoreworICAgIHVpbnQ4X3QgdmFsdWU7ICAvKio8IEFuIDgtYml0IG51bWVyaWMgdmFsdWUuICovCit9IGJjbW9sdF9lcG9uX29hbV91OHZhbHVlOworCisvKiogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIG51bWVyaWMgNjQtYml0IHZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlCit7CisgICAgdWludDY0X3QgdmFsdWU7IC8qKjwgQSA2NC1iaXQgbnVtZXJpYyB2YWx1ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlOworCisvKiogU3RkIEF0dHJpYnV0ZSBWYWx1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19mcmFtZXNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19zaW5nbGVfY29sbF9mcmFtZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19tdWx0aXBsZV9jb2xsX2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lc19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2Zjc19lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19hbGlnbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19vY3RldHNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19mcmFtZXNfZGVmZXJyZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19sYXRlX2NvbGxpc2lvbnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19leGNlc3NpdmVfY29sbGlzaW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lc19sb3N0X21hY190eF9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jYXJyaWVyX3NlbnNlX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX29jdGV0c19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lc19sb3N0X21hY19yeF9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19tY2FzdF9mcmFtZXNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19iY2FzdF9mcmFtZXNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19mcl9leGNlc3NpdmVfZGVmZXJyYWw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19tY2FzdF9mcmFtZXNfcnhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19iY2FzdF9mcmFtZXNfcnhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19pbl9yYW5nZV9sZW5fZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfb3V0X29mX3JhbmdlX2xlbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19mcmFtZV90b29fbG9uZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdHVzLiAqLworICAgICAgICB9IG1hY19lbmFibGVfc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNQUMgQWRkcmVzcy4gKi8KKyAgICAgICAgfSBtYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZSB0eXBlOyAgICAgICAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICAgICAgfSBwaHlfdHlwZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcGh5X3N5bWJvbF9lcnJfZHVyaW5nX2NhcnJpZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IHBoeV9hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgdmFsdWU7ICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWF1X21lZGlhX2F2YWlsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfYWRtaW5fc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWcgdmFsdWU7ICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF1dG9fbmVnX3JlbW90ZV9zaWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF1dG9fbmVnX2F1dG9fY2ZnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjYXBhYmlsaXRpZXNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY2FwYWJpbGl0aWVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKmNhcGFiaWxpdGllczsgIC8qKjwgQ2FwYWJpbGl0aWVzLiAqLworICAgICAgICB9IGF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY2FwYWJpbGl0aWVzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjYXBhYmlsaXRpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqY2FwYWJpbGl0aWVzOyAgLyoqPCBDYXBhYmlsaXRpZXMuICovCisgICAgICAgIH0gYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY2FwYWJpbGl0aWVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKmNhcGFiaWxpdGllczsgIC8qKjwgQ2FwYWJpbGl0aWVzLiAqLworICAgICAgICB9IGF1dG9fbmVnX3J4X3RlY2g7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yIHZhbHVlOyAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19sb2NhbF9zZWxlY3RfYWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgdmFsdWU7ICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF1dG9fbmVnX2FkX3NlbGVjdF9hYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3RvciB2YWx1ZTsgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfcnhfc2VsZWN0X2FibGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZHVwbGV4X3N0YXR1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZnVuY3Rpb25zX2NvdW50OyAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBmdW5jdGlvbnMuICovCisgICAgICAgICAgICB1aW50MTZfdCAqZnVuY3Rpb25zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRnVuY3Rpb25zLiAqLworICAgICAgICB9IG1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jdHJsX2ZyYW1lc190eDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jdHJsX2ZyYW1lc19yeDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jdHJsX3Vuc3VwcG9ydGVkX29wX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfcGF1c2VfZGVsYXk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfY3RybF9wYXVzZV90eDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jdHJsX3BhdXNlX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb2FtX2xvY2FsX2Vycl9mcmFtZV9zZWNzX2V2ZW50OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb2FtX2xvY2FsX2Vycl9mcmFtZV9wZXJpb2RfZXZlbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvYW1fbG9jYWxfZXJyX2ZyX3NlY19zdW1fZXZlbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvYW1fZW11bF9jcmM4ZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9tYWNfY3RybF9mcmFtZXNfdHg7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX21hY19jdHJsX2ZyYW1lc19yeDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfZGlzY292ZXJ5X3dpbmRvd190eDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfZGlzY292ZXJ5X3RpbWVvdXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZmVjX2NvcnJlY3RlZF9ibG9ja3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZmVjX3VuY29ycmVjdGFibGVfYmxvY2tzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGZlY19hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGZlY19tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfdHhfZ2F0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3R4X3JlZ19hY2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF90eF9yZWdpc3RlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3R4X3JlZ19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfdHhfcmVwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfcnhfZ2F0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3J4X3JlZ19hY2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9yeF9yZWdpc3RlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3J4X3JlZ19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfcnhfcmVwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jb2xsaXNpb25fZnJhbWVzOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWU7CisKKy8qKiBTdGQgQWN0aW9uIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiBsZWFmOyAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZTsKKworLyoqIERQb0UgVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIGJyYW5jaDsgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlIG9iamVjdF9jb250ZXh0OyAgICAvKio8IE9iamVjdCBDb250ZXh0LiAqLworICAgICAgICB9IG9iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgYXR0cmlidXRlOyAgICAgICAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gc3RhbmRhcmRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlIGFjdGlvbjsgICAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIGF0dHJpYnV0ZTsgICAgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGV4dGVuZGVkX2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgYWN0aW9uOyAgICAgICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgIH0gZXh0ZW5kZWRfYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZTsKKworLyoqIERQb0UgVmVuZG9yIEV4dGVuZGVkIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSBvcDsgICAgICAgICAgICAgICAgICAgICAvKio8IE9wLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnZhcnM7ICAvKio8IFZhcnMuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBnZXRfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKnZhcnM7ICAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKnZhcnM7ICAgICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IHNldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGUgYWN0aW9uX2NvZGU7ICAgIC8qKjwgQWN0aW9uIENvZGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBtdWx0aWNhc3RfbGxpZDsgICAgLyoqPCBNdWx0aWNhc3QgTExJRC4gKi8KKyAgICAgICAgfSBtY2FzdF9yZWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIHN0YXR1czsgICAvKio8IFN0YXR1cy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG11bHRpY2FzdF9sbGlkOyAgICAvKio8IE11bHRpY2FzdCBMTElELiAqLworICAgICAgICB9IG1jYXN0X3JlZ19yZXNwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGtleV9udW1iZXI7ICAgICAgICAgLyoqPCBLZXkgTnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCBrZXlfbGVuZ3RoOyAgICAgICAgIC8qKjwgS2V5IExlbmd0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmtleV9kYXRhOyAgICAgICAgICAvKio8IEtleSBEYXRhLiAqLworICAgICAgICB9IGtleV9leGNoYW5nZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlIGZpbGVfdHJhbnNmZXI7ICAvKio8IEZpbGUgVHJhbnNmZXIuICovCisgICAgICAgIH0gZmlsZV90cmFuc2ZlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24gYWN0aW9uOyAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBMTElELiAqLworICAgICAgICAgICAgdWludDhfdCBpcHNhWzE2XTsgICAgICAgICAgICAgICAvKio8IElQIFNBLiAqLworICAgICAgICAgICAgdWludDhfdCBpcGRhWzE2XTsgICAgICAgICAgICAgICAvKio8IElQIERBLiAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgY2xpZW50X21hYzsgICAvKio8IENsaWVudCBNYWMuICovCisgICAgICAgIH0gZHluYW1pY19pcG1jYXN0X2N0cmw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIHJlc3VsdF9jb2RlOyAgLyoqPCBSZXN1bHQgQ29kZS4gKi8KKyAgICAgICAgfSBkeW5hbWljX2lwbWNhc3RfY3RybF9yZXNwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiBhY3Rpb247ICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGxpZDsgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50OF90IGlwc2FbMTZdOyAgIC8qKjwgSVAgU0EuICovCisgICAgICAgICAgICB1aW50OF90IGlwZGFbMTZdOyAgIC8qKjwgSVAgREEuICovCisgICAgICAgICAgICB1aW50OF90IHBvcnQ7ICAgICAgIC8qKjwgUG9ydC4gKi8KKyAgICAgICAgfSBzdGF0aWNfaXBtY2FzdF9jdHJsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZSByZXN1bHRfY29kZTsgIC8qKjwgUmVzdWx0IENvZGUuICovCisgICAgICAgIH0gc3RhdGljX2lwbWNhc3RfY3RybF9yZXNwOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2U7CisKKy8qKiBUTFMgVmVyc2lvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbgoreworICAgIHVpbnQ4X3QgbWFqb3I7ICAvKio8IE1ham9yLiAqLworICAgIHVpbnQ4X3QgbWlub3I7ICAvKio8IE1pbm9yLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb247CisKKy8qKiBUTFMgUmFuZG9tLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb20KK3sKKyAgICB1aW50MzJfdCB1bml4X3RpbWU7IC8qKjwgVW5peCBUaW1lLiAqLworICAgIHVpbnQ4X3QgcmFuZG9tWzI4XTsgLyoqPCBSYW5kb20uICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tOworCisvKiogVExTIFNlc3Npb24gSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQKK3sKKyAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAvKio8IExlbmd0aC4gKi8KKyAgICB1aW50OF90ICpzZXNzaW9uX2lkOyAgICAvKio8IFNlc3Npb24gSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZDsKKworLyoqIFRMUyBDaXBoZXJzdWl0ZSBMaXN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0Cit7CisgICAgdWludDE2X3QgbGVuZ3RoOyAgICAvKio8IExlbmd0aC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlICpjaXBoZXJzdWl0ZXM7ICAvKio8IENpcGhlcnN1aXRlcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0OworCisvKiogVExTIENvbXByZXNzaW9uIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QKK3sKKyAgICB1aW50OF90IGxlbmd0aDsgLyoqPCBMZW5ndGguICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgKm1ldGhvZHM7ICAgIC8qKjwgTWV0aG9kcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0OworCisvKiogVExTIENlcnRpZmljYXRlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QKK3sKKyAgICB1aW50MzJfdCBjZXJ0aWZpY2F0ZV9saXN0X2NvdW50OyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjZXJ0aWZpY2F0ZV9saXN0LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqY2VydGlmaWNhdGVfbGlzdDsgIC8qKjwgQ2VydGlmaWNhdGUgTGlzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0OworCisvKiogVExTIENlcnRpZmljYXRlIFR5cGUgTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0Cit7CisgICAgdWludDhfdCBsZW5ndGg7IC8qKjwgTGVuZ3RoLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSAqY2VydGlmaWNhdGVfdHlwZXM7ICAgIC8qKjwgQ2VydGlmaWNhdGUgVHlwZXMuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0OworCisvKiogVExTIEhhbmRzaGFrZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSBpZDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJRC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKio8IFZlcnNpb24uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSByYW5kb207ICAgICAgICAgICAgICAgICAgLyoqPCBSYW5kb20uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgc2Vzc2lvbl9pZDsgICAgICAgICAgLyoqPCBTZXNzaW9uIElELiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0IGNpcGhlcl9zdWl0ZXM7IC8qKjwgQ2lwaGVyIFN1aXRlcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCBjb21wcmVzc2lvbl9tZXRob2RzOyAgIC8qKjwgQ29tcHJlc3Npb24gTWV0aG9kcy4gKi8KKyAgICAgICAgfSBjbGllbnRfaGVsbG87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIHJhbmRvbTsgICAgICAgICAgICAgIC8qKjwgUmFuZG9tLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkIHNlc3Npb25faWQ7ICAgICAgLyoqPCBTZXNzaW9uIElELiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSBjaXBoZXJzdWl0ZTsgICAgLyoqPCBDaXBoZXJzdWl0ZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kIGNvbXByZXNzaW9uX21ldGhvZDsgICAgICAgICAgLyoqPCBDb21wcmVzc2lvbiBNZXRob2QuICovCisgICAgICAgIH0gc2VydmVyX2hlbGxvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY2VydGlmaWNhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0IGNlcnRpZmljYXRlX3R5cGVzOyAgICAgICAgLyoqPCBDZXJ0aWZpY2F0ZSBUeXBlcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCBjZXJ0aWZpY2F0ZV9hdXRob3JpdGllczsgICAgLyoqPCBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcy4gKi8KKyAgICAgICAgfSBjZXJ0aWZpY2F0ZV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBoYXNoX3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBIYXNoIFNpemUuICovCisgICAgICAgICAgICB1aW50OF90ICplbmNyeXB0ZWRfaGFzaDsgICAgICAgICAgICAgICAgLyoqPCBFbmNyeXB0ZWQgSGFzaC4gKi8KKyAgICAgICAgfSBjZXJ0aWZpY2F0ZV92ZXJpZnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUuICovCisgICAgICAgICAgICB1aW50OF90ICplbmNyeXB0ZWRfcHJlX21hc3Rlcl9zZWNyZXQ7ICAgLyoqPCBFbmNyeXB0ZWQgUHJlIE1hc3RlciBTZWNyZXQuICovCisgICAgICAgIH0gY2xpZW50X2tleV9leGNoYW5nZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmVyaWZ5X2RhdGFfY291bnQ7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZlcmlmeV9kYXRhLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmVyaWZ5X2RhdGE7ICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyaWZ5IERhdGEuICovCisgICAgICAgIH0gZmluaXNoZWQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZTsKKworLyoqIFRMUyBSZWNvcmQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZAoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIGNvbnRlbnRfdHlwZTsgICAgICAgICAgICAgIC8qKjwgQ29udGVudCBUeXBlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbmRzaGFrZV9yZWNvcmRzX2NvdW50OyAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBoYW5kc2hha2VfcmVjb3Jkcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICpoYW5kc2hha2VfcmVjb3JkczsgICAvKio8IEhhbmRzaGFrZSBSZWNvcmRzLiAqLworICAgICAgICB9IGhhbmRzaGFrZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkOworCisvKiogRUFQIFRMUyBNZXNzYWdlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3MgZmxhZ3M7ICAgICAgICAgICAgLyoqPCBGbGFncy4gKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVpbnQzMl90IHRsc19yZWNvcmRzX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGxzX3JlY29yZHMuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRsc19yZWNvcmRzOyAgICAvKio8IFRMUyBSZWNvcmRzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlOworCisvKiogRUFQIFRMUyBIZWFkZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUgc3ViX3R5cGU7ICAgICAgICAgICAvKio8IFN1YiBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0aGVudGljYXRpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXI7CisKKy8qKiBFQVAgRnJhbWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlIGNvZGU7ICAgICAgICAgICAgICAgICAgLyoqPCBDb2RlLiAqLworICAgIHVpbnQ4X3QgaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSUQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWU7CisKKy8qKiBFQVBPTCBQRFUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1Cit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgdHlwZTsgICAgICAgICAgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHBhY2tldDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHU7CisKKy8qKiBFQVBPTCBQcm90b2NvbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbAoreworICAgIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uIHZlcnNpb247ICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkZWY7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2w7CisKKy8qKiBWTEFOIFZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUKK3sKKyAgICB1aW50OF90IHBjcDsgICAgLyoqPCBQQ1AuICovCisgICAgdWludDhfdCBjZmk7ICAgIC8qKjwgQ0ZJLiAqLworICAgIHVpbnQxNl90IHZpZDsgICAvKio8IFZJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWU7CisKKy8qKiBJLVRhZyBWYWx1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlCit7CisgICAgdWludDhfdCBwY3A7ICAgIC8qKjwgUENQLiAqLworICAgIHVpbnQ4X3QgZGVpOyAgICAvKio8IERFSS4gKi8KKyAgICB1aW50OF90IHVjYTsgICAgLyoqPCBVQ0EuICovCisgICAgdWludDhfdCByZXM7ICAgIC8qKjwgUkVTLiAqLworICAgIHVpbnQzMl90IGlzaWQ7ICAvKio8IEktU0lELiAqLworfSBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZTsKKworLyoqIFRlayBJbmZvIFRMVi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGUgdHlwZTsgICAgICAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzIHJlcG9ydF9tb2RlOyAgIC8qKjwgRm9yIHRoZSBPTFQgdGhlc2UgYXJlIHRoZSBzdXBwb3J0ZWQgbW9kZXMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzIHByZWZlcnJlZF9yZXBvcnRfbW9kZTsgLyoqPCBPbmx5IHNlbnQgYnkgT0xUICovCisgICAgICAgIH0gZXh0ZW5zaW9uX3N1cHBvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2OworCisvKiogT3JnYW5pemF0aW9uIFNwZWNpZmljIEluZm8uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8KK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9VSS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgdGx2czsgICAgICAgICAgICAgICAgICAvKio8IFRMVnMuICovCisgICAgICAgIH0gdGVrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGV4dGVuc2lvbl9zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHRlbnNpb24gU3VwcG9ydC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZlcnNpb24uICovCisgICAgICAgICAgICB1aW50MzJfdCBzdXBwX3ZlcnNpb25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc3VwcF92ZXJzaW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyICpzdXBwX3ZlcnNpb247IC8qKjwgU3VwcCBWZXJzaW9uLiAqLworICAgICAgICB9IGN0YzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgZHBvZV9pbmZvX3RsdjsgICAgICAgIC8qKjwgRFBvRSBJbmZvIFRMVi4gKi8KKyAgICAgICAgfSBkcG9lOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvOworCisvKiogTG9jYWwvUmVtb3RlIEluZm9ybWF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvCit7CisgICAgdWludDhfdCBvYW1fdmVyc2lvbjsgICAgLyoqPCBPQU0gVmVyc2lvbi4gKi8KKyAgICB1aW50MTZfdCByZXZpc2lvbjsgICAgICAvKio8IFJldmlzaW9uLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSBzdGF0ZTsgICAgICAgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnIG9hbV9jb25maWc7ICAgIC8qKjwgT0FNIENvbmZpZ3VyYXRpb24uICovCisgICAgdWludDE2X3QgbWF4X3BkdV9zaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IFBEVSBTaXplLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBvdWk7ICAgICAvKio8IE9VSS4gKi8KKyAgICB1aW50OF90IHZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvbls0XTsgLyoqPCBWZW5kb3IgU3BlY2lmaWMgSW5mb3JtYXRpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbzsKKworLyoqIEluZm8gVExWIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlIHR5cGU7IC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9yZ2FuaXphdGlvbl9zcGVjaWZpYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvIGluZm87IC8qKjwgSW5mby4gKi8KKyAgICAgICAgfSByZW1vdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyBpbmZvOyAvKio8IEluZm8uICovCisgICAgICAgIH0gbG9jYWw7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZTsKKworLyoqIE9yZ2FuaXphdGlvbiBTcGVjaWZpYyBMaW5rIEV2ZW50IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBvdWk7ICAgICAgICAgICAgICAgICAvKio8IE9VSS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSBhbGFybV9jb2RlOyAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCByYWlzZWQ7ICAvKio8IFJhaXNlZC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHBvcnQ7ICAgICAgLyoqPCBQb3J0LiAqLworICAgICAgICAgICAgdWludDE2X3QgbGluazsgICAgICAvKio8IExpbmsuICovCisgICAgICAgICAgICB1aW50MTZfdCBxdWV1ZTsgICAgIC8qKjwgUXVldWUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQgYWxhcm1fY29udGV4dDsgICAgLyoqPCBBbGFybSBDb250ZXh0LiAqLworICAgICAgICB9IHRlazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZHBvZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY3RjOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2U7CisKKy8qKiBMaW5rIEV2ZW50IFRMViBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlIHR5cGU7ICAgLyoqPCBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvcmdhbml6YXRpb25fc3BlY2lmaWM7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZTsKKworLyoqIFZhciBEZXNjcmlwdG9yIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGJyYW5jaDsgICAgICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0IGxlYWY7ICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBvYmplY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlIGxlYWY7ICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IHBhY2thZ2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmcgbGVhZjsgLyoqPCBMZWFmLiAqLworICAgICAgICB9IG5hbWVfYmluZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZTsKKworLyoqIFZhciBDb250YWluZXIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgbGVhZjsgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFsdWUuICovCisgICAgICAgICAgICB1aW50OF90ICp2YWx1ZTsgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UgbGVhZjsgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcGFja2FnZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyBsZWFmOyAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFsdWUuICovCisgICAgICAgICAgICB1aW50OF90ICp2YWx1ZTsgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG5hbWVfYmluZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFsdWUuICovCisgICAgICAgICAgICB1aW50OF90ICp2YWx1ZTsgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiBsZWFmOyAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZTsKKworLyoqIFRlayBPYmplY3QgUXVldWUgTmFtZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWUKK3sKKyAgICB1aW50MTZfdCBwb3J0X251bWJlcjsgICAvKio8IFBvcnQgTnVtYmVyLiAqLworICAgIHVpbnQxNl90IGxpbmtfbnVtYmVyOyAgIC8qKjwgTGluayBOdW1iZXIuICovCisgICAgdWludDE2X3QgcXVldWVfbnVtYmVyOyAgLyoqPCBRdWV1ZSBOdW1iZXIuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWU7CisKKy8qKiBUZWsgT2JqZWN0IENvbnRleHQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0Cit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsgICAgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAvKio8IExlbmd0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxpbmtfbnVtYmVyX2NvdW50OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBsaW5rX251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmxpbmtfbnVtYmVyOyAgICAgICAvKio8IExpbmsgTnVtYmVyLiAqLworICAgICAgICB9IGxvZ2ljYWxfbGluazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBxdWV1ZV9uYW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb3J0X251bWJlcl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb3J0X251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBvcnRfbnVtYmVyOyAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgICAgIH0gcG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhbGxfcXVldWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb25fbnVtYmVyX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb25fbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9uX251bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBOdW1iZXIuICovCisgICAgICAgIH0gbmV0d29ya19wb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvbl9udW1iZXJfY291bnQ7ICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcG9uX251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBvbl9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQT04gTnVtYmVyLiAqLworICAgICAgICB9IHVzZXJfcG9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gZGlyZWN0aW9uOyAgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgICAgICB9IGZsb3dfZGlyZWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBicmlkZ2VfbnVtYmVyX2NvdW50OyAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGJyaWRnZV9udW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90ICpicmlkZ2VfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQnJpZGdlIE51bWJlci4gKi8KKyAgICAgICAgfSBicmlkZ2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfbnVtYmVyX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcG9ydF9udW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90ICpwb3J0X251bWJlcjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgICAgIH0gYnJpZGdlX3BvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0OworCisvKiogVGVrIFZhciBEZXNjcmlwdG9yLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcgoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoIGJyYW5jaDsgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgb2JqZWN0X2NvbnRleHQ7ICAvKio8IE9iamVjdCBDb250ZXh0LiAqLworICAgICAgICB9IG5hbWVfYmluZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSBhbGFybV9jb2RlOyAgICAgICAgICAvKio8IEFsYXJtIENvZGUuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3I7CisKKy8qKiBMVUUgRmllbGQgU2VsZWN0IEVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkKK3sKKyAgICB1aW50OF90IGxheWVyX3NlbGVjdDsgICAvKio8IExheWVyIFNlbGVjdC4gKi8KKyAgICB1aW50OF90IGR3b3JkX29mZnNldDsgICAvKio8IER3b3JkIG9mZnNldC4gKi8KKyAgICB1aW50OF90IGZpZWxkX2xlbmd0aDsgICAvKio8IEZpZWxkIExlbmd0aC4gKi8KKyAgICB1aW50OF90IGJpdF9vZmZzZXQ7ICAgICAvKio8IEJpdCBvZmZzZXQuICovCit9IGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5OworCisvKiogVGVrIE9OVSBSdWxlIENsYXVzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0IGZpZWxkX3NlbGVjdDsgIC8qKjwgRmllbGQgU2VsZWN0LiAqLworICAgIHVpbnQ2NF90IGxvb2t1cF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29rdXAgVmFsdWUuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvciBvcDsgICAvKio8IE9wLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZTsKKworLyoqIFRlayBPTlUgUnVsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUKK3sKKyAgICB1aW50OF90IGRpcmVjdGlvbjsgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MgZmxhZ3M7ICAgLyoqPCBGbGFncy4gKi8KKyAgICB1aW50OF90IHBvcnRfbGluazsgIC8qKjwgUG9ydC9MaW5rLiAqLworICAgIHVpbnQ4X3QgcXVldWU7ICAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICB1aW50MTZfdCB2aWRfY29zOyAgIC8qKjwgVklEL0NvUy4gKi8KKyAgICB1aW50OF90IHJlc2VydmVkOyAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgdWludDhfdCBwcmVjZWRlbmNlOyAvKio8IFByZWNlZGVuY2UuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gYWN0aW9uOyAgICAgLyoqPCBBY3Rpb24uICovCisgICAgdWludDhfdCBjbGF1c2VzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDbGF1c2VzIENvdW50LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlICpjbGF1c2VzOyAgIC8qKjwgQ2xhdXNlcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZTsKKworLyoqIFRlayBPTlUgSUdNUCBWTEFOLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuCit7CisgICAgYmNtb3Nfdmxhbl90YWcgZXBvbl92bGFuOyAgIC8qKjwgRVBPTiBWTEFOLiAqLworICAgIGJjbW9zX3ZsYW5fdGFnIHVzZXJfdmxhbjsgICAvKio8IFVzZXIgVkxBTi4gKi8KKyAgICB1aW50OF90IG1heF9hbGxvd2VkX2dyb3VwczsgLyoqPCBNYXggQWxsb3dlZCBHcm91cHMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbjsKKworLyoqIFRlayBWTEFOIERlc3RpbmF0aW9uIE1hcHBpbmcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZworeworICAgIGJjbW9zX3ZsYW5fdGFnIHZsYW5fdGFnOyAgICAvKio8IFZMQU4gVGFnLiAqLworICAgIHVpbnQ4X3QgbGlua19pbmRleDsgICAgICAgICAvKio8IExpbmsgSW5kZXguICovCisgICAgdWludDhfdCBxdWV1ZV9pbmRleDsgICAgICAgIC8qKjwgUXVldWUgSW5kZXguICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nOworCisvKiogTG9hZCBUaW1lc3RhbXAgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wCit7CisgICAgdWludDE2X3QgeWVhcjsgIC8qKjwgWWVhci4gKi8KKyAgICB1aW50OF90IG1vbnRoOyAgLyoqPCBNb250aC4gKi8KKyAgICB1aW50OF90IGRheTsgICAgLyoqPCBEYXkuICovCisgICAgdWludDhfdCBob3VyOyAgIC8qKjwgSG91ci4gKi8KKyAgICB1aW50OF90IG1pbjsgICAgLyoqPCBNaW4uICovCisgICAgdWludDhfdCBzZWM7ICAgIC8qKjwgU2VjLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcDsKKworLyoqIFJ1bGUgRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeQoreworICAgIHVpbnQxNl90IGxlYXJuaW5nX2RvbWFpbjsgICAvKio8IExlYXJuaW5nIERvbWFpbi4gKi8KKyAgICB1aW50OF90IHN0YXQ7ICAgICAgICAgICAgICAgLyoqPCBTdGF0aWMuICovCisgICAgdWludDhfdCByaWdodF9tYXNrOyAgICAgICAgIC8qKjwgUmlnaHQgTWFzay4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlIGJpbnNlbGVjdDsgICAgICAgICAgICAgLyoqPCBCaW5TZWxlY3QuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2E7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjIHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgdmFsdWU7ICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHNzbV9wbHVzX2lwZGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlIHZhbHVlOyAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBwcm9nX2ZpZWxkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQgdmFsdWU7ICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY3ZsYW5fdmlkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3ZsYW5fdmlkX2N2bGFuX3ZpZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5OworCisvKiogVGVrIEF0dHJpYnV0ZSBWYWx1ZSBSdWxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgbGVhZjsgLyoqPCBMZWFmLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eTsgICAgICAgLyoqPCBQcmlvcml0eS4gKi8KKyAgICAgICAgfSBoZWFkZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdCBmaWVsZF9zZWxlY3Q7IC8qKjwgRmllbGQgU2VsZWN0LiAqLworICAgICAgICAgICAgdWludDhfdCBmaWVsZF9pbnN0YW5jZTsgICAgICAgICAgICAgICAgIC8qKjwgRmllbGQgSW5zdGFuY2UuICovCisgICAgICAgICAgICB1aW50OF90IG1zYl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNU0IgTWFzay4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbHNiX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IExTQiBNYXNrLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3Igb3BlcmF0b3I7IC8qKjwgT3BlcmF0b3IuICovCisgICAgICAgICAgICB1aW50MzJfdCBtYXRjaF92YWx1ZV9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbWF0Y2hfdmFsdWUuICovCisgICAgICAgICAgICB1aW50OF90ICptYXRjaF92YWx1ZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNYXRjaCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjbGF1c2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiByZXN1bHQ7ICAgICAvKio8IFJlc3VsdC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtZXRlcl9jb3VudDsgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwYXJhbWV0ZXIuICovCisgICAgICAgICAgICB1aW50OF90ICpwYXJhbWV0ZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBQYXJhbWV0ZXIuICovCisgICAgICAgIH0gcmVzdWx0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSB2YWx1ZTsgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBlbnRyeTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGU7CisKKy8qKiBVbmkgU2hhcGVyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIKK3sKKyAgICB1aW50MzJfdCBxdWV1ZV9iaXRtYXA7ICAvKio8IFF1ZXVlIEJpdG1hcC4gKi8KKyAgICB1aW50MzJfdCBzaGFwZV9yYXRlOyAgICAvKio8IFVuaXRzIDIga2JwcyAqLworICAgIHVpbnQxNl90IGJ1cnN0X3NpemU7ICAgIC8qKjwgVW5pdCAyNTYgYnl0ZXMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXI7CisKKy8qKiBEZXRhaWxlZCB2ZXJzaW9uIG51bWJlciAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyCit7CisgICAgdWludDhfdCBtYWpvcjsgIC8qKjwgTWFqb3IgdmVyc2lvbiBudW1iZXIgKi8KKyAgICB1aW50OF90IG1pbm9yOyAgLyoqPCBNaW5vciB2ZXJzaW9uIG51bWJlciAqLworICAgIHVpbnQxNl90IHBhdGNoOyAvKio8IFBhdGNoIHJldmlzaW9uIG51bWJlciAqLworfSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXI7CisKKy8qKiBFeHRlbmRlZCBMb2FkIExhYmVsLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWwKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5IG1hdHVyaXR5OyAgICAgICAgICAgICAgLyoqPCBNYXR1cml0eS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgdmVyc2lvbjsgICAgLyoqPCBWZXJzaW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbDsKKworLyoqIEZpbGUgSW5mbyBGaXJtd2FyZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUKK3sKKyAgICB1aW50MTZfdCBsZWdhY3lfdmVyc2lvbjsgICAgLyoqPCBMZWdhY3kgVmVyc2lvbi4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCBuZXdfdmVyc2lvbjsgICAgLyoqPCBOZXcgVmVyc2lvbi4gKi8KKyAgICB1aW50MzJfdCBzdHJlYW07ICAgIC8qKjwgU3RyZWFtLiAqLworICAgIHVpbnQzMl90IHJldmlzaW9uOyAgLyoqPCBSZXZpc2lvbi4gKi8KKyAgICB1aW50MzJfdCBjcmM7ICAgICAgIC8qKjwgQ1JDLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wIHRpbWVzdGFtcDsgICAvKio8IFRpbWVzdGFtcC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZTsKKworLyoqIEZpbGUgSW5mbyBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZSBmaWxlX3R5cGU7ICAgICAgICAgICAgICAgIC8qKjwgRmlsZSBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSBpbmZvOyAgICAvKio8IEluZm8uICovCisgICAgICAgIH0gYm9vdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSBpbmZvOyAgICAvKio8IEluZm8uICovCisgICAgICAgIH0gYXBwX21haW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgaW5mbzsgICAgLyoqPCBJbmZvLiAqLworICAgICAgICB9IGFwcF9iYWNrdXA7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2U7CisKKy8qKiBPQU0gRVBvQyBCaXQgTG9hZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZAoreworICAgIHVpbnQ4X3QgaWR4OyAgICAvKio8IEJhbmQgaW5kZXggKi8KKyAgICB1aW50OF90IHZhbHVlOyAgLyoqPCBMb2FkaW5nIFZhbHVlICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZDsKKworLyoqIE9hbSBFcG9jIEJpdCBMb2FkaW5nLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkIGxvYWRbMzJdOyAvKio8IExvYWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZzsKKworLyoqIE9hbSBFcG9jIFN0YXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdAoreworICAgIHVpbnQxNl90IGlkeDsgICAgICAgICAgIC8qKjwgU3RhdGlzdGljIGluZGV4ICovCisgICAgdWludDMyX3QgdmFsdWVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFsdWUuICovCisgICAgdWludDhfdCAqdmFsdWU7ICAgICAgICAgLyoqPCBTdGF0aXN0aWMgdmFsdWUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQ7CisKKy8qKiBEZWZpbmVzIGEgbGluay9wb3J0IHByaW9yaXR5IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5Cit7CisgICAgdWludDhfdCBsZXZlbDsgICAgICAgICAgLyoqPCBQcmlvcml0eSBsZXZlbCBvZiB0aGlzIHByaW9yaXR5ICovCisgICAgdWludDhfdCB3ZWlnaHQ7ICAgICAgICAgLyoqPCBQZXJjZW50YWdlIHdlaWdodCBvZiB0aGlzIHByaW9yaXR5ICgwIGZvciBTUCkgKi8KKyAgICB1aW50OF90IHF1ZXVlX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBxdWV1ZXMgYXQgdGhpcyBwcmlvcml0eSAqLworICAgIHVpbnQxNl90ICpxdWV1ZV9zaXplczsgIC8qKjwgUXVldWUgc2l6ZXMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eTsKKworLyoqIFRlayBRdWV1ZSBDb25maWcgVjIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSBzdWJ0eXBlOyAgICAgLyoqPCBUeXBlIG9mIGRhdGEgaW4gdGhpcyB2YXJpYWJsZSBjb250YWluZXIgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGUgcmVwb3J0X2NvbmZpZzsgIC8qKjwgUmVwb3J0aW5nIG1vZGUgZm9yIE9OVSAqLworICAgICAgICB9IGhlYWRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eV9jb3VudDsgLyoqPCBOdW1iZXIgb2YgcHJpb3JpdGllcyBmb3IgdGhpcyBsaW5rICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICpwcmlvcml0aWVzOyAgICAvKio8IERlZmluaXRpb24gb2YgcHJpb3JpdGllcyAqLworICAgICAgICB9IGxpbms7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHlfY291bnQ7IC8qKjwgTnVtYmVyIG9mIHByaW9yaXRpZXMgZm9yIHRoaXMgcG9ydCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqcHJpb3JpdGllczsgICAgLyoqPCBEZWZpbml0aW9uIG9mIHByaW9yaXRpZXMgKi8KKyAgICAgICAgfSBwb3J0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlOworCisvKiogVGVrIFNlcXVlbmNlIE51bWJlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyCit7CisgICAgYmNtb3NfYm9vbCBlbmRfb2Zfc2VxdWVuY2U7IC8qKjwgRW5kIG9mIHNlcXVlbmNlLiAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlX251bWJlcjsgICAvKio8IFNlcXVlbmNlIE51bWJlci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXI7CisKKy8qKiBPTlUgQ2xvY2sgVHJhbnNwb3J0IENvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZworeworICAgIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5IGtleTsgICAgLyoqPCBLZXkuICovCisgICAgYmNtb3NfYm9vbCByZV9pbml0OyAgICAgICAgICAgICAvKio8IFJlLSBJbml0LiAqLworICAgIGJjbW9zX2Jvb2wgdG9kX2VuYWJsZTsgICAgICAgICAgLyoqPCBUT0QgRW5hYmxlLiAqLworICAgIGJjbW9zX2Jvb2wgb25lX3Bwc19lbmFibGU7ICAgICAgLyoqPCAxUFBTIEVuYWJsZS4gKi8KKyAgICBpbnQzMl90IG9uZV9wcHNfb2Zmc2V0OyAgICAgICAgIC8qKjwgMVBQUyBPZmZzZXQuICovCisgICAgdWludDMyX3Qgcm91bmRfdHJpcF90aW1lOyAgICAgICAvKio8IFJvdW5kIFRyaXAgVGltZS4gKi8KKyAgICB1aW50MzJfdCBvbmVfcHBzX2hhbGZfcGVyaW9kOyAgIC8qKjwgMVBQUyBIYWxmIFBlcmlvZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnOworCisvKiogT0FNIE1jYXN0IERvbWFpbiBQb3J0IEluZm8uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8KK3sKKyAgICB1aW50OF90IHBvcnQ7ICAgICAgICAgICAvKio8IFBvcnQuICovCisgICAgdWludDhfdCBncm91cF9saW1pdDsgICAgLyoqPCBHcm91cCBMaW1pdC4gKi8KKyAgICB1aW50OF90IGZjX2xpbWl0OyAgICAgICAvKio8IEZvciBsYXRlciB1c2UgKi8KKyAgICB1aW50OF90IGFjdGlvbjsgICAgICAgICAvKio8IEZvciBsYXRlciB1c2UgKi8KKyAgICB1aW50MTZfdCB1cF9lcG9uX3ZpZDsgICAvKio8IFVwIEVQT04gVmlkLiAqLworICAgIHVpbnQxNl90IHVwX3VuaV92aWQ7ICAgIC8qKjwgVXAgVW5pIFZpZC4gKi8KKyAgICB1aW50OF90IHVwX2xpbms7ICAgICAgICAvKio8IE5vdCBwb3J0IHJlbGF0aXZlICovCisgICAgdWludDhfdCBkbnE7ICAgICAgICAgICAgLyoqPCBEblEuICovCisgICAgdWludDhfdCB1cHE7ICAgICAgICAgICAgLyoqPCBVcFEuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbzsKKworLyoqIE9hbSBNY2FzdCBEb21haW4gSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8KK3sKKyAgICB1aW50OF90IGlkOyAgICAgICAgIC8qKjwgSUQuICovCisgICAgdWludDhfdCBkbl9saW5rOyAgICAvKio8IERuIExpbmsuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gb3B0aW9uczsgICAgICAvKio8IE9wdGlvbnMuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyIGZ3ZF9xdWFsOyAvKio8IEZ3ZCBRdWFsLiAqLworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7ICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgdWludDhfdCBhY3Rpb247ICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgdWludDE2X3QgZG5fZXBvbl92aWQ7ICAgLyoqPCBEbiBFUE9OIFZpZC4gKi8KKyAgICB1aW50MTZfdCBkbl91bmlfdmlkOyAgICAvKio8IERuIFVuaSBWaWQuICovCisgICAgdWludDhfdCBudW1fcG9ydDsgICAgICAgLyoqPCBOdW0gUG9ydC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gKnBvcnRfaW5mbzsgIC8qKjwgUG9ydCBJbmZvLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvOworCisvKiogT2FtIE1jYXN0IERvbWFpbiBSZWNvcmQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQKK3sKKyAgICB1aW50OF90IG51bV9kb21haW5zOyAgICAvKio8IE51bSBEb21haW5zLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKmRvbWFpbjsgIC8qKjwgRG9tYWluLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQ7CisKKy8qKiBUZWsgQXR0cmlidXRlIFZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpZHg7ICAgIC8qKjwgSW5kZXguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeSBkZWY7IC8qKjwgRGVmYXVsdC4gKi8KKyAgICAgICAgfSBsdWVfZmllbGRfc2VsZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19mcmFtZXNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX3NpbmdsZV9jb2xsX2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfbXVsdGlwbGVfY29sbF9mcmFtZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2ZyYW1lc19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfZmNzX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfYWxpZ25fZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19vY3RldHNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2xhdGVfY29sbGlzaW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX29jdGV0c19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfbWNhc3RfZnJhbWVzX3R4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19iY2FzdF9mcmFtZXNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX21jYXN0X2ZyYW1lc19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfYmNhc3RfZnJhbWVzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19pbl9yYW5nZV9sZW5fZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19mcmFtZV90b29fbG9uZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBlbmFibGVkOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZWQuICovCisgICAgICAgIH0gc3RkX21hY19lbmFibGVfc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX3BoeV9zeW1ib2xfZXJyX2R1cmluZ19jYXJyaWVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19jdHJsX3BhdXNlX3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19jdHJsX3BhdXNlX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX29hbV9sb2NhbF9lcnJfZnJhbWVfc2Vjc19ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9vYW1fZW11bF9jcmM4ZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfbWFjX2N0cmxfZnJhbWVzX3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfbWFjX2N0cmxfZnJhbWVzX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfdHhfcmVnX2FjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tcGNwX3R4X3JlZ19yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfdHhfcmVwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfcnhfZ2F0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tcGNwX3J4X3JlZ2lzdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB0YWJsZV9zaXplOyAgICAgICAgICAgIC8qKjwgVGFibGUgU2l6ZS4gKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fdGJsX3NpemU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGFnZV9saW1pdDsgICAgICAgICAgICAgLyoqPCBBZ2UgTGltaXQuICovCisgICAgICAgIH0gZHluX2xlYXJuX2FnZV9saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X3VuaWNhc3RfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfdW5pY2FzdF9mcmFtZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZV90b29fc2hvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTY0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWU2NXRvMTI3OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWUxMjh0bzI1NTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lMjU2dG81MTE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTUxMnRvMTAyMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lMTAyNHRvMTUxODsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lMTUxOXBsdXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTY0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWU2NXRvMTI3OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWUxMjh0bzI1NTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lMjU2dG81MTE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTUxMnRvMTAyMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lMTAyNHRvMTUxODsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lMTUxOXBsdXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZGVsYXlfdGhyZXNob2xkOyAgICAgICAgLyoqPCBEZWxheSBUaHJlc2hvbGQuICovCisgICAgICAgIH0gdHhfZGVsYXlfdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBkZWxheTsgICAgICAgICAgICAgICAgIC8qKjwgRGVsYXkuICovCisgICAgICAgIH0gdHhfZGVsYXk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZXNfZHJvcHBlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2J5dGVzX2Ryb3BwZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9ieXRlc19kZWxheWVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfYnl0ZXNfdW51c2VkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRlbGF5X3RocmVzaG9sZDsgICAgICAgIC8qKjwgRGVsYXkgVGhyZXNob2xkLiAqLworICAgICAgICB9IHJ4X2RlbGF5X3RocmVzaG9sZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgZGVsYXk7ICAgICAgICAgICAgICAgICAvKio8IERlbGF5LiAqLworICAgICAgICB9IHJ4X2RlbGF5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWVzX2Ryb3BwZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9ieXRlc19kcm9wcGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfYnl0ZXNfZGVsYXllZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc3RhdGlzdGljX2lkOyAgICAgICAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHJpc2luZ190aHJlc2hvbGQ7ICAgICAgLyoqPCBSaXNpbmcgVGhyZXNob2xkLiAqLworICAgICAgICAgICAgdWludDMyX3QgZmFsbGluZ190aHJlc2hvbGQ7ICAgICAvKio8IEZhbGxpbmcgVGhyZXNob2xkLiAqLworICAgICAgICB9IHBvcnRfc3RhdF90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHN0YXRpc3RpY19pZDsgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgICAgICAgICB1aW50MzJfdCByaXNpbmdfdGhyZXNob2xkOyAgICAgIC8qKjwgUmlzaW5nIFRocmVzaG9sZC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGZhbGxpbmdfdGhyZXNob2xkOyAgICAgLyoqPCBGYWxsaW5nIFRocmVzaG9sZC4gKi8KKyAgICAgICAgfSBsaW5rX3N0YXRfdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB0aW1lOyAgICAgICAgICAgICAgICAgIC8qKjwgVGltZS4gKi8KKyAgICAgICAgfSBlbmNyeXB0X2tleV9leHBpcnlfdGltZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBsZW5fZXJyb3JfZGlzY2FyZDsgICAgICAvKio8IExlbiBFcnJvciBEaXNjYXJkLiAqLworICAgICAgICB9IGxlbl9lcnJvcl9kaXNjYXJkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB0aHJlc2hvbGRzX2NvdW50OyAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRocmVzaG9sZHMuICovCisgICAgICAgICAgICB1aW50MTZfdCAqdGhyZXNob2xkczsgICAgICAgICAgIC8qKjwgVGhyZXNob2xkcy4gKi8KKyAgICAgICAgfSByZXBvcnRfdGhyZXNob2xkczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgdmxhbl9ldGhlcl90eXBlOyAgICAgICAvKio8IFZsYW4gRXRoZXJUeXBlLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCB1c2VfZm9yX3Vwc3RyZWFtOyAgICAvKio8IFVzZSBGb3IgVXBzdHJlYW0uICovCisgICAgICAgICAgICBiY21vc19ib29sIHVzZV9mb3JfZG93bnN0cmVhbTsgIC8qKjwgVXNlIEZvciBEb3duc3RyZWFtLiAqLworICAgICAgICB9IHZsYW5fZXRoZXJ0eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjdXJyZW50X2NhcHM7ICAgICAgICAgIC8qKjwgQ3VycmVudCBDYXBzLiAqLworICAgICAgICAgICAgdWludDE2X3QgcGh5c2ljYWxfY2FwczsgICAgICAgICAvKio8IFBoeXNpY2FsIENhcHMuICovCisgICAgICAgIH0gcG9ydF9jYXBhYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBydWxlc19jb3VudDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAvKio8IFJ1bGVzLiAqLworICAgICAgICB9IG5ld19kbl9maWx0ZXJfdGJsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBydWxlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAvKio8IFJ1bGVzLiAqLworICAgICAgICB9IG5ld191cF9maWx0ZXJfdGJsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBkZXN0aW5hdGlvbl9iaXRtYXA7ICAgICAgICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gQml0bWFwLiAqLworICAgICAgICB9IGFycF9yZXBsaWNhdGVfZGVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZGVzdGluYXRpb25fYml0bWFwOyAgICAgICAgICAgICAgICAvKio8IERlc3RpbmF0aW9uIEJpdG1hcC4gKi8KKyAgICAgICAgfSBsYWNwX2Rlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYWN0aW9uX2Zvcl91bm1hbl9ncnA7ICAgICAgICAgICAgICAgLyoqPCBBY3Rpb24gRm9yIFVubWFuIEdycC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWbGFucyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiAqdmxhbnM7ICAgLyoqPCBWbGFucy4gKi8KKyAgICAgICAgfSBvbnVfaWdtcF92bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxlYXJuaW5nX21vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhcm5pbmcgTW9kZS4gKi8KKyAgICAgICAgfSBkeW5fbGVhcm5pbmdfbW9kZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBMaW1pdC4gKi8KKyAgICAgICAgfSBtaW5fbWFjX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxpbWl0OyAgICAgICAgICAgICAgICAgICAgICAvKio8IExpbWl0LiAqLworICAgICAgICB9IG9udV9hZ2dyZWdhdGVfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfY291bnQ7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRhdGEuICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEuICovCisgICAgICAgIH0gbnZzX3NjcmF0Y2hwYWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZmxvb2RfdW5rbm93bl9vcHQ7ICAgICAgICAgIC8qKjwgRmxvb2QgVW5rbm93biBPcHQuICovCisgICAgICAgIH0gZmxvb2RfdW5rbm93bjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBsb2NhbF9zd2l0Y2hfb3B0OyAgICAgICAgICAgLyoqPCBMb2NhbCBTd2l0Y2ggT3B0LiAqLworICAgICAgICB9IGxvY2FsX3N3aXRjaGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBkb3duX2J1cnN0X3RvbGxfb3B0OyAgICAgICAgLyoqPCBEb3duIEJ1cnN0IFRvbGwgT3B0LiAqLworICAgICAgICB9IGRvd25fYnVyc3RfdG9sbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2ZlYzsgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIEZFQy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fZmVjOyAgICAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gRkVDLiAqLworICAgICAgICB9IGZlY19tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0ZW1wZXJhdHVyZTsgICAgICAgICAgICAgICAvKio8IFRlbXBlcmF0dXJlLiAqLworICAgICAgICB9IHBvd2VyX21vbl90ZW1wZXJhdHVyZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmNjOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWQ0MuICovCisgICAgICAgIH0gcG93ZXJfbW9uX3ZjYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgYmlhczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCaWFzLiAqLworICAgICAgICB9IHBvd2VyX21vbl90eF9iaWFzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBwb3dlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFBvd2VyLiAqLworICAgICAgICB9IHBvd2VyX21vbl90eF9wb3dlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcG93ZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb3dlci4gKi8KKyAgICAgICAgfSBwb3dlcl9tb25fcnhfcG93ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbmV0d29ya19lcG9uX3BvcnRzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIE5ldHdvcmsgRVBPTiBQb3J0cyAqLworICAgICAgICAgICAgdWludDhfdCAqbmV0d29ya19lcG9uX3BvcnRzOyAgICAgICAgLyoqPCBOZXR3b3JrIEVQT04gUG9ydHMuICovCisgICAgICAgIH0gbmV0d29ya19wb25fbWFwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGUgc3RhdGU7ICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IHBzc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZmllbGRfc2VsZWN0OyAgICAgICAgICAgICAgIC8qKjwgVGhlIGZpZWxkIHNlbGVjdCB0byB1c2UgZm9yIFNMRSAoMCBtZWFucyBkaXNhYmxlKSAqLworICAgICAgICB9IHNsZV9tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgbGVhcm5fdGFibGVfbW9kZTsgIC8qKjwgTGVhcm4gVGFibGUgTW9kZS4gKi8KKyAgICAgICAgfSBsZWFybl90YWJsZV9tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHNpZ25hbF9kZXRlY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHNpZ25hbCBpcyBkZXRlY3RlZCAqLworICAgICAgICB9IHRyYW5zY2VpdmVyX3NpZ25hbF9kZXRlY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVzZXIgUG9ydCBUbyBOZXR3b3JrIFBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2hpY2ggbmV0d29yayBwb3J0IGVhY2ggdXNlciBwb3J0IGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gKDB4RkYgZm9yIG5vdCBjb25uZWN0ZWQpICovCisgICAgICAgIH0gY3Jvc3NiYXJfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGJ1cnN0X2FjdGl2aXR5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGFueSBidXJzdCBhY3Rpdml0eSAoTG9TKSAqLworICAgICAgICB9IHRyYW5zY2VpdmVyX2J1cnN0X2FjdGl2aXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG5ldHdvcmtfcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdoaWNoIG5ldHdvcmsgcG9ydCB0aGUgSVBOIHNob3VsZCB1c2UgZm9yIG1hbmFnZW1lbnQgKi8KKyAgICAgICAgfSBjb250cm9sX3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlIG1hdGNoX21vZGU7IC8qKjwgTWF0Y2ggTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFncyBmbGFnczsgICAgICAgICAgIC8qKjwgRmxhZ3MuICovCisgICAgICAgICAgICB1aW50OF90IGRlZmF1bHRfbGlua19pbmRleDsgICAgIC8qKjwgRGVmYXVsdCBMaW5rIEluZGV4LiAqLworICAgICAgICAgICAgdWludDhfdCBkZWZhdWx0X3F1ZXVlX2luZGV4OyAgICAvKio8IERlZmF1bHQgUXVldWUgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IG1hcHBpbmdzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIE1hcHBpbmdzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZyAqbWFwcGluZ3M7IC8qKjwgTWFwcGluZ3MuICovCisgICAgICAgIH0gdmxhbl9kZXN0aW5hdGlvbnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlIG1vZGU7ICAgICAgICAgICAgICAgLyoqPCBNb2RlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnMgb3B0aW9uczsgICAgICAgICAvKio8IE9wdGlvbnMuICovCisgICAgICAgIH0gZW5jcnlwdGlvbl9tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW07ICAgIC8qKjwgU3RyZWFtLiAqLworICAgICAgICAgICAgdWludDMyX3QgcmV2aXNpb247ICAvKio8IFJldmlzaW9uLiAqLworICAgICAgICB9IGludGVybmFsX3ZlcnNpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wIHRpbWVzdGFtcDsgICAvKio8IFRpbWVzdGFtcC4gKi8KKyAgICAgICAgfSBmaXJtd2FyZV90aW1lc3RhbXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgcnVsZTsgICAgICAvKio8IFJ1bGUuICovCisgICAgICAgIH0gb251X3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgICAgICAgICAvKio8IERpcmVjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9saWNlcl9pZDsgICAgICAgICAgICAgICAgICAgICAvKio8IFBvbGljZXIgSWQuICovCisgICAgICAgICAgICB1aW50MzJfdCBidXJzdF9zaXplOyAgICAgICAgICAgICAgICAgICAgLyoqPCBCdXJzdCBTaXplLiAqLworICAgICAgICAgICAgdWludDMyX3QgdHJhZmZpY19yYXRlOyAgICAgICAgICAgICAgICAgIC8qKjwgVHJhZmZpYyBSYXRlLiAqLworICAgICAgICB9IHBvbGljZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3NoYXBlcnM7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBTaGFwZXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIgKnVuaV9zaGFwZXI7IC8qKjwgVW5pIFNoYXBlci4gKi8KKyAgICAgICAgfSB1bmlfc2hhcGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCB2ZXJzaW9uOyAgICAvKio8IE1hdHVyaXR5IG9mIGZyaW13YXJlICovCisgICAgICAgIH0gZXh0X2Zpcm13YXJlX3ZlcnNpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgICAgIC8qKjwgRGlyZWN0aW9uIG9mIGtleSAqLworICAgICAgICAgICAgdWludDhfdCBrZXlfaW5kZXg7ICAvKio8IEluZGV4IG9mIGtleSAqLworICAgICAgICAgICAgdWludDhfdCBrZXlfbGVuZ3RoOyAvKio8IEJ5dGUgY291bnQgb2Yga2V5IGRhdGEgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmtleV9kYXRhOyAgLyoqPCBLZXkgZGF0YSAqLworICAgICAgICB9IGVuY3J5cHRpb25fa2V5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgZmlsZV9pbmZvOyAgIC8qKjwgRmlsZSBJbmZvLiAqLworICAgICAgICB9IGZpbGVfaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzeXN0ZW1fcnVsZV9vcHRpb25zOyAgICAgICAgICAgICAgICAvKio8IE9wdGlvbnMgZm9yIHN5c3RlbSBydWxlcyAqLworICAgICAgICB9IHN5c3RlbV9ydWxlX29wdGlvbnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG10dTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTVRVLiAqLworICAgICAgICB9IG10dTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBudnNfc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHlfY291bnQ7ICAgICAgICAgICAgIC8qKjwgUHJpb3JpdHkgQ291bnQuICovCisgICAgICAgICAgICB1aW50OF90ICpwcmlvcml0eV9tYXA7ICAgICAgICAgICAgICAvKio8IFByaW9yaXR5IE1hcC4gKi8KKyAgICAgICAgfSBxdWV1ZXByaW1hcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2NfZG93bl9iaXRfbG9hZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2NfdXBfYml0X2xvYWRpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBlcG9jX3NkbV9waGFzZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2Nfc2RtX2FtcGxpdHVkZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2Nfc2RtX3F1YW50aXplcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2NfdW51c2VkMDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2NfdW51c2VkMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2NfdW51c2VkMjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2NfdW51c2VkMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2NfdW51c2VkNDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlIHF1ZXVlX2NvbmZpZzsgICAvKio8IFF1ZXVlIENvbmZpZy4gKi8KKyAgICAgICAgfSBxdWV1ZV9jb25maWdfdjI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgZmVhdHVyZV9zZXQ7ICAgICAgICAgICAgLyoqPCBGZWF0dXJlIFNldC4gKi8KKyAgICAgICAgfSBmZWF0dXJlX3NldDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9waHlfdHlwZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIgdmFsdWU7ICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHNlcXVlbmNlX251bWJlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcHVsc2VfdGltZTsgICAgLyoqPCBNUENQIHRpbWUgdG8gcHVsc2UuICovCisgICAgICAgIH0gbXBjcF9jbG9jazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9jbG9ja19jb21wZW5zYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJvYnVzdG5lc3NfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJvYnVzdG5lc3MgQ291bnQuICovCisgICAgICAgICAgICB1aW50OF90IGxtcV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExNUSBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZmFzdF9sZWF2ZV9lbmFibGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgRmFzdCBMZWF2ZSBFbmFibGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSBtb2RlOyAgICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucyBvcHRpb25zOyAgICAvKio8IE9wdGlvbnMuICovCisgICAgICAgIH0gbWNhc3RfZ2xvYmFsX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkIHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtY2FzdF9kb21haW5fY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHRpbWU7ICAgLyoqPCBUaGUgYW1vdW50IG9mIHRpbWUgdGhlIE9OVSBzaG91bGQgd2FpdCBhZnRlciBsb3NzIG9mIHNpZ25hbCBvciBsb3NzIG9mIGdhdGUgdG8gcmVzZXQgdGhlIGxpbmtzIGluIDEwIG1zIGluY3JlbWVudHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzIGZsYWdzOyAgIC8qKjwgT05VIGhvbGRvdmVyIGNvbmZpZ3VyYXRpb24gZmxhZ3MuICovCisgICAgICAgIH0gb251X2hvbGRvdmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgYWxhcm1fY29kZTsgIC8qKjwgQWxhcm0gQ29kZS4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHJhaXNlX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgLyoqPCBSYWlzZSBUaHJlc2hvbGQuICovCisgICAgICAgICAgICB1aW50MzJfdCBjbGVhcl90aHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgQ2xlYXIgVGhyZXNob2xkLiAqLworICAgICAgICB9IGFsYXJtX3RocmVzaG9sZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBjb3VudF9vZl9mYWlsc2FmZV9tZWNoOyAgICAgICAgICAgICAvKio8IENvdW50IE9mIEZhaWxzYWZlIE1lY2guICovCisgICAgICAgICAgICBiY21vc19ib29sIGZhaWxzYWZlX3N0YXRlOyAgICAgICAgICAgICAgICAgIC8qKjwgRmFpbHNhZmUgU3RhdGUuICovCisgICAgICAgIH0gZmFpbHNhZmU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHN0YXRpc3RpY19pZDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbDsgICAgICAvKio8IEludGVydmFsLiAqLworICAgICAgICB9IHBvcnRfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBzdGF0aXN0aWNfaWQ7ICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsOyAgICAgIC8qKjwgSW50ZXJ2YWwuICovCisgICAgICAgIH0gbGlua19zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyBzdGF0dXM7ICAgICAgICAgICAvKio8IFN0YXR1cy4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2R1cGxleF9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IHN0ZF9hdXRvX25lZ19hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgc3RhdHVzOyAgICAgICAgIC8qKjwgU3RhdHVzLiAqLworICAgICAgICB9IHN0ZF9tYXVfbWVkaWFfYXZhaWw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZSBtb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgIH0gbWRpX2Nyb3Nzb3ZlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgYWRkcmVzczsgIC8qKjwgQWRkcmVzcy4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2FkZHI7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZTsKKworLyoqIFRlayBPTlUgUXVldWUgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnCit7CisgICAgdWludDhfdCBxdWV1ZV9zaXplc19jb3VudDsgIC8qKjwgUXVldWUgU2l6ZXMgQ291bnQuICovCisgICAgdWludDhfdCAqcXVldWVfc2l6ZXM7ICAgICAgIC8qKjwgUXVldWUgU2l6ZXMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZzsKKworLyoqIFRlayBJR01QIFNub29waW5nIFBvcnQgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnCit7CisgICAgdWludDhfdCBudW1iZXJfb2ZfaWdtcF9ncm91cHM7ICAgICAgICAgICAgICAvKio8IE51bWJlciBPZiBJR01QIEdyb3Vwcy4gKi8KKyAgICB1aW50OF90IHJlbGF0aXZlX3F1ZXVlX2Zvcl9jbGFzc2lmaWNhdGlvbjsgIC8qKjwgUmVsYXRpdmUgUXVldWUgRm9yIENsYXNzaWZpY2F0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWc7CisKKy8qKiBUZWsgT05VIElHTVAgR3JvdXAgTm8gVklELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQKK3sKKyAgICBiY21vc19pcHY0X2FkZHJlc3MgZ3JvdXA7ICAgLyoqPCBHcm91cC4gKi8KKyAgICB1aW50OF90IHBvcnRzOyAgICAgICAgICAgICAgLyoqPCBQb3J0cy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQ7CisKKy8qKiBUZWsgQWN0aW9uIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiBsZWFmOyAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBtYWM7ICAvKio8IE1BQy4gKi8KKyAgICAgICAgfSBhZGRfc3RhdGljX2VudHJ5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBtYWM7ICAvKio8IE1BQy4gKi8KKyAgICAgICAgfSBkZWxfc3RhdGljX2VudHJ5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBydWxlc19jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBydWxlcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnJ1bGVzOyAgICAgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gYWRkX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgcnVsZXM7ICAgICAgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gbmV3X2FkZF9ydWxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBydWxlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBydWxlcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnJ1bGVzOyAgICAgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gbmV3X2RlbF9ydWxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBydWxlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBydWxlcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnJ1bGVzOyAgICAgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gZGVsZXRlX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGdwaW9fY29uZmlnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR1BJTyBDb25maWcuICovCisgICAgICAgIH0gc2V0X2dwaW9fY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxpbmtzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExpbmtzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICpsaW5rczsgICAgLyoqPCBMaW5rcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7ICAgIC8qKjwgUG9ydHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnBvcnRzOyAgICAvKio8IFBvcnRzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnIG11bHRpY2FzdDsgLyoqPCBNdWx0aWNhc3QuICovCisgICAgICAgIH0gc2V0X3F1ZXVlX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByb2J1c3RuZXNzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSb2J1c3RuZXNzIENvdW50LiAqLworICAgICAgICAgICAgdWludDhfdCBsYXN0X21lbWJlcl9xdWVyeV9jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBMYXN0IE1lbWJlciBRdWVyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7ICAgIC8qKjwgUG9ydHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgKnBvcnRzOyAgICAgICAvKio8IFBvcnRzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgZ3JwX2ZvcndhcmQ7ICAgLyoqPCBHcnAgRm9yd2FyZC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zIG9wdGlvbnM7ICAgICAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBzZXRfaWdtcF9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBzX2NvdW50OyAgIC8qKjwgR3JvdXBzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKmdyb3VwczsgIC8qKjwgR3JvdXBzLiAqLworICAgICAgICB9IGFkZF9pZ21wX2dyb3VwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG1heF9vYW1fcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IE9BTSBSYXRlLiAqLworICAgICAgICAgICAgdWludDhfdCBtaW5fb2FtX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1pbiBPQU0gUmF0ZS4gKi8KKyAgICAgICAgfSBzZXRfb2FtX3JhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG9mZl90aW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPZmYgVGltZS4gKi8KKyAgICAgICAgfSBiY19sYXNlcl9wb3dlcl9vZmY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgb3B0aW9uczsgICAgICAvKio8IE9wdGlvbnMuICovCisgICAgICAgIH0gc2xlZXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgICAgICAgICB1aW50OF90IHBvbGljZXJfaWQ7ICAgICAvKio8IFBvbGljZXIgSWQuICovCisgICAgICAgICAgICB1aW50MzJfdCBidXJzdF9zaXplOyAgICAvKio8IEJ1cnN0IFNpemUuICovCisgICAgICAgICAgICB1aW50MzJfdCB0cmFmZmljX3JhdGU7ICAvKio8IFRyYWZmaWMgUmF0ZS4gKi8KKyAgICAgICAgfSBlbmFibGVfcG9saWNlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIGRpcmVjdGlvbjsgICAvKio8IERpcmVjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9saWNlcl9pZDsgLyoqPCBQb2xpY2VyIElkLiAqLworICAgICAgICB9IGRpc2FibGVfcG9saWNlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgbW9kZTsgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggc3RhdF9pbmRleDsgICAvKio8IFN0YXQgSW5kZXguICovCisgICAgICAgIH0gZ2V0X2Vwb2Nfc2RtX3N0YXRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcyBtb2RlOyAgICAgICAgLyoqPCBNb2RlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXggc3RhdF9pbmRleDsgICAgIC8qKjwgU3RhdCBJbmRleC4gKi8KKyAgICAgICAgfSBnZXRfZXBvY19jbWNfc3RhdHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzIG1vZGU7ICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCBzdGF0X2luZGV4OyAgICAgLyoqPCBTdGF0IEluZGV4LiAqLworICAgICAgICB9IGdldF9lcG9jX2NudV9zdGF0czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwb3J0X2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFVOSSBwb3J0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnF1ZXVlX3Blcl9wb3J0OyAgICAvKio8IFdoaWNoIGxvZ2ljYWwgcXVldWUgbnVtYmVyIHRvIHVzZSwgaW5kZXhlZCBieSBVTkkgcG9ydC4gKi8KKyAgICAgICAgfSBzZXRfZG5fYmNhc3RfcXVldWU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlOworCisvKiogVGVrIFZhciBDb250YWluZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7ICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgb2JqZWN0X2NvbnRleHQ7ICAvKio8IE9iamVjdCBDb250ZXh0LiAqLworICAgICAgICB9IG5hbWVfYmluZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgYXR0cmlidXRlOyAgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSBhY3Rpb247ICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICB9IGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcjsKKworLyoqIFRlayBTZXQgUmVzcCBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxpbmtzX2NvdW50OyAgICAvKio8IExpbmtzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICpsaW5rczsgICAgLyoqPCBMaW5rcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7ICAgIC8qKjwgUG9ydHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnBvcnRzOyAgICAvKio8IFBvcnRzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnIG11bHRpY2FzdDsgLyoqPCBNdWx0aWNhc3QuICovCisgICAgICAgIH0gZ2V0X3F1ZXVlX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByb2J1c3RuZXNzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSb2J1c3RuZXNzIENvdW50LiAqLworICAgICAgICAgICAgdWludDhfdCBsYXN0X21lbWJlcl9xdWVyeV9jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBMYXN0IE1lbWJlciBRdWVyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7ICAgIC8qKjwgUG9ydHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgKnBvcnRzOyAgICAgICAvKio8IFBvcnRzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgZ3JwX2ZvcndhcmQ7ICAgLyoqPCBHcnAgRm9yd2FyZC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zIG9wdGlvbnM7ICAgICAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBnZXRfaWdtcF9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBzX2NvdW50OyAgIC8qKjwgR3JvdXBzIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKmdyb3VwczsgIC8qKjwgR3JvdXBzLiAqLworICAgICAgICB9IGdldF9pZ21wX2dyb3VwX2luZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X29hbV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1heCBPQU0gUmF0ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWluX29hbV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1pbiBPQU0gUmF0ZS4gKi8KKyAgICAgICAgfSBnZXRfb2FtX3JhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJvb3RfdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJvb3QgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJvb3RfY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJvb3QgQ1JDLiAqLworICAgICAgICAgICAgdWludDE2X3QgcGVyc29uYWxpdHlfdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUGVyc29uYWxpdHkgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHBlcnNvbmFsaXR5X2NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBlcnNvbmFsaXR5IENSQy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGFwcDB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFQUDAgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGFwcDBjcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFQUDAgQ1JDLiAqLworICAgICAgICAgICAgdWludDE2X3QgYXBwMXZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQVBQMSBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDMyX3QgYXBwMWNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQVBQMSBDUkMuICovCisgICAgICAgICAgICB1aW50MTZfdCBkaWFnbm9zdGljX3ZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEaWFnbm9zdGljIFZlcnNpb24uICovCisgICAgICAgICAgICB1aW50MzJfdCBkaWFnbm9zdGljX2NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEaWFnbm9zdGljIENSQy4gKi8KKyAgICAgICAgfSBnZXRfbG9hZF9pbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4IHN0YXRfaW5kZXg7ICAgLyoqPCBTdGF0IEluZGV4LiAqLworICAgICAgICAgICAgdWludDhfdCBjb3VudGVyX3ZhbHVlX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIENvdW50ZXIgVmFsdWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmNvdW50ZXJfdmFsdWU7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICAgICAgdWludDhfdCByYXRlX3ZhbHVlX2NvdW50OyAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSYXRlIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90ICpyYXRlX3ZhbHVlOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV9pbnRlcnZhbF9jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUmF0ZSBJbnRlcnZhbCAqLworICAgICAgICAgICAgdWludDhfdCAqcmF0ZV9pbnRlcnZhbDsgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgIH0gZ2V0X2Vwb2Nfc2RtX3N0YXRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCBzdGF0X2luZGV4OyAvKio8IFN0YXQgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBDb3VudGVyIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90ICpjb3VudGVyX3ZhbHVlOyAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV92YWx1ZV9jb3VudDsgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUmF0ZSBWYWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqcmF0ZV92YWx1ZTsgICAgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgICAgICB1aW50OF90IHJhdGVfaW50ZXJ2YWxfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFJhdGUgSW50ZXJ2YWwgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnJhdGVfaW50ZXJ2YWw7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICB9IGdldF9lcG9jX2NtY19zdGF0czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggc3RhdF9pbmRleDsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gQ291bnRlciBWYWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCBjb3VudGVyX3ZhbHVlX2NvdW50OyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gQ291bnRlciBWYWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqY291bnRlcl92YWx1ZTsgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgICAgICB1aW50OF90IHJhdGVfdmFsdWVfY291bnQ7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFJhdGUgVmFsdWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnJhdGVfdmFsdWU7ICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICAgICAgdWludDhfdCByYXRlX2ludGVydmFsX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSYXRlIEludGVydmFsICovCisgICAgICAgICAgICB1aW50OF90ICpyYXRlX2ludGVydmFsOyAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgfSBnZXRfZXBvY19jbnVfc3RhdHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydF9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgVU5JIHBvcnRzLiAqLworICAgICAgICAgICAgdWludDhfdCAqcXVldWVfcGVyX3BvcnQ7ICAgICAgICAvKio8IFdoaWNoIGxvZ2ljYWwgcXVldWUgbnVtYmVyIHRvIHVzZSwgaW5kZXhlZCBieSBVTkkgcG9ydC4gKi8KKyAgICAgICAgfSBnZXRfZG5fYmNhc3RfcXVldWU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlOworCisvKiogVGVrIFNldCBSZXNwIFZhciBDb250YWluZXIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggYnJhbmNoOyAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0IG9iamVjdF9jb250ZXh0OyAgICAgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSBhdHRyaWJ1dGU7ICAgICAgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZSBhY3Rpb247ICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZTsKKworLyoqIFRlayBWZW5kb3IgRXh0ZW5kZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZAoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIG9wOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE9wLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZmlybXdhcmVfdmVyc2lvbjsgICAgICAgICAgICAgICAgICAvKio8IEZpcm13YXJlIFZlcnNpb24uICovCisgICAgICAgICAgICB1aW50OF90IG91aVszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT1VJLiAqLworICAgICAgICAgICAgdWludDE2X3QgcHJvZHVjdF9pZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFByb2R1Y3QgSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZXh0ZW5kZWRfaWRbNjRdOyAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHRlbmRlZCBJRC4gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGJhc2VfbWFjOyAgICAgICAgICAgICAgICAgLyoqPCBCYXNlIE1BQy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X2xpbmtzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggTGlua3MuICovCisgICAgICAgICAgICB1aW50OF90IG51bV9wb3J0czsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtIFBvcnRzLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fYXNzaWduYWJsZV91cHN0cmVhbV9xdWV1ZXM7ICAgICAvKio8IE51bSBBc3NpZ25hYmxlIFVwc3RyZWFtIFF1ZXVlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3F1ZXVlc19wZXJfbGlua191cHN0cmVhbTsgICAgICAgLyoqPCBNYXggUXVldWVzIFBlciBMaW5rIFVwc3RyZWFtLiAqLworICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9pbmNyZW1lbnRfdXBzdHJlYW07ICAgICAgICAgICAvKio8IFF1ZXVlIEluY3JlbWVudCBVcHN0cmVhbS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2Fzc2lnbmFibGVfZG93bnN0cmVhbV9xdWV1ZXM7ICAgLyoqPCBOdW0gQXNzaWduYWJsZSBEb3duc3RyZWFtIFF1ZXVlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3F1ZXVlc19wZXJfbGlua19kb3duc3RyZWFtOyAgICAgLyoqPCBNYXggUXVldWVzIFBlciBMaW5rIERvd25zdHJlYW0uICovCisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX2luY3JlbWVudF9kb3duc3RyZWFtOyAgICAgICAgIC8qKjwgUXVldWUgSW5jcmVtZW50IERvd25zdHJlYW0uICovCisgICAgICAgICAgICB1aW50MTZfdCB1cHN0cmVhbV9idWZmZXJfYXZhaWxhYmxlOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gQnVmZmVyIEF2YWlsYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRvd25zdHJlYW1fYnVmZmVyX2F2YWlsYWJsZTsgICAgICAgLyoqPCBEb3duc3RyZWFtIEJ1ZmZlciBBdmFpbGFibGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBqZWRlY19tYW51ZmFjdHVyZXJfaWQ7ICAgICAgICAgICAgIC8qKjwgSkVERUMgTWFudWZhY3R1cmVyIElELiAqLworICAgICAgICAgICAgdWludDE2X3QgY2hpcF9pZDsgICAgICAgLyoqPCBDaGlwIElELiAqLworICAgICAgICAgICAgdWludDMyX3QgY2hpcF92ZXJzaW9uOyAgLyoqPCBDaGlwIFZlcnNpb24uICovCisgICAgICAgIH0gaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKnZhcnM7ICAgICAgICAgICAgICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IGdldF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnZhcnM7ICAgICAgICAgICAgICAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBnZXRfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdmFyczsgICAgICAgICAgICAgICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IHNldF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBzZXRfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgICAgLyoqPCBGbGFncy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG11bHRpY2FzdF9sbGlkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IExMSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCB1bmljYXN0X2xsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVuaWNhc3QgTExJRC4gKi8KKyAgICAgICAgfSBtdWx0aWNhc3RfcmVnaXN0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyBmbGFnczsgIC8qKjwgRmxhZ3MuICovCisgICAgICAgICAgICB1aW50MTZfdCBtdWx0aWNhc3RfbGxpZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBMTElELiAqLworICAgICAgICAgICAgdWludDE2X3QgdW5pY2FzdF9sbGlkOyAgLyoqPCBVbmljYXN0IExMSUQuICovCisgICAgICAgIH0gbXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGtleV9udW1iZXI7ICAgICAvKio8IEtleSBOdW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7ICAgICAvKio8IEtleSBMZW5ndGguICovCisgICAgICAgICAgICB1aW50OF90ICprZXlfZGF0YTsgICAgICAvKio8IEtleSBEYXRhLiAqLworICAgICAgICB9IGtleV9leGNoYW5nZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmxvY2s7ICAgICAgICAgLyoqPCBCbG9jay4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvciBlcnJvcjsgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gZmlsZV9hY2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrOyAgICAgLyoqPCBCbG9jay4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgLyoqPCBMZW5ndGguICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBmaWxlX2RhdGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlIGZpbGVfdHlwZTsgICAgICAgICAgICAgICAgLyoqPCBGaWxlIFR5cGUuICovCisgICAgICAgIH0gZmlsZV9yZWFkX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlIGZpbGVfdHlwZTsgICAgICAgICAgICAgICAgLyoqPCBGaWxlIFR5cGUuICovCisgICAgICAgIH0gZmlsZV93cml0ZV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJpYWJsZV9jb250YWluZXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcmlhYmxlX2NvbnRhaW5lcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnZhcmlhYmxlX2NvbnRhaW5lcnM7IC8qKjwgVmFyaWFibGUgQ29udGFpbmVycy4gKi8KKyAgICAgICAgfSB1bmFja2VkX2FjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkOworCisvKiogUE1DIEZpbGUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIGZpbGVfb3A7ICAgICAgICAgICAgICAgIC8qKjwgRmlsZSBPcC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZpbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlLiAqLworICAgICAgICAgICAgdWludDMyX3Qgbm90X2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBGaWxlLiAqLworICAgICAgICAgICAgdWludDE2X3QgY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENyYy4gKi8KKyAgICAgICAgfSBoZWFkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgICAgICAgICAgdWludDE2X3QgYmxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJsb2NrLiAqLworICAgICAgICAgICAgdWludDMyX3QgZGF0YV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBkYXRhLiAqLworICAgICAgICAgICAgdWludDhfdCAqZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEuICovCisgICAgICAgIH0gZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgaWR4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4LiAqLworICAgICAgICB9IGlkeDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIGZyYW1lX3R5cGVfYWNrOyAvKio8IEZyYW1lIFR5cGUgQWNrLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlIGVycm9yX2NvZGU7ICAvKio8IEVycm9yIENvZGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBibG9ja19yeDsgIC8qKjwgQmxvY2sgUnguICovCisgICAgICAgIH0gYWNrOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2U7CisKKy8qKiBQTUMgVmVuZG9yIEV4dGVuZGVkIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlIG9wOyAvKio8IE9wLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UgZmlsZV9pbmZvOyAgICAvKio8IEZpbGUgSW5mby4gKi8KKyAgICAgICAgfSBmaXJtd2FyZV91cGRhdGU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlOworCisvKiogVmVuZG9yIEV4dGVuZGVkIE9BTSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBvdWk7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPVUkuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjdGM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkIHZhbHVlOyAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdGVrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHBtYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZHBvZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0ga3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSBjb25maWc7ICAgICAgICAgICAvKio8IENvbmZpZy4gKi8KKyAgICAgICAgfSBkYXNhbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbiBudW1iZXIgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNlcXVlbmNlX251bWJlcjsgICAgICAgICAgICAgICAvKio8IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgZnJhbWUgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBPQU0gbWVzc2FnZSAqLworICAgICAgICAgICAgdWludDE2X3QgbnVtX3RvdGFsX2V4cGVjdGVkX3BhY2tldHM7ICAgIC8qKjwgVGhlIG51bWJlciBvZiBwYWNrZXRzIHJlcXVpcmVkIGZvciB0aGUgT0FNIG1lc3NhZ2UgdG8gYmUgY29tcGxldGUgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSBwZHU7ICAvKio8IFRoZSBCUkNNIE9BTSBQRFUgZGF0YSAqLworICAgICAgICB9IGJyY207CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHNpZXBvbl9hOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZTsKKworLyoqIFJvb3Qgc3RydWN0dXJlIGZvciBPQU0gbWVzc2FnZXMgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB0bHZzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGx2cy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlICp0bHZzOyAgICAgICAgICAgICAgICAvKio8IFRMVnMuICovCisgICAgICAgIH0gaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc2VxdWVuY2VfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2VxdWVuY2UgTnVtYmVyLiAqLworICAgICAgICAgICAgdWludDMyX3QgdGx2c19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRsdnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqdGx2czsgICAgICAgICAgLyoqPCBUTFZzLiAqLworICAgICAgICB9IGV2ZW50X25vdGlmaWNhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSAqdmFyczsgICAgICAgICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IHZhcl9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnZhcnM7ICAgICAgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gdmFyX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgY29tbWFuZDsgICAgLyoqPCBDb21tYW5kLiAqLworICAgICAgICB9IGxvb3BiYWNrX2NvbnRyb2w7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9yZ2FuaXphdGlvbl9zcGVjaWZpYzsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQ7CisKKy8qKiBNYXN0ZXIgRW5kIFBvaW50LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlIHR5cGU7IC8qKjwgVHlwZS4gKi8KKyAgICB1aW50OF90IGlkOyAvKio8IElELiAqLworfSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludDsKKworLyoqIE9OVSBNYXN0ZXIgT0FNIENvbnRlbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudAoreworICAgIHVpbnQxNl90IGxpbms7ICAvKio8IExpbmsuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCBvYW1fY29udGVudDsgICAgLyoqPCBPQU0gQ29udGVudC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQ7CisKKy8qKiBPQU0gUmVnIEluZm8gVmVuZG9yIE9VSS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aQoreworICAgIHVpbnQyNF90IG91aTsgICAvKio8IFZlbmRvciBPVUkgdG8gcmVnaXN0ZXIgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgdmVuZG9yIE9VSSAoTVVTVCBiZSBSZWdpc3RlciBvciBVbnJlZ2lzdGVyKS4gKi8KKyAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpOworCisvKiogT0FNIFJlZyBJbmZvIFZlbmRvci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgdmVuZG9yIHNwZWNpZmljIEluZm8gVExWcy4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdmVuZG9yX291aV9yZWdfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHZlbmRvciBPVUkgcmVnaXN0cmF0aW9ucyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpICp2ZW5kb3Jfb3VpX3JlZzsgICAgLyoqPCBWZW5kb3IgT1VJIHJlZ2lzdHJhdGlvbnMgKi8KKyAgICAgICAgfSBjb250OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3I7CisKKy8qKiBPQU0gUmVnIEluZm8gVExWLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGUgdHlwZTsgICAgICAgICAgICAgICAgIC8qKjwgSW5mbyBUTFYgdHlwZSB0byByZWdpc3RlciAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIEluZm8gVExWIHR5cGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yIHZhbHVlOyAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdmVuZG9yOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHY7CisKKy8qKiBPQU0gUmVnIEluZm8gQ29udC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udAoreworICAgIHVpbnQ4X3QgaW5mb19yZWdfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgSW5mbyBUTFYgdHlwZSByZWdpc3RyYXRpb25zIChtYXhpbXVtIG9uZSByZWdpc3RyYXRpb24gcGVyIHR5cGUpLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICppbmZvX3JlZzsgLyoqPCBJbmZvIFRMViB0eXBlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250OworCisvKiogT0FNIFJlZyBJbmZvLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbworeworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgaW5mbyBmcmFtZXMgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdW5yZWdpc3Rlcl9hbmRfY29udGludWU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvOworCisvKiogT0FNIFJlZyBDVEMgVmFyIERlc2MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiBsZWFmOyAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGFjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGV4dF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uIGxlYWY7ICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRfYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0ga3RhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBrdGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYzsKKworLyoqIE9BTSBSZWcgQ1RDIFZhcmlhYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjIGRlc2NyaXB0b3I7ICAgIC8qKjwgQ1RDIHZhcmlhYmxlIGRlc2NyaXB0b3IgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIHZhcmlhYmxlIGRlc2NyaXB0b3IgKE1VU1QgYmUgUmVnaXN0ZXIgb3IgVW5yZWdpc3RlcikuICovCisgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGU7CisKKy8qKiBPQU0gUmVnIENUQyBWYXJpYWJsZSBMaXN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QKK3sKKyAgICB1aW50OF90IHZhcmlhYmxlX2NvdW50OyAvKio8IE51bWJlciBvZiBDVEMgdmFyaWFibGUgcmVnaXN0cmF0aW9ucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSAqdmFyaWFibGVzOyAgICAvKio8IENUQyB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0OworCisvKiogT0FNIFJlZyBDVEMgT3AgVmFyaWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgQ1RDIHZhcmlhYmxlIHJlcXVlc3RzLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZTsKKworLyoqIE9BTSBSZWcgQ1RDIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSBvcGNvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3Bjb2RlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgQ1RDIG9wY29kZSAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdldF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHNldF9yZXF1ZXN0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZTsKKworLyoqIE9BTSBSZWcgQ1RDIENvbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udAoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIENUQyBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgKm9wY29kZXM7ICAgIC8qKjwgQ1RDIG9wY29kZSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250OworCisvKiogT0FNIFJlZyBDVEMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgQ1RDIE9VSSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YzsKKworLyoqIE9BTSBSZWcgVGVrIFZhciBEZXNjLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggYnJhbmNoOyAgICAgICAgICAgICAgICAgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzYzsKKworLyoqIE9BTSBSZWcgVGVrIFZhcmlhYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjIGRlc2NyaXB0b3I7ICAgIC8qKjwgVGVrIHZhcmlhYmxlIGRlc2NyaXB0b3IgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIHZhcmlhYmxlIGRlc2NyaXB0b3IgKE1VU1QgYmUgUmVnaXN0ZXIgb3IgVW5yZWdpc3RlcikuICovCisgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGU7CisKKy8qKiBPQU0gUmVnIFRlayBWYXJpYWJsZSBMaXN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QKK3sKKyAgICB1aW50OF90IHZhcmlhYmxlX2NvdW50OyAvKio8IE51bWJlciBvZiBUZWsgdmFyaWFibGUgcmVnaXN0cmF0aW9ucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSAqdmFyaWFibGVzOyAgICAvKio8IFRlayB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0OworCisvKiogT0FNIFJlZyBUZWsgT3AgVmFyaWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgVGVrIHZhcmlhYmxlIHJlcXVlc3RzLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZTsKKworLyoqIE9BTSBSZWcgVGVrIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSBvcGNvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3Bjb2RlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgVGVrIG9wY29kZSAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdldF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHNldF9yZXF1ZXN0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZTsKKworLyoqIE9BTSBSZWcgVGVrIENvbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udAoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIFRlayBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgKm9wY29kZXM7ICAgIC8qKjwgVGVrIG9wY29kZSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250OworCisvKiogT0FNIFJlZyBUZWsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgVGVrIE9VSSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlazsKKworLyoqIE9BTSBSZWcgRFBvRSBWYXIgRGVzYy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggYnJhbmNoOyAgICAgICAgICAgICAgICAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IHN0YW5kYXJkX2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiBsZWFmOyAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gc3RhbmRhcmRfYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRlbmRlZF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGV4dGVuZGVkX2FjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2M7CisKKy8qKiBPQU0gUmVnIERQb0UgVmFyaWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYyBkZXNjcmlwdG9yOyAgIC8qKjwgRFBvRSB2YXJpYWJsZSBkZXNjcmlwdG9yICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciB2YXJpYWJsZSBkZXNjcmlwdG9yIChNVVNUIGJlIFJlZ2lzdGVyIG9yIFVucmVnaXN0ZXIpLiAqLworICAgIHVpbnQxNl90IGxlbmd0aF9yZXNlcnZlZDsgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZTsKKworLyoqIE9BTSBSZWcgRFBvRSBWYXJpYWJsZSBMaXN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0Cit7CisgICAgdWludDhfdCB2YXJpYWJsZV9jb3VudDsgLyoqPCBOdW1iZXIgb2YgRFBvRSB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSAqdmFyaWFibGVzOyAgIC8qKjwgRFBvRSB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdDsKKworLyoqIE9BTSBSZWcgRFBvRSBPcCBWYXJpYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgRFBvRSB2YXJpYWJsZSByZXF1ZXN0cy4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNvbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdW5yZWdpc3Rlcl9hbmRfY29udGludWU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlOworCisvKiogT0FNIFJlZyBEUG9FIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIG9wY29kZTsgICAgICAgICAgICAgICAgICAgICAvKio8IE9wY29kZSB0byByZWdpc3RlciAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIERQb0Ugb3Bjb2RlLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdldF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHNldF9yZXF1ZXN0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGU7CisKKy8qKiBPQU0gUmVnIERQb0UgQ29udC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udAoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIERQb0Ugb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqb3Bjb2RlczsgICAvKio8IERQb0Ugb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250OworCisvKiogT0FNIFJlZyBEUG9FLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgRFBvRSBPVUkgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdW5yZWdpc3Rlcl9hbmRfY29udGludWU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lOworCisvKiogT0FNIFJlZyBWZW5kb3IgT1VJLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aQoreworICAgIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBvdWk7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZW5kb3IgT1VJIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgdmVuZG9yIE9VSSAoTVVTVCBiZSBSZWdpc3RlciBvciBVbnJlZ2lzdGVyKSAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGN0YzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrIHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0ZWs7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZHBvZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWk7CisKKy8qKiBPQU0gUmVnIFZlbmRvciBDb250LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQKK3sKKyAgICB1aW50OF90IHZlbmRvcl9vdWlfcmVnX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIFZlbmRvciBPVUkgcmVnaXN0cmF0aW9ucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgKnZlbmRvcl9vdWlfcmVnOyAvKio8IFZlbmRvciBPVUkgcmVnaXN0cmF0aW9ucyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udDsKKworLyoqIE9BTSBSZWcgVmVuZG9yLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBvcmdhbml6YXRpb24gc3BlY2lmaWMgZnJhbWVzLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNvbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250IHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250IHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcjsKKworLyoqIE9BTSBSZWcgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgb3Bjb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IElFRUUgT0FNIG9wY29kZSB0byByZWdpc3RlciAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIG9wY29kZSAoTVVTVCBiZSBSZWdpc3RlciBvciBVbnJlZ2lzdGVyKS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aF9yZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBpbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgdmFsdWU7ICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9yZ2FuaXphdGlvbl9zcGVjaWZpYzsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZTsKKworLyoqIE9BTSBSZWdpc3RyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbgoreworICAgIHVpbnQ4X3QgbWFzdGVyX2lkOyAgLyoqPCBUaGUgSUQgb2YgdGhlIG1hc3RlciB0aGF0IHRoaXMgcmVnaXN0cmF0aW9uIGFwcGxpZXMgdG8uICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgICAgICAvKio8IFJlc2VydmVkIChtdXN0IGJlIENvbnRpbnVlKSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZWdpc3RyYXRpb25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgT0FNIG9wY29kZSByZWdpc3RyYXRpb25zIGZvciB0aGlzIG1hc3RlciAobWF4aW11bSBvbmUgcmVnaXN0cmF0aW9uIHBlciBvcGNvZGUpLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlICpyZWdpc3RyYXRpb247ICAgLyoqPCBPQU0gb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgKi8KKyAgICAgICAgfSBjb250OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb247CisKKy8qKiBUaGlzIHJlY29yZCBpcyB1c2VkIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBPTlUgTWFzdGVyIGRvZXMgTk9UIGhhdmUgdGhlIE9BTSAKKyAqIE1hc3RlciBvcHRpb24gZW5hYmxlZC4gSXQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgY2VydGFpbiBPQU0gbWVzc2FnZXMgdGhhdCAKKyAqIHRoZSBtYXN0ZXIgd2lzaGVzIHRvIHByb2Nlc3MgaXRzZWxmLiBSYXRoZXIgdGhhbiBwcm9jZXNzaW5nIHRoZXNlIG1lc3NhZ2VzLCAKKyAqIHRoZSBPTlUgd2lsbCBzZW5kIHRoZXNlIG1lc3NhZ2VzIHRvIHRoZSBtYXN0ZXIuICBCeSBkZWZhdWx0IGFsbCBPQU0gZnJhbWVzIAorICogYXJlIGNvbnNpZGVyZWQgVW5yZWdpc3RlcmVkIGFuZCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgT05VLCB1bmxlc3MgdGhpcyAKKyAqIHJlY29yZCBzcGVjaWZpY2FsbHkgY29udGFpbnMgYSBSZWdpc3RlciBhY3Rpb24gZm9yIHRoYXQgdHlwZSBvZiBmcmFtZS4gVGhpcyAKKyAqIHJlY29yZCBpcyBoaWVyYXJjaGljYWwgYWxsb3dpbmcgaGlnaCBsZXZlbCBhY3Rpb25zIHRvIGJlIG92ZXJyaWRkZW4gYnkgbG93ZXIgCisgKiBsZXZlbCBhY3Rpb25zLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIGZvbGxvd2luZyB0aHJlZSBjb25kaXRpb25hbHMgCisgKiAoZWFjaCBzdWNjZXNzaXZlbHkgbmVzdGVkIHVuZGVyIHRoZSBwcmV2aW91cyk6ICAqIElmIFggVGhlbiBSZWdpc3RlciBBbmQgCisgKiBDb250aW51ZSAqIElmIFkgVGhlbiBVbnJlZ2lzdGVyIEFuZCBDb250aW51ZSAqIElmIFogVGhlbiBSZWdpc3RlciAgVGhlbiAKKyAqIGZyYW1lcyB3aGljaCBtYXRjaCBvbmx5IFggb3IgWCwgWSBhbmQgWiB3b3VsZCBiZSBmb3J3YXJkZWQsIHdoaWxlIGZyYW1lcyAKKyAqIG1hdGNoaW5nIFggYW5kIFksIGJ1dCBub3QgWiB3b3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlIE9OVS4gTm90ZSB0aGF0IGR1ZSB0byAKKyAqIHRoZSBoaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgaXQgaXMgbG9naWNhbGx5IGltcG9zc2libGUgCisgKiBmb3IgYSBmcmFtZSB0byBtYXRjaCBZIG9yIFogd2l0aG91dCBtYXRjaGluZyBYLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzb21lIAorICogbGltaXRhdGlvbnMgd2hlbiByZWdpc3RlcmluZyBicmFuY2gvbGVhZiBjb2RlcyAoVmFyaWFibGVzKS4gRm9yIHZhcmlhYmxlcyAKKyAqIHRoYXQgYXJlIHJlYWQvd3JpdGUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWdpc3RlciB0aGUgdmFyaWFibGUgdW5kZXIgYm90aCB0aGUgCisgKiBnZXQgcmVxdWVzdCBhbmQgc2V0IHJlcXVlc3Qgb3Bjb2Rlcy4gQSBzaW5nbGUgZ2V0IG9yIHNldCByZXF1ZXN0IGNhbiBhbHNvIAorICogY29udGFpbiBtdWx0aXBsZSB2YXJpYWJsZXMgd2hpY2ggbWF5IGhhdmUgY29uZmxpY3RpbmcgcmVnaXN0cmF0aW9uIHN0YXRlcy4gQSAKKyAqIGZyYW1lIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBtYXN0ZXIgaWYgaXQgd2FzIHJlZ2lzdGVyZWQgYXQgYSBoaWdoZXIgbGV2ZWwgCisgKiBhbmQgY29udGFpbnMgbm8gdmFyaWFibGVzIHdoaWNoIHdlcmUgZXhwbGljaXRseSB1bnJlZ2lzdGVyZWQgb3IgaWYgaXQgCisgKiBjb250YWlucyBhbnkgdmFyaWFibGVzIHRoYXQgd2VyZSBleHBsaWNpdGx5IHJlZ2lzdGVyZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0Cit7CisgICAgdWludDhfdCByZWdpc3RyYXRpb25zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIE9OVSBNYXN0ZXIgT0FNIHJlZ2lzdHJhdGlvbnMgKG1heGltdW0gMSBwZXIgbWFzdGVyKS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqcmVnaXN0cmF0aW9uczsgICAgLyoqPCBPTlUgTWFzdGVyIE9BTSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Q7CisKKy8qKiBNYXN0ZXIgQ29udGV4dCBUTFYuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2Cit7CisgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgdHlwZTsgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHBvcnRfaW5kZXg7ICAgICAgICAgICAgICAgICAvKio8IFBvcnQgSW5kZXguICovCisgICAgICAgIH0gbmV0d29ya19wb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGlua19pbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgTGluayBJbmRleC4gKi8KKyAgICAgICAgfSBsaW5rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHBvcnRfaW5kZXg7ICAgICAgICAgICAgICAgICAvKio8IFBvcnQgSW5kZXguICovCisgICAgICAgIH0gdXNlcl9wb3J0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdjsKKworLyoqIE5lZ290aWF0ZWQgT0FNLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgLyoqPCBPVUkuICovCisgICAgYmNtb3NfYm9vbCBuZWdvdGlhdGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOZWdvdGlhdGVkLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uIHZlcnNpb247ICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgfSBjdGM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb24gdmVyc2lvbjsgICAvKio8IFZlcnNpb24uICovCisgICAgICAgIH0gZHBvZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbTsKKworLyoqIE5lZ290aWF0ZWQgT0FNIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdAoreworICAgIHVpbnQ4X3QgY291bnQ7ICAvKio8IENvdW50LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqbmVnb3RpYXRlZF9vYW1zOyAgICAvKio8IE5lZ290aWF0ZWQgT0FNcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3Q7CisKKy8qKiBPTlUgTWFzdGVyIENvbW1hbmQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCBjb21tYW5kOyAgICAgICAgICAgICAgICAgICAgICAvKio8IENvbW1hbmQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0IG9hbV9yZWdpc3RyYXRpb25zOyAgICAvKio8IE9BTSBSZWdpc3RyYXRpb25zLiAqLworICAgICAgICB9IHNldF9vYW1fcmVnaXN0cmF0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2IGxpbmtfY29udGV4dDsgICAgICAgICAgICAvKio8IExpbmsgQ29udGV4dC4gKi8KKyAgICAgICAgfSBnZXRfbmVnb3RpYXRlZF9vYW07CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgbGlua19jb250ZXh0OyAgICAgICAgICAgIC8qKjwgTGluayBDb250ZXh0LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgbmVnb3RpYXRlZF9vYW07ICAgICAgICAgLyoqPCBOZWdvdGlhdGVkIE9BTS4gKi8KKyAgICAgICAgfSBzZXRfbmVnb3RpYXRlZF9vYW07CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kOworCisvKiogT05VIE1hc3RlciBSZXNwb25zZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCBjb21tYW5kOyAgICAgICAgICAgICAgICAgICAgICAvKio8IENvbW1hbmQuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZSByZXNwb25zZV9jb2RlOyAgICAgICAgICAgICAvKio8IFJlc3BvbnNlIENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlIHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IGdldF9vbnVfc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Qgb2FtX3JlZ2lzdHJhdGlvbnM7ICAgIC8qKjwgT0FNIFJlZ2lzdHJhdGlvbnMuICovCisgICAgICAgIH0gZ2V0X29hbV9yZWdpc3RyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgbGlua19jb250ZXh0OyAgICAgICAgICAgIC8qKjwgTGluayBDb250ZXh0LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgbmVnb3RpYXRlZF9vYW07ICAgICAgICAgLyoqPCBOZWdvdGlhdGVkIE9BTS4gKi8KKyAgICAgICAgfSBnZXRfbmVnb3RpYXRlZF9vYW07CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgbGlua19jb250ZXh0OyAgICAgICAgICAgIC8qKjwgTGluayBDb250ZXh0LiAqLworICAgICAgICB9IHNldF9uZWdvdGlhdGVkX29hbTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlOworCisvKiogT05VIE1hc3RlciBDb21tdW5pY2F0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbgoreworICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSB0eXBlOyAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29tbWFuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlc3BvbnNlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbjsKKworLyoqIE1hc3RlciBQRFUgQ29tbW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wgcHJvdG9jb2w7ICAgICAgICAgICAvKio8IFByb3RvY29sLiAqLworICAgIHVpbnQxNl90IGNvcnJlbGF0aW9uX3RhZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3JyZWxhdGlvbiBUYWcuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzIGZsYWdzOyAgICAvKio8IEZsYWdzLiAqLworICAgICAgICB9IHBpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50IGRtZXA7ICAgICAgICAgIC8qKjwgRE1FUC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50IHNtZXA7ICAgICAgICAgIC8qKjwgU01FUC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lX2xlbmd0aDsgIC8qKjwgRnJhbWUgTGVuZ3RoLiAqLworICAgICAgICAgICAgdWludDhfdCAqZnJhbWVfZGF0YTsgICAgLyoqPCBGcmFtZSBEYXRhLiAqLworICAgICAgICB9IGVuY2Fwc3VsYXRlZF9mcmFtZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvYW1fY29udGVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3RlcmVkX29hbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYXN0ZXJfY29tbXVuaWNhdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbjsKKworLyoqIE9yZ2FuaXphdGlvbiBTcGVjaWZpYyBTbG93IFByb3RvY29sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgICAgIC8qKjwgT1VJLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHRlazsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbDsKKworLyoqIFNsb3cgUHJvdG9jb2wuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbAoreworICAgIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgc3VidHlwZTsgICAgICAvKio8IFN1YnR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgIC8qKjwgRmxhZ3MuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50IGNvbnRlbnQ7ICAgIC8qKjwgQ29udGVudC4gKi8KKyAgICAgICAgfSBvYW07CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb3JnYW5pemF0aW9uX3NwZWNpZmljOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2w7CisKKy8qKiBFdGhlcm5ldCBQcm90b2NvbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbAoreworICAgIGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIGV0aGVydHlwZTsgICAgICAgIC8qKjwgRXRoZXJ0eXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcGFkZGluZ19jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBhZGRpbmcuICovCisgICAgICAgICAgICB1aW50OF90ICpwYWRkaW5nOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQYWRkaW5nLiAqLworICAgICAgICB9IHplcm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIHZhbHVlOyAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGN2bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZSB2YWx1ZTsgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdmxhbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWUgdmFsdWU7ICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gaXRhZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2xvd19wcm90b2NvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZWFwb2w7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2w7CisKKy8qKiBFdGhlcm5ldCBGcmFtZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZQoreworICAgIGJjbW9zX21hY19hZGRyZXNzIGRhOyAgICAgICAvKio8IERlc3RpbmF0aW9uIEFkZHJlc3MuICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3Mgc2E7ICAgICAgIC8qKjwgU291cmNlIEFkZHJlc3MuICovCisgICAgdWludDMyX3QgcHJvdG9jb2xzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHByb3RvY29scy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKnByb3RvY29sczsgICAvKio8IFByb3RvY29scy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lOworCisvKiogT0FNIFBkdSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZQoreworICAgIGJjbW9zX21hY19hZGRyZXNzIGRhOyAgIC8qKjwgRGVzdGluYXRpb24gQWRkcmVzcy4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBzYTsgICAvKio8IFNvdXJjZSBBZGRyZXNzLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIHByb3RvY29sX3R5cGU7ICAgIC8qKjwgUHJvdG9jb2wgVHlwZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIHN1YnR5cGU7ICAvKio8IFN1YnR5cGUuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyBmbGFnczsgICAgICAgICAgICAgICAgLyoqPCBGbGFncy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50IGNvbnRlbnQ7ICAgICAgICAvKio8IENvbnRlbnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2U7CisKKy8qKiBPQU0gVGVrIEV2ZW50IEdQSU8uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvCit7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7ICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICB1aW50MzJfdCBncGlvX3N0YXRlMWc7ICAvKio8IEdQSU8gU3RhdGUgKDFHKS4gKi8KKyAgICB1aW50NjRfdCBncGlvX3N0YXRlMTBnOyAvKio8IEdQSU8gU3RhdGUgKDEwRykuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW87CisKKy8qKiBPQU0gVGVrIEV2ZW50LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgYWxhcm1fY29kZTsgIC8qKjwgQWxhcm0gQ29kZS4gKi8KKyAgICBiY21vc19ib29sIHJhaXNlZDsgIC8qKjwgUmFpc2VkLiAqLworICAgIHVpbnQxNl90IHBvcnQ7ICAgICAgLyoqPCBQb3J0LiAqLworICAgIHVpbnQxNl90IGxpbms7ICAgICAgLyoqPCBMaW5rLiAqLworICAgIHVpbnQxNl90IHF1ZXVlOyAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQgYWxhcm1fY29udGV4dDsgICAgLyoqPCBBbGFybSBDb250ZXh0LiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBzdGF0X2lkOyAvKio8IFN0YXQgSUQuICovCisgICAgICAgIH0gc3RhdF9hbGFybTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdwaW9fbGlua19mYXVsdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdwaW9fZHlpbmdfZ2FzcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdwaW9fY3JpdGljYWxfZXZlbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBncGlvX290aGVyOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQ7CisKKy8qKiBTdGQgTUFDIEFkZHJlc3MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgYWRkcmVzczsgIC8qKjwgQWRkcmVzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzczsKKworLyoqIFRlayBWYXIgRGVzYyBBdHRyIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgYXR0cmlidXRlOyAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBzdGF0OyAgICAvKio8IFN0YXQuICovCisgICAgICAgIH0gcG9ydF9zdGF0X3RocmVzaG9sZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBzdGF0OyAgICAvKio8IFN0YXQuICovCisgICAgICAgIH0gbGlua19zdGF0X3RocmVzaG9sZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlOworCisvKiogVExTIFJlY29yZCBDb250aW51ZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZSBjb250ZW50X3R5cGU7ICAvKio8IENvbnRlbnQgVHlwZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gdmVyc2lvbjsgICAgICAgICAgICAvKio8IFZlcnNpb24uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2NvdW50OyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZGF0YS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGE7ICAvKio8IERhdGEuICovCisgICAgICAgIH0gZGVmOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkOworCisvKiogVExTIFNpZ25hdHVyZSBBbmQgSGFzaCBBbGdvcml0aG0uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG0KK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtIGhhc2g7ICAgIC8qKjwgSGFzaC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gc2lnbmF0dXJlOyAgLyoqPCBTaWduYXR1cmUuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobTsKKworLyoqIFRMUyBTaWduYXR1cmUgQW5kIEhhc2ggQWxnb3JpdGhtIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdAoreworICAgIHVpbnQzMl90IHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtcy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG0gKnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtczsgICAvKio8IFN1cHBvcnRlZCBTaWduYXR1cmUgQWxnb3JpdGhtcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3Q7CisKKy8qKiBAfSAqLworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3RvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2tfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2sgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2sgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2tfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGhfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X2V4Y2xfYWJpbGl0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X2V4Y2xfYWJpbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWdfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2tfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjayB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2tfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXBfcGFjayhiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXAgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHNfcGFjayhiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2hfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2hfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3BhY2soYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9hY2tfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3Zlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3Zlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXRfcGFjayhiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2Ugc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9kZWZfY291bnRfc2VydmljZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvbl9jb3VudF90cmFuc2xhdGlvbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua19jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua19tZHVfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfaHlicmlkX2NvdW50X3Blcm1pdHRlZF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9kZWxldGVfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9hZGRfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9saXN0X2NvdW50X211bHRpY2FzdF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5IGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkIAorICogZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2FfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhIAorICogZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgCisgKiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgdG8gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2FfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhIAorICogZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19vbmx5X2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjRzYV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjZzYV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfdmVyc2lvbl9jb3VudF9maXJtd2FyZV92ZXJzaW9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfd3JpdGVfcmVxdWVzdF9jb3VudF9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X21vZGUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZGF0YV9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2Vycm9yX2NvdW50X21lc3NhZ2UoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3Jlc3RvcmVfb251X2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3Igd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc29mdHdhcmVfZG93bmxvYWRfY291bnRfbWVzc2FnZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9rdG9udV9ldmVudF9jb3VudF9ldmVudHMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c19wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3N0YXRpc3RpY19jb3VudF9zZXF1ZW5jZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3QgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X2NvdW50X25hbWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2NvdW50X21hY19hZGRyZXNzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbmV0d29ya19wb25fY291bnRfcG9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbGlua19jb3VudF9saW5rKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdXNlcl9wb3J0X2NvdW50X3BvcnQoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfY291bnRfYnJpZGdlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX3BvcnRfY291bnRfcG9ydChiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Igd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2V0X2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWxfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWxfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfcGFjayhiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tYW51ZmFjdHVyZXJfaW5mb19jb3VudF9kZWYoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVfY291bnRfZmlybXdhcmVfZmlsZW5hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVfY291bnRfbWFuX25hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdmVuZG9yX25hbWVfY291bnRfdmVuZG9yX25hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbW9kZWxfbnVtYmVyX2NvdW50X21vZGVsX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9od192ZXJzaW9uX2NvdW50X2h3X3ZlcnNpb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZV9jb3VudF9jdXJyZW50X3RlbXBlcmF0dXJlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdmNjX2NvdW50X2N1cnJlbnRfdmNjKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdHhfYmlhc19jb3VudF9jdXJyZW50X3R4X2JpYXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlcl9jb3VudF9jdXJyZW50X3R4X3Bvd2VyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fcnhfcG93ZXJfY291bnRfY3VycmVudF9yeF9wb3dlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZV9jb3VudF9wb3J0X3R5cGUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nX2NvdW50X2RlZihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV90aW1lX3RyYW5zZmVyX2NvdW50X3RvZF9zdHJpbmcoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVfY291bnRfbWFjX2FkZHJlc3MoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2Ugd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2ZpbGVfd3JpdGVfY291bnRfZmlsZW5hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV91OHZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5X2NvdW50X2NhcGFiaWxpdGllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoX2NvdW50X2NhcGFiaWxpdGllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRfY291bnRfZnVuY3Rpb25zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb21fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb20gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb21fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Qgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3Qgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9jb3VudF9jZXJ0aWZpY2F0ZV9saXN0KGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3Qgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2Ugc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2ZpbmlzaGVkX2NvdW50X3ZlcmlmeV9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2hhbmRzaGFrZV9jb3VudF9oYW5kc2hha2VfcmVjb3JkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9jb3VudF90bHNfcmVjb3JkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fY3RjX2NvdW50X3N1cHBfdmVyc2lvbihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9vYmplY3RfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrYWdlX2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfbmFtZV9iaW5kaW5nX2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYXR0cmlidXRlX2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYWN0aW9uX2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9sb2dpY2FsX2xpbmtfY291bnRfbGlua19udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wb3J0X2NvdW50X3BvcnRfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfbmV0d29ya19wb25fY291bnRfcG9uX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VzZXJfcG9uX2NvdW50X3Bvbl9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VfY291bnRfYnJpZGdlX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9wb3J0X2NvdW50X3BvcnRfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2NsYXVzZV9jb3VudF9tYXRjaF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3Jlc3VsdF9jb3VudF9wYXJhbWV0ZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfcGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWwgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3JlcG9ydF90aHJlc2hvbGRzX2NvdW50X3RocmVzaG9sZHMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X2RuX2ZpbHRlcl90YmxfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X3VwX2ZpbHRlcl90YmxfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbnZzX3NjcmF0Y2hwYWRfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfYWRkX3J1bGVfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9uZXdfZGVsX3J1bGVfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9kZWxldGVfcnVsZV9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2Ugc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5hY2tlZF9hY3Rpb25fY291bnRfdmFyaWFibGVfY29udGFpbmVycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2Ugd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9kYXRhX2NvdW50X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2luZm9fY291bnRfdGx2cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2V2ZW50X25vdGlmaWNhdGlvbl9jb3VudF90bHZzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2NfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2Mgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Qgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2NfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2Mgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Qgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Igc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fcGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3Qgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfemVyb19jb3VudF9wYWRkaW5nKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2NvdW50X3Byb3RvY29scyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3NfcGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9kZWZfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0IHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdCAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfY291bnRfc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisjZW5kaWYgLyogQkNNT0xUX0VQT05fT0FNX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDI0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjIFN0YWNrCisjCitNT0RfTkFNRSA9IGRldl9sb2cKK01PRF9UWVBFID0gbGliCisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorCU1PRF9ERVBTID0gY2xpIHV0aWxzCisJTU9EX0RFRlMgPSAtREVOQUJMRV9MT0cKKwlVU0VfTElOVCA9IHllcworCXNyY3MgPSBiY21fZGV2X2xvZy5jIGJjbV9kZXZfbG9nX3Rhc2suYworCWlmZXEgKCIkKEZFQVRVUkVfTE9HKSIsICJ5IikKKwkJTU9EX0RFRlMgKz0gLURUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisJZW5kaWYKKworCWlmZXEgKCIkKERFVl9MT0dfREVCVUcpIiwgInkiKQorCQlNT0RfREVGUyArPSAtRERFVl9MT0dfREVCVUcKKwllbmRpZgorCQorCWlmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCQlzcmNzICs9IGJjbV9kZXZfbG9nX2NsaS5jCisJZW5kaWYKKwkKKwlpZmVxICgiJChUT09MQ0hBSU4pIiwgImdjYyIpCisJCUVYVFJBX0NGTEFHUyAgKz0gLVduby1mb3JtYXQtc2VjdXJpdHkKKwllbmRpZgorCQorCWlmZXEgKCIkKFNVQlNZU1RFTSkiLCAiaG9zdCIpCisgICAgICAgaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisgICAgICAgICAgIGlmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgICAgICAgICAgICAgRVhUUkFfSU5DTFVERVMgKz0gLUkkKFRPUF9ESVIpL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgRVhUUkFfSU5DTFVERVMgKz0gLUkkKFRPUF9ESVIpL2hvc3QvZGV2X2xvZ19saW51eAorICAgICAgICAgICBlbmRpZgorICAgICAgIGVuZGlmCisJZW5kaWYKKwkKKyAgICBpZmVxICgiJChPUykiLCAicG9zaXgiKQorICAgICAgICBFTkFCTEVfTE9HX1NZU0xPRyA/PSB5CisgICAgICAgIGlmZXEgKCIkKEVOQUJMRV9MT0dfU1lTTE9HKSIsICJ5IikKKyAgICAgICAgICAgIE1PRF9ERUZTICs9IC1EREVWX0xPR19TWVNMT0cKKyAgICAgICAgZW5kaWYgICAgICAgICAgICAgICAgICAgICAgCisgICAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhjYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmZGVmIEVOQUJMRV9MT0cKKworI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2suaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZ190YXNrX2ludGVybmFsLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKworc3RhdGljIGJjbW9zX3RpbWVyIGRldl9sb2dfdGltZXI7CisKKy8qIFN0b3JlIHRpbWVzdGFtcCBwZXIgZXZlcnkgcmF0ZS1saW1pdGVkIGxvZyBJRC4gKi8KK3N0YXRpYyB1aW50NjRfdCByYXRlX2xpbWl0X2lkMnRpbWVzdGFtcFtERVZfTE9HX1JBVEVfTElNSVRfSURfX05VTV9PRl07CisKK2NvbnN0IGNoYXIgKmRldl9sb2dfYmFzZW5hbWUoY29uc3QgY2hhciAqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKnNsYXNoOworICAgIGlmICgoc2xhc2ggPSBzdHJjaHIoc3RyLCAnLycpKSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0cjAgPSBzdHI7CisgICAgICAgIHN0ciA9IHN0cmNocihzbGFzaCsxLCAnICcpOworICAgICAgICAvKiBJZiBsb2cgZm9ybWF0IHN0cmluZyB3YXMgY3JlYXRlZCBieSBCQ01fTE9HIG1hY3JvIGFuZCB0aGVyZSBpcyBubyBjb3JydXB0aW9uIG9mIHNvbWUga2luZAorICAgICAgICAgKiBzdHIgYWJvdmUgaXMgZ3VhcmFudGVlZCB0byBiZSAhPSBOVUxMLiBIb3dldmVyLCBtYWtpbmcgc3RyIT1OVUxMIGFzc3VtcHRpb24gbWFrZXMgZGV2X2xvZworICAgICAgICAgKiB2dWxuZXJhYmxlIHRvIGJ1Z3MgaW4gdGhlIGNhbGxlci4gSW4gdGhpcyBjYXNlIHRoZSBmb2xsb3dpbmcgaW5leHBlbnNpdmUgY2hlY2sgcHJldmVudHMgY3Jhc2gKKyAgICAgICAgICogaW4gZGV2X0xvZyBhbmQgaGVscHMgaW4gaWRlbnRpZnlpbmcgdGhlIHJlYWwgY3VscHJpdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICghc3RyKQorICAgICAgICAgICAgcmV0dXJuIHN0cjA7CisgICAgICAgIHdoaWxlIChzdHJbMF0gIT0gJy8nKQorICAgICAgICAgICAgc3RyLS07CisgICAgICAgIHN0cisrOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorCisvKiBjaGVjayBpZiB0aGUgbWVzc2FnZSBmaXRzIHRoZSBsZXZlbCBhbmQgdGhlIG90aGVyIGNyaXRlcmlhIGZvciBhIHRyaWdnZXIKKyAgIHJldHVybiAxIGlmIHllcywgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkCisgICBhbmQgcmV0dXJucyAwIGlmIHRoZSBtZXNzYWdlIHdpbGwgbm90IGJlIHByaW50ZWQKKyovCitzdGF0aWMgYmNtb3NfYm9vbCBjaGVja190cmlnZ2VyKGRldl9sb2dfaWRfcGFybSAqeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCkKK3sKKyAgICAvKiB0aGUgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgbXVzdCBiZSBleGFjdGx5IHRoZSB0cmlnZ2VyIGxldmVsICovCisgICAgaWYgKHhpX2lkLT50cmlnZ2VyX2xvZ19sZXZlbCAhPSB4aV9sb2dfbGV2ZWwpCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsgLyogZG8gbm90IHByaW50IHRoZSBtZXNzYWdlICAtIHRoZSBsZXZlbCBkb2VzIG5vdCBmaXQgKi8KKyAgICAKKyAgICB4aV9pZC0+dHJpZ2dlci5jb3VudGVyKys7CisgICAgaWYgKHhpX2lkLT50cmlnZ2VyLmNvdW50ZXIgPj0geGlfaWQtPnRyaWdnZXIuc3RhcnRfdGhyZXNob2xkKQorICAgIHsKKyAgICAgICAgaWYgKHhpX2lkLT50cmlnZ2VyLmNvdW50ZXIgPj0geGlfaWQtPnRyaWdnZXIuc3RvcF90aHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHRyaWdnZXIgZmluaXNoZWQsIGNoZWNrIHJlcGVhdCAqLworICAgICAgICAgICAgaWYgKHhpX2lkLT50cmlnZ2VyLnJlcGVhdF90aHJlc2hvbGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeGlfaWQtPnRyaWdnZXIucmVwZWF0Kys7CisgICAgICAgICAgICAgICAgaWYgKHhpX2lkLT50cmlnZ2VyLnJlcGVhdCA8IHhpX2lkLT50cmlnZ2VyLnJlcGVhdF90aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiByZXdpbmQgdHJpZ2dlciBjb25kaXRpb25zICovCisgICAgICAgICAgICAgICAgICAgIHhpX2lkLT50cmlnZ2VyLmNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHRyaWdnZXIgaXMgYWN0aXZlIDogY291bnRlciBncmVhdGVyIHRoYW4gc3RhcnQgYW5kIGxlc3MgdGhhbiBlbmQgKi8KKyAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOyAvKiBwcmludCB0aGUgbWVzc2FnZSAqLworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7LyogZG8gbm90IHByaW50IHRoZSBtZXNzYWdlICAtIHN0aWxsIGxlc3MgdGhhbiBzdGFydCB0aHJlc2hvbGQgKi8KK30KKworLyogY2hlY2sgaWYgdGhlIG1lc3NhZ2UgZml0cyB0aGUgbGV2ZWwgYW5kIHRoZSBjcml0ZXJpYSBmb3IgdGhyb3R0bGUKKyAgIHJldHVybiAxIGlmIHllcywgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkCisgICBhbmQgcmV0dXJucyAwIGlmIHRoZSBtZXNzYWdlIHdpbGwgbm90IGJlIHByaW50ZWQKKyovCitzdGF0aWMgYmNtb3NfYm9vbCBjaGVja190aHJvdHRsZShkZXZfbG9nX2lkX3Bhcm0gKnhpX2lkLCBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwpCit7CisgICAgLyogY2hlY2sgaWYgYW55IHRocm90dGxlIGlzIGRlZmluZWQgKi8KKyAgICBpZiAoeGlfaWQtPnRocm90dGxlX2xvZ19sZXZlbCAhPSBERVZfTE9HX0xFVkVMX05PX0xPRykKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7IC8qIHByaW50IHRoZSBtZXNzYWdlICAtIG5vIHRyaWdnZXIgaXMgc2V0ICovCisgICAgCisgICAgLyogdGhlIGxldmVsIG9mIHRoZSBtZXNzYWdlIG11c3QgYmUgZXhhY3RseSB0aGUgdGhyb3R0bGUgbGV2ZWwgKi8KKyAgICBpZiAoeGlfaWQtPnRocm90dGxlX2xvZ19sZXZlbCAhPSB4aV9sb2dfbGV2ZWwpCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsgLyogZG8gbm90IHByaW50IHRoZSBtZXNzYWdlICAtIHRoZSBsZXZlbCBkb2VzIG5vdCBmaXQgKi8KKyAgICAKKyAgICB4aV9pZC0+dGhyb3R0bGUuY291bnRlcisrOworICAgIGlmICh4aV9pZC0+dGhyb3R0bGUuY291bnRlciA+PSB4aV9pZC0+dGhyb3R0bGUudGhyZXNob2xkKQorICAgIHsKKyAgICAgICAgeGlfaWQtPnRocm90dGxlLmNvdW50ZXIgPSAwOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOy8qIGRvIG5vdCBwcmludCB0aGUgbWVzc2FnZSAgLSBzdGlsbCBsZXNzIHRoYW4gc3RhcnQgdGhyZXNob2xkICovCit9CisKKyNlbmRpZgorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgYmNtX2Rldl9sb2dfbXNnX3NlbmRfdGltZXJfY2IoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgYmNtb3NfbXNnICptc2cgPSAoYmNtb3NfbXNnICopZGF0YTsKKyAgICBiY21vc19tc2dfc2VuZCgmZGV2X2xvZy5zYXZlX3F1ZXVlLCBtc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCit1aW50OF90IGJjbV9kZXZfbG9nX3Bvb2xfb2NjdXBhbmN5X3BlcmNlbnRfZ2V0KHZvaWQpCit7CisgICAgYmNtb3NfbXNnX3Bvb2xfaW5mbyBtc2dfcG9vbF9pbmZvOworICAgIGJjbW9zX2Vycm5vIGVycm9yID0gYmNtb3NfbXNnX3Bvb2xfcXVlcnkoJmRldl9sb2cucG9vbCwgJm1zZ19wb29sX2luZm8pOworICAgIGlmIChlcnJvciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoImJjbW9zX21zZ19wb29sX3F1ZXJ5KCkgcmV0dXJuZWQgJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyb3IpLCBlcnJvcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gKHVpbnQ4X3QpKCgxMDAgKiAobXNnX3Bvb2xfaW5mby5wYXJtLnNpemUgLSBtc2dfcG9vbF9pbmZvLnN0YXQuZnJlZSkpIC8gbXNnX3Bvb2xfaW5mby5wYXJtLnNpemUpOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBiY21fZGV2X2xvZ19zaG91bGRfZHJvcCgKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbCwKKyAgICB1aW50MzJfdCByYXRlX3VzLAorICAgIGRldl9sb2dfcmF0ZV9saW1pdF9pZCByYXRlX2xpbWl0X2lkKQoreworICAgIC8qIElmIHRoZSBtc2cgcG9vbCBpcyBzdWZmaWNpZW50bHkgZnVsbCwgZHJvcCBhbGwgbm9uLWVycm9yIG1lc3NhZ2VzICovCisgICAgaWYgKCFiY21fZGV2X2xvZ19sZXZlbF9pc19lcnJvcihsb2dfbGV2ZWwpICYmCisgICAgICAgIGJjbV9kZXZfbG9nX3Bvb2xfb2NjdXBhbmN5X3BlcmNlbnRfZ2V0KCkgPj0gREVWX0xPR19FUlJPUl9PTkxZX1RIUkVTSE9MRF9QRVJDRU5UKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIAorI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICAvKiBpZiB0cmlnZ2VyIGRlZmluZWQgLSBpZ25vcmUgdGhyb3R0bGUgYW5kIHByaW50aW5nIGxldmVsICovCisgICAgaWYgKGlkLT50cmlnZ2VyX2xvZ19sZXZlbCAhPSBERVZfTE9HX0xFVkVMX05PX0xPRykKKyAgICAgICAgcmV0dXJuIGNoZWNrX3RyaWdnZXIoaWQsIGxvZ19sZXZlbCk7CisjZW5kaWYKKyAgICAKKyAgICAvKiBpZiB0cmlnZ2VyIGlzIG5vdCBmdWxsZmlsbGVkIC0gY2hlY2sgb3RoZXIgY29uZGl0aW9ucyAqLworICAgIGlmIChsb2dfbGV2ZWwgPiBpZC0+bG9nX2xldmVsX3ByaW50ICYmIGxvZ19sZXZlbCA+IGlkLT5sb2dfbGV2ZWxfc2F2ZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgCisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorICAgIGlmICghY2hlY2tfdGhyb3R0bGUoaWQsIGxvZ19sZXZlbCkpCisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworI2VuZGlmCisKKyAgICBpZiAocmF0ZV91cyAmJiByYXRlX2xpbWl0X2lkICE9IERFVl9MT0dfUkFURV9MSU1JVF9JRF9OT05FKQorICAgIHsKKyAgICAgICAgdWludDY0X3QgY3Vycl90aW1lc3RhbXA7CisKKyAgICAgICAgLyogRG8gcmF0ZSBsaW1pdC4gKi8KKyAgICAgICAgY3Vycl90aW1lc3RhbXAgPSBiY21vc190aW1lc3RhbXA2NCgpOworICAgICAgICBpZiAoY3Vycl90aW1lc3RhbXAgLSByYXRlX2xpbWl0X2lkMnRpbWVzdGFtcFtyYXRlX2xpbWl0X2lkXSA8IHJhdGVfdXMpCisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsgLyogRmlsdGVyIG91dCB0aGlzIG1lc3NhZ2UuICovCisgICAgICAgIHJhdGVfbGltaXRfaWQydGltZXN0YW1wW3JhdGVfbGltaXRfaWRdID0gY3Vycl90aW1lc3RhbXA7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZCBfYmNtX2Rldl9sb2dfdmxvZyhkZXZfbG9nX2lkIHhpX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwKKyAgICB1aW50MzJfdCB4aV9mbGFncywKKyAgICB1aW50MzJfdCByYXRlX3VzLAorICAgIGRldl9sb2dfcmF0ZV9saW1pdF9pZCByYXRlX2xpbWl0X2lkLCAKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgdmFfbGlzdCBhcmdzKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisgICAgZGV2X2xvZ19xdWV1ZV9tc2cgKmxvZ19xdWV1ZV9tc2c7CisgICAgYmNtb3NfZXJybm8gZXJyb3IgPSBCQ01fRVJSX09LOworICAgIGJjbW9zX21zZyAqbXNnOworCisgICAgaWYgKGRldl9sb2cuc3RhdGUgIT0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRCkKKyAgICB7CisgICAgICAgIGlmIChkZXZfbG9nLmZsYWdzICYgQkNNX0RFVl9MT0dfRkxBR19ESVNBQkxFRF9XSVRIX1BSSU5URikKKyAgICAgICAgICAgIERFVl9MT0dfVlBSSU5URihmbXQsIGFyZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICAvKiBJZiB0aGlzIElEIHdhcyBub3QgcmVnaXN0ZXJlZCAtIG9yIHJlZ2lzdGVyZWQgaW5jb3JyZWN0bHkgKi8KKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgREVWX0xPR19WUFJJTlRGKGZtdCwgYXJncyk7IC8qIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBkZWJ1ZyB3aGF0IGxpbmUgY2F1c2VkIHRoZSBidWcuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCh4aV9sb2dfbGV2ZWwgPj0gREVWX0xPR19MRVZFTF9OVU1fT0YpIHx8ICh4aV9sb2dfbGV2ZWwgPT0gREVWX0xPR19MRVZFTF9OT19MT0cpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoInhpX2xvZ19sZXZlbCAoJXUpIGlzIGludmFsaWRcbiIsIHhpX2xvZ19sZXZlbCk7CisgICAgICAgIERFVl9MT0dfVlBSSU5URihmbXQsIGFyZ3MpOyAvKiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gZGVidWcgd2hhdCBsaW5lIGNhdXNlZCB0aGUgYnVnLiAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpZC0+bG9nX3R5cGUgPT0gREVWX0xPR19JRF9UWVBFX05PTkUpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIC8qIEFsd2F5cyB1c2UgQ0FMTEVSX0ZNVCBtb2RlIG9uIHRoZSBob3N0IHRvIGF2b2lkIHBvcnRhYmlsaXR5IGlzc3VlcyB3aXRoCisgICAgICogdHJhbnNmZXJyaW5nIHZhX2xpc3QgYXMgYW4gYXJyYXkgKi8KKyAgICB4aV9mbGFncyB8PSBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVDsKKyNlbmRpZgorCisgICAgLyogVXBkYXRlIGxvZyBpZCBjb3VudGVycyAgKi8KKyAgICBpZC0+Y291bnRlcnNbeGlfbG9nX2xldmVsXSsrOworCisgICAgaWYgKGJjbV9kZXZfbG9nX3Nob3VsZF9kcm9wKGlkLCB4aV9sb2dfbGV2ZWwsIHJhdGVfdXMsIHJhdGVfbGltaXRfaWQpKQorICAgICAgICByZXR1cm47CisKKyAgICBtc2cgPSBiY21vc19tc2dfcG9vbF9hbGxvYygmZGV2X2xvZy5wb29sKTsKKyAgICBpZiAoIW1zZykKKyAgICB7CisgICAgICAgIGJjbV9kZXZfbG9nX2Ryb3BfcmVwb3J0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9nX3F1ZXVlX21zZyA9IG1zZy0+ZGF0YTsKKyAgICAvKiBDcmVhdGUgbG9nIG1lc3NhZ2UgKi8KKyAgICBsb2dfcXVldWVfbXNnLT5sb2dfaWQgPSBpZDsKKyAgICBsb2dfcXVldWVfbXNnLT50aW1lX3N0YW1wID0gZGV2X2xvZy5kZXZfbG9nX3Bhcm0uZ2V0X3RpbWVfY2IoKTsKKyAgICBsb2dfcXVldWVfbXNnLT5tc2dfbGV2ZWwgPSB4aV9sb2dfbGV2ZWw7CisgICAgbG9nX3F1ZXVlX21zZy0+ZmxhZ3MgPSB4aV9mbGFnczsKKyNpZm5kZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisgICAgLyogSXQgaXMgbm90IHJlYWxseSBuZWNlc3NhcnkgdG8gY29tcGlsZSBvdXQgbm9uIENBTExFUl9GTVQgY2FzZSBvbiB0aGUgaG9zdC4KKyAgICAgKiBIb3dldmVyLCBrZWVwaW5nIHVudXNlZCBjb2RlIHdpbGwgbWFrZSBDb3Zlcml0eSB1bmhhcHB5ICovCisgICAgaWYgKHVubGlrZWx5KHhpX2ZsYWdzICYgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQpKQorICAgIHsKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTV9TVUJTWVNURU1fSE9TVCAqLworICAgICAgICB2c25wcmludGYobG9nX3F1ZXVlX21zZy0+dS5zdHIsIE1BWF9ERVZfTE9HX1NUUklOR19TSVpFLCAoeGlfZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfRklMRU5BTUVfSU5fRk1UKSA/IGRldl9sb2dfYmFzZW5hbWUoZm10KSA6IGZtdCwgYXJncyk7CisjaWZuZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBpOworICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgICAgIGxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuZm10ID0gZm10OworCisgICAgICAgIG9mZnNldCA9ICgobG9uZylsb2dfcXVldWVfbXNnLT51LmZtdF9hcmdzLmFyZ3MgJSA4ID09IDApID8gMCA6IDE7IC8qIHN0YXJ0IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgREVWX0xPR19NQVhfQVJHUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dfcXVldWVfbXNnLT51LmZtdF9hcmdzLmFyZ3NbaSArIG9mZnNldF0gPSB2YV9hcmcoYXJncywgdm9pZCAqKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiAjaWZuZGVmIEJDTV9TVUJTWVNURU1fSE9TVCAqLworCisgICAgaWYgKGJjbW9zX3NlbV9wb3N0X2lzX2FsbG93ZWQoKSkKKyAgICB7CisgICAgICAgIGVycm9yID0gYmNtb3NfbXNnX3NlbmQoJmRldl9sb2cuc2F2ZV9xdWV1ZSwgbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21vc190aW1lcl9wYXJtIHRpbWVyX3BhcmFtcyA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gImRldl9sb2dfdGltZXIiLAorICAgICAgICAgICAgLmhhbmRsZXIgPSBiY21fZGV2X2xvZ19tc2dfc2VuZF90aW1lcl9jYiwKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoIShkZXZfbG9nX3RpbWVyLmZsYWdzICYgQkNNT1NfVElNRVJfRkxBR19WQUxJRCkpCisgICAgICAgICAgICBiY21vc190aW1lcl9jcmVhdGUoJmRldl9sb2dfdGltZXIsICZ0aW1lcl9wYXJhbXMpOworICAgICAgICAvKiBMaW1pdGF0aW9uOiBXZSBkb24ndCBzZW5kIG1vcmUgdGhhbiAxIGxvZ2dlciBtZXNzYWdlIGV2ZW4gaWYgX2JjbV9kZXZfbG9nX3Zsb2coKSB3YXMgY2FsbGVkIG11bHRpcGxlIHRpbWVycyBpbiBJUlFzIGRpc2FibGVkIG1vZGUgYmVjYXVzZSB3ZSBoYXZlIGEgc2luZ2xlIHRpbWVyLiAqLworICAgICAgICBpZiAoIWJjbW9zX3RpbWVyX2lzX3J1bm5pbmcoJmRldl9sb2dfdGltZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190aW1lcl9oYW5kbGVyX3NldCgmZGV2X2xvZ190aW1lciwgYmNtX2Rldl9sb2dfbXNnX3NlbmRfdGltZXJfY2IsIChsb25nKW1zZyk7CisgICAgICAgICAgICBiY21vc190aW1lcl9zdGFydCgmZGV2X2xvZ190aW1lciwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyb3IgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGlkLT5sb3N0X21zZ19jbnQrKzsKKyAgICB9Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfdmxvZyhkZXZfbG9nX2lkIHhpX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwKKyAgICB1aW50MzJfdCB4aV9mbGFncywKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgdmFfbGlzdCBhcmdzKQoreworICAgIF9iY21fZGV2X2xvZ192bG9nKHhpX2lkLCB4aV9sb2dfbGV2ZWwsIHhpX2ZsYWdzLCAwLCBERVZfTE9HX1JBVEVfTElNSVRfSURfTk9ORSwgZm10LCBhcmdzKTsKK30KKworLyogSU1QT1JUQU5UISEhCisgKiBUaGUgZnVuY3Rpb24gYmNtX2Rldl9sb2dfbG9nKCkgbXVzdCBoYXZlIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyBiZWZvcmUgdGhlICcuLi4nIChzZWUgY29tbWVudHMgb24gaGVhZGVyIGZpbGUpLgorICovCit2b2lkIGJjbV9kZXZfbG9nX2xvZyhkZXZfbG9nX2lkIHhpX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwKKyAgICB1aW50MzJfdCB4aV9mbGFncywKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgYmNtX2Rldl9sb2dfdmxvZyh4aV9pZCwgeGlfbG9nX2xldmVsLCB4aV9mbGFncywgZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfbG9nX3JhdGVsaW1pdChkZXZfbG9nX2lkIHhpX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwKKyAgICB1aW50MzJfdCB4aV9mbGFncywKKyAgICB1aW50MzJfdCByYXRlX3VzLAorICAgIGRldl9sb2dfcmF0ZV9saW1pdF9pZCByYXRlX2xpbWl0X2lkLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICBfYmNtX2Rldl9sb2dfdmxvZyh4aV9pZCwgeGlfbG9nX2xldmVsLCB4aV9mbGFncywgcmF0ZV91cywgcmF0ZV9saW1pdF9pZCwgZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKyNpZmRlZiBCQ01PU19UUkFDRV9JTl9ERVZfTE9HCisKK3N0YXRpYyBkZXZfbG9nX2lkIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbXSA9Cit7CisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX05PTkVdID0gREVWX0xPR19JTlZBTElEX0lELAorICAgIFtCQ01PU19UUkFDRV9MRVZFTF9FUlJPUl0gPSBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX0lORk9dID0gREVWX0xPR19JTlZBTElEX0lELAorICAgIFtCQ01PU19UUkFDRV9MRVZFTF9WRVJCT1NFXSA9IERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUddID0gREVWX0xPR19JTlZBTElEX0lECit9OworCitzdGF0aWMgYmNtX2Rldl9sb2dfbGV2ZWwgYmNtb3NfdHJhY2VfZGV2X2xvZ19sZXZlbFtdID0KK3sKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1JdID0gREVWX0xPR19MRVZFTF9FUlJPUiwKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfSU5GT10gPSBERVZfTE9HX0xFVkVMX0lORk8sCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0VdID0gREVWX0xPR19MRVZFTF9JTkZPLAorICAgIFtCQ01PU19UUkFDRV9MRVZFTF9ERUJVR10gPSBERVZfTE9HX0xFVkVMX0RFQlVHCit9OworCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IERpcmVjdCBiY21vc190cmFjZSgpIG91dHB1dCB0byBsb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiBOT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCh2b2lkKQoreworI2lmZGVmIEJDTU9TX1RSQUNFX0lOX0RFVl9MT0cKKyAgICBiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0VSUk9SXSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJ0cmFjZV9lcnJvciIsCisgICAgICAgIERFVl9MT0dfTEVWRUxfRVJST1IsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0lORk9dID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInRyYWNlX2luZm8iLAorICAgICAgICBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0VdID0gYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtCQ01PU19UUkFDRV9MRVZFTF9JTkZPXTsKKyAgICBiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0RFQlVHXSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJ0cmFjZV9kZWJ1ZyIsCisgICAgICAgIERFVl9MT0dfTEVWRUxfREVCVUcsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBpZiAoYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtCQ01PU19UUkFDRV9MRVZFTF9FUlJPUl0gPT0gREVWX0xPR19JTlZBTElEX0lEIHx8CisgICAgICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfSU5GT10gID09IERFVl9MT0dfSU5WQUxJRF9JRCB8fAorICAgICAgICBiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0RFQlVHXSA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisjZWxzZSAvKiAjaWZkZWYgQkNNT1NfVFJBQ0VfSU5fREVWX0xPRyAqLworICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKK30KKworI2lmZGVmIEJDTU9TX1RSQUNFX0lOX0RFVl9MT0cKKworLyogRGlyZWN0IE9TIHRyYWNlIHRvIGRldl9sb2cgKi8KK3ZvaWQgYmNtb3NfdHJhY2UoYmNtb3NfdHJhY2VfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgaWYgKGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbbGV2ZWxdICE9IERFVl9MT0dfSU5WQUxJRF9JRCAmJiBkZXZfbG9nLnN0YXRlID09IEJDTV9ERVZfTE9HX1NUQVRFX0VOQUJMRUQpCisgICAgeworICAgICAgICBpZiAobGV2ZWwgPT0gQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IpCisgICAgICAgICAgICBiY21fZGV2X2xvZ192bG9nKGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbbGV2ZWxdLCBiY21vc190cmFjZV9kZXZfbG9nX2xldmVsW2xldmVsXSwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsIGZvcm1hdCwgYXJncyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX3Zsb2coYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtsZXZlbF0sIGJjbW9zX3RyYWNlX2Rldl9sb2dfbGV2ZWxbbGV2ZWxdLCAwLCBmb3JtYXQsIGFyZ3MpOworICAgIH0KKworICAgIHZhX2VuZChhcmdzKTsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBFTkFCTEVfTE9HICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWUxNTZlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfX0JDTV9ERVZfTE9HX0hfCisjZGVmaW5lIF9fQkNNX0RFVl9MT0dfSF8KKworI2lmZGVmIEVOQUJMRV9MT0cKKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2suaCIKKyNpZmRlZiBFTkFCTEVfQ0xJCisjaW5jbHVkZSAiYmNtX2Rldl9sb2dfY2xpLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTG9nIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1BQ1JPX0FSR19OKF8xLF8yLF8zLF80LF81LF82LF83LF84LF85LF8xMCxfMTEsXzEyLF8xMyxfMTQsXzE1LF8xNixfMTcsXzE4LF8xOSxfMjAsXzIxLF8yMixfMjMsXzI0LF8yNSxfMjYsXzI3LF8yOCxfMjksXzMwLF8zMSxfMzIsTiwuLi4pIE4KKyNkZWZpbmUgTUFDUk9TX0FSR1NfU0VRVUVOQ0UgMzIsIDMxLCAzMCwgMjksIDI4LCAyNywgMjYsIDI1LCAyNCwgMjMsIDIyLCAyMSwgMjAsIDE5LCAxOCwgMTcsIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwCisjZGVmaW5lIE1BQ1JPX05VTV9BUkdTX0hFTFBFUiguLi4pICAgIE1BQ1JPX0FSR19OKF9fVkFfQVJHU19fKQorI2RlZmluZSBNQUNST19OVU1fQVJHUyguLi4pICAgICBNQUNST19OVU1fQVJHU19IRUxQRVIoX19WQV9BUkdTX18sIE1BQ1JPU19BUkdTX1NFUVVFTkNFKQorCisvKiBJTVBPUlRBTlQhIERPIE5PVCBVU0UgVEhFU0UgTUFDUk9TLCBVU0UgQkNNX0xPRyBPTkxZICEgKi8KKy8qIFRoZXNlIG1hY3JvcyBmb3JjZSBudW1iZXIgb2YgYXJndW1lbnRzIGluIGNvbXBpbGUgdGltZS4gQSBzaW5nbGUgbWFjcm8gZm9yIGVhY2ggbnVtYmVyIG9mIGFyZ3VtZW50cyAoaW5jbHVkaW5nIHRoZSBmb3JtYXQpICovCisjaWZkZWYgX19CQVNFTkFNRV9fCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxKGxldmVsLCBpZCwgZmxhZ3MsIC4uLikgXAorICAgIGJjbV9kZXZfbG9nX2xvZyhpZCwgbGV2ZWwsIGZsYWdzLCBTVFJJTkdJRllfRVhQQU5EKF9fQkFTRU5BTUVfXykgIiAiIFNUUklOR0lGWV9FWFBBTkQoX19MSU5FX18pICJ8ICIgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBfQkNNX0xPR19BUkdTMShsZXZlbCwgaWQsIGZsYWdzLCAuLi4pIFwKKyAgICBiY21fZGV2X2xvZ19sb2coaWQsIGxldmVsLCBmbGFncyB8IEJDTV9MT0dfRkxBR19GSUxFTkFNRV9JTl9GTVQsIF9fRklMRV9fICIgIiBTVFJJTkdJRllfRVhQQU5EKF9fTElORV9fKSAifCAiIF9fVkFfQVJHU19fKQorI2VuZGlmCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MzKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1M0KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1M1KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1M2KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1M3KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1M4KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1M5KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxMCguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTEoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzEyKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxMyguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTQoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzE1KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxNiguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTcoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzE4KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxOSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjAoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzIxKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyMiguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjMoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzI0KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyNSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjYoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzI3KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyOCguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjkoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzMwKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MzMSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzIoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzMzKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MzNCguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzUoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzM2KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MobikgX0JDTV9MT0dfQVJHUyMjbgorI2RlZmluZSBfQkNNX0xPR19FWFBBTkQobiwuLi4pIF9CQ01fTE9HX0FSR1MobikgKF9fVkFfQVJHU19fKQorCisvKgorICogSU1QT1JUQU5UISB5b3Ugc2hvdWxkIHVzZSBvbmx5IHRoaXMgbWFjcm8gZm9yIGxvZ2dpbmcKKyAqCisgKiAxLiBTdXBwb3J0IHByaW50cyB1cCB0byBERVZfTE9HX01BWF9BUkdTIHBhcmFtZXRlcnMgZWFjaCB3aXRoIG1heGltdW0gc2l6ZSBvZiAzMmJpdHMKKyAqIDIuIFN1cHBvcnQgYWxzbyBwcmludHMgb2YgYXJndW1lbnRzIHdpdGggc2l6ZSA2NGJpdHMgYnV0IGVhY2ggb25lIGNvdW50ZWQgYXMgdHdvIGFyZ3VtZW50cyBvZiAzMmJpdHMsCisgKiAgICBzbyB5b3UgY2FuIG9ubHkgcHJpbnQgdXAgdG8gKERFVl9MT0dfTUFYX0FSR1MvMikgYXJndW1lbnRzIG9mIDY0Yml0cy4KKyAqICAgIE1peCBvZiA2NCBhbmQgMzIgYXJlIGFsbG93ZWQgYXMgbG9uZyB5b3UgZG9uJ3QgZXhjZWVkIERFVl9MT0dfTUFYX0FSR1MuCisgKiAzLiBBbnkgcG9zc2libGUgY29tYmluYXRpb24gb2YgbWl4IDMyIGFuZCA2NCBhcmd1bWVudHMgYXJlIGFsbG93ZWQuCisgKi8KKyNkZWZpbmUgQkNNX0xPRyhsZXZlbCwgaWQsIC4uLikgX0JDTV9MT0dfRVhQQU5EKE1BQ1JPX05VTV9BUkdTKF9fVkFfQVJHU19fKSwgREVWX0xPR19MRVZFTF8jI2xldmVsLCBpZCwgMCwgX19WQV9BUkdTX18pCisvKiBTYW1lIGFzIEJDTV9MT0coKSwgYnV0IG92ZXJyaWRlcyBCQ01fTE9HKCkgZGVmYXVsdCBiZWhhdmlvciBieSBsZXR0aW5nIHRoZSBmb3JtYXQgYmUgZG9uZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgY2FsbGVyIHRhc2suIFRoaXMgYWxsb3dzIHVzaW5nIHN0YWNrL2hlYXAgc3RyaW5ncworICogZm9yIGZtdCBhbmQgYXJncy4gU2VlIGNvbW1lbnQgZm9yIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULiAqLworI2RlZmluZSBCQ01fTE9HX0NBTExFUl9GTVQobGV2ZWwsIGlkLCAuLi4pIF9CQ01fTE9HX0VYUEFORChNQUNST19OVU1fQVJHUyhfX1ZBX0FSR1NfXyksIERFVl9MT0dfTEVWRUxfIyNsZXZlbCwgaWQsIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULCBfX1ZBX0FSR1NfXykKKworLyogU2FtZSBhcyBCQ01fTE9HKCksIGJ1dCB0aGUgbGV2ZWwgaXMgbm90IGdpdmVuIGFzIGEgdG9rZW4gZm9yIGNvbmNhdGVuYXRpb24sIGJ1dCBhcyBhIHJlZ3VsYXIgZW51bS4gKi8KKyNkZWZpbmUgQkNNX0xPR19MRVZFTChsZXZlbCwgaWQsIC4uLikgX0JDTV9MT0dfRVhQQU5EKE1BQ1JPX05VTV9BUkdTKF9fVkFfQVJHU19fKSwgbGV2ZWwsIGlkLCAwLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBCQ01fTE9HX0ZMQUdfTk9ORSAwCisjZGVmaW5lIEJDTV9MT0dfRkxBR19OT19IRUFERVIgKDEgPDwgMCkgLyogQXZvaWQgaW5zZXJ0aW5nIGhlYWRlciB0byBlYWNoIG1lc3NhZ2UuICovCisjZGVmaW5lIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UICgxIDw8IDEpIC8qIFRoZSBsb2cgbWVzc2FnZSB3aWxsIGJlIGZvcm1hdHRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgY2FsbGVyIHRhc2ssIG5vdCB0aGUgbG9nZ2VyIHRhc2sgKG92ZXJyaWRlIGRlZmF1bHQgYmVoYXZpb3IpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyBhIHBlbmFsdHkgLSBiY21fZGV2X2xvZ19sb2coKSBiZWNvbWVzIHNsb3dlci4gKi8KKyNkZWZpbmUgQkNNX0xPR19GTEFHX0ZJTEVOQU1FX0lOX0ZNVCAoMSA8PCAyKSAvKiBJbmRpY2F0ZXMgdGhhdCBfX0ZJTEVfXyBpcyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlIGZvcm1hdC4gKi8KKyNkZWZpbmUgQkNNX0xPR19GTEFHX0RPTlRfU0tJUF9QUklOVCAoMSA8PCAzKSAvKiBUaGUgbWVzc2FnZSBzaG91bGQgYWx3YXlzIGJlIHByaW50ZWQgZXZlbiBpZiB0aGUgbXNnIHBvb2wgaXMgbmVhcmx5IGZ1bGwuICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENhbGxiYWNrcyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRnVuY3Rpb25zIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBjaGFyICpkZXZfbG9nX2Jhc2VuYW1lKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19sb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBMb2cgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgIEl0IGlzIGJldHRlciB1c2luZyB0aGUgbWFjcm9zIGFuZCBub3QgdGhlIGZ1bmN0aW9uIGRpcmVjdGx5LiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2lkICAgICAgICAgICAgLSBUaGUgTG9nIElEIHRoaXMgbWVzc2FnZSBpcyBjb25uZWN0ZWQgdG8uICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIChUaGUgSUQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9sb2dfbGV2ZWwgICAgIC0gVGhlIExvZyBsZXZlbCBvZiB0aGlzIG1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2ZsYWdzICAgICAgICAgLSBDYW4gYmUgb25lIG9mIEJDTV9MT0dfRkxBR19YWFggYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0gZm10ICAgICAgICAgICAgICAtIFRoZSBwcmludCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBOb3RlOiAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZm9ybWF0IHRoZSBzdHJpbmcgaW4gdGhlIGxvZ2dlciAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICB0YXNrIGNvbnRleHQsIG5vdCB0aGUgY2FsbGVyIHRhc2sgY29udGV4dCwgdG8gcmVkdWNlIHRoZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmFsdHkgb2YgY2FsbGluZyBiY21fZGV2X2xvZ19sb2coKS4gVGhpcyBtZWFucyAnZm10JyBjYW4gICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgb25seSB0byBzdHJpbmdzIGluIGRhdGEgc2VnbWVudCwgYnV0IG5vdCB0byBoZWFkL3N0YWNrLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3Igd2l0aCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVC4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSBwYXJhbTEgICAgICAgICAgIC0gRm9ybWF0IHBhcmFtZXRlciBOby4gMS4gTGlrZSAnZm10JywgY2FuIHJlc2lkZSBvbmx5IGluIGRhdGEgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LCB1bmxlc3MgY2hvb3NpbmcgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQgICAgICAgICAgICAgICovCisvKiAgIC0gLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSBwYXJhbU4gICAgICAgICAgIC0gRm9ybWF0IHBhcmFtZXRlciBOby4gTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJTVBPUlRBTlQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDEuIFRoZSBmdW5jdGlvbiBiY21fZGV2X2xvZ19sb2coKSBtdXN0IGhhdmUgZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIGJlZm9yZSB0aGUgJy4uLicqLworLyogICAgVGhpcyBjb21lcyBmcm9tIHRoZSA2NGJpdHMgbGltaXRhdGlvbiB0aGF0IG11c3QgYmUgYWxpZ24gdG8gOGJ5dGVzIGluIHNvbWUgICAgICAgICovCisvKiAgICBwbGF0Zm9ybXMgd2hvIGRvZXNuJ3Qgc3VwcG9ydCB1bmFsaWduZWQgYWNjZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIG9uIHhwb25zdyAoeDg2KSBpdCBkb2Vzbid0IG1hdHRlciBidXQgb24gZGV2aWNlIChhcm0pIHlvdSBtdXN0IGhhdmUgdGhhdC4gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbG9nKGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChfX3ByaW50Zl9fLCA0LCA1KSkpOyAvKiBjb21waWxlciBhdHRyaWJ1dGUgdG8gY2hlY2sgYXMgcHJpbnRmIHN0eWxlIGZvciBhcmd1bWVudHMgNCAoZm10KSBhbmQgNSAoYWxsIG90aGVyKSAqLworCit2b2lkIGJjbV9kZXZfbG9nX3Zsb2coZGV2X2xvZ19pZCB4aV9pZCwKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsCisgICAgdWludDMyX3QgeGlfZmxhZ3MsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIHZhX2xpc3QgYXJncyk7CisKK3R5cGVkZWYgZW51bQoreworICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9OT05FLAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfREJBX0JEX0FERF9BTExPQ19GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfUlRfQUREX0FMTE9DX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9SVF9BRERfQUNDRVNTX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX1FXX0NCUl9SVF9BRERfQUNDRVNTX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9OUlRfQUREX0FMTE9DX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9DT01QRU5TQVRJT05fQUREX0FDQ0VTU19GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfTk9fQ09NUEVOU0FUSU9OX0FERF9BQ0NFU1NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX0NPUFlfQ09NUEVOU0FUSU9OX0FERF9BQ0NFU1NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX1JUX1NBVkVfQUNDRVNTX0ZPUl9DT01QRU5TQVRJT05fRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX05SVF9TQVZFX0FDQ0VTU19GT1JfQ09NUEVOU0FUSU9OX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9GTFVTSF9GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX19OVU1fT0YsCit9IGRldl9sb2dfcmF0ZV9saW1pdF9pZDsKKwordm9pZCBiY21fZGV2X2xvZ19sb2dfcmF0ZWxpbWl0KGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIHVpbnQzMl90IHJhdGVfdXMsCisgICAgZGV2X2xvZ19yYXRlX2xpbWl0X2lkIHJhdGVfbGltaXRfaWQsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KF9fcHJpbnRmX18sIDYsIDcpKSk7IC8qIGNvbXBpbGVyIGF0dHJpYnV0ZSB0byBjaGVjayBhcyBwcmludGYgc3R5bGUgZm9yIGFyZ3VtZW50cyA2IChmbXQpIGFuZCA3IChhbGwgb3RoZXIpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX29zX3RyYWNlX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBEaXJlY3QgYmNtb3NfdHJhY2UoKSBvdXRwdXQgdG8gbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX29zX3RyYWNlX2luaXQodm9pZCk7CisKKyNlbHNlIC8qICNpZm5kZWYgRU5BQkxFX0xPRyAqLworCisjZGVmaW5lIEJDTV9MT0cobGV2ZWwsIGlkLCAuLi4pCisjZGVmaW5lIEJDTV9MT0dfQ0FMTEVSX0ZNVChsZXZlbCwgaWQsIC4uLikKKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KKworI2VuZGlmIC8qIF9fQkNNX0RFVl9MT0dfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmZmI1OQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX2NsaS5jCkBAIC0wLDAgKzEsNjg0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZ190YXNrX2ludGVybmFsLmg+CisKKy8qIFdlIGRvbid0IHN1cHBvcnQgZGV2X2xvZyBDTEkgaW4gbGludXgga2VybmVsIHNwYWNlICovCisjaWZuZGVmIF9fS0VSTkVMX18KKworLyogRGV2IGxvZyBDTEkgc2Vzc2lvbiBzdXBwb3J0cyByZWNlaXZpbmcgbG9uZyBsaW5lcyAtIHdlIHNoYWxsIHNpbXBseSBzcGxpdCB0aGVtIGludG8gc2hvcnRlciBsb2cgbWVzc2FnZXMuICovCisjZGVmaW5lIERFVl9MT0dfQ0xJX1NFU1NJT05fTUFYX01TR19TSVpFIChNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUgKiAxMCkKKworZW51bQoreworICAgIElEX0JZX0lOREVYLAorICAgIElEX0JZX05BTUUsCit9OworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZmlsZV9wcmludCh1aW50MzJfdCBmaWxlX2luZGV4LCBpbnQzMl90IHhpX21zZ3NfbnVtLCBiY21fZGV2X2xvZ19wcmludF9jYiB4aV9wcmludF9jYWxsYmFjaywgdm9pZCAqYXJnLCBiY21vc19ib29sIGNsZWFyKQoreworICAgIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGU7CisgICAgY2hhciBsb2dfc3RyaW5nW01BWF9ERVZfTE9HX1NUUklOR19TSVpFXTsKKyAgICBpbnQgbGVuZ3RoOworICAgIHVpbnQzMl90IG51bV9tc2dzOworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgZmlsZSA9IGJjbV9kZXZfbG9nX2ZpbGVfZ2V0KGZpbGVfaW5kZXgpOworICAgIGlmICghZmlsZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIG51bV9tc2dzID0gYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9tZXNzYWdlcyhmaWxlKTsKKyAgICBpZiAoeGlfbXNnc19udW0gJiYgeGlfbXNnc19udW0gPCBudW1fbXNncykKKyAgICAgICAgbnVtX21zZ3MgPSB4aV9tc2dzX251bTsKKworICAgIERFVl9MT0dfSU5GT19QUklOVEYoImZpbGU9JXAsIHByaW50ICVkIG1zZ3MgZnJvbSBmaWxlIChvcmlnOiAlZClcbiIsICh2b2lkICopZmlsZSwgKGludCludW1fbXNncywgKGludCl4aV9tc2dzX251bSk7CisKKyAgICAvKiBQcmludCBmaWxlICovCisgICAgZm9yIChpID0gMDsgKGkgPCB4aV9tc2dzX251bSkgfHwgIXhpX21zZ3NfbnVtOyBpKyspCisgICAgeworICAgICAgICAvKiBSZWFkIGZyb20gZmlsZSAqLworICAgICAgICBsZW5ndGggPSBiY21fZGV2X2xvZ19maWxlX3JlYWQoZmlsZSwgJm9mZnNldCwgbG9nX3N0cmluZywgc2l6ZW9mKGxvZ19zdHJpbmcpKTsKKyAgICAgICAgaWYgKCFsZW5ndGgpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgeGlfcHJpbnRfY2FsbGJhY2soYXJnLCBsb2dfc3RyaW5nKTsKKyAgICB9CisKKyAgICBpZiAoY2xlYXIgPT0gQkNNT1NfVFJVRSkKKyAgICAgICAgZXJyID0gYmNtX2Rldl9sb2dfZmlsZV9jbGVhcihmaWxlKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXZfbG9nX3N0cl9zdHlsZShiY21fZGV2X2xvZ19zdHlsZSBzdHlsZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1tdID0KKyAgICB7CisgICAgICAgIFtCQ01fREVWX0xPR19TVFlMRV9OT1JNQUxdID0gIk5PUk1BTCIsCisgICAgICAgIFtCQ01fREVWX0xPR19TVFlMRV9CT0xEXSA9ICJCT0xEIiwKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX1VOREVSTElORV0gPSAiVU5ERVJMSU5FIiwKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX0JMSU5LXSA9ICJCTElOSyIsCisgICAgICAgIFtCQ01fREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPXSA9ICJSRVZFUlNFX1ZJREVPIiwKKyAgICB9OworICAgIHJldHVybiBzdHJpbmdzW3N0eWxlID4gQkNNX0RFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyA/IEJDTV9ERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU8gOiBzdHlsZV07Cit9CisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorc3RhdGljIHZvaWQgYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb25fcHJpbnRfZmVhdHVyZXMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnRhYnMsIGNvbnN0IGRldl9sb2dfaWRfcGFybSAqaWRfcGFybSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAiJXN0aHJvdHRsZSA6IGxldmVsID0gJWMsIHRocmVzaG9sZCA9ICUtNXVcbiIsCisgICAgICAgIHRhYnMsCisgICAgICAgIGxvZ19sZXZlbF9zdHJbaWRfcGFybS0+dGhyb3R0bGVfbG9nX2xldmVsXSwKKyAgICAgICAgaWRfcGFybS0+dGhyb3R0bGUudGhyZXNob2xkKTsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICIlc3RyaWdnZXIgOiBsZXZlbCA9ICVjLCBzdGFydCA9ICUtNXUsIHN0b3AgPSAlLTV1LCByZXBlYXQgPSAlLTV1XG4iLAorICAgICAgICB0YWJzLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW2lkX3Bhcm0tPnRyaWdnZXJfbG9nX2xldmVsXSwKKyAgICAgICAgaWRfcGFybS0+dHJpZ2dlci5zdGFydF90aHJlc2hvbGQsCisgICAgICAgIGlkX3Bhcm0tPnRyaWdnZXIuc3RvcF90aHJlc2hvbGQsCisgICAgICAgIGlkX3Bhcm0tPnRyaWdnZXIucmVwZWF0X3RocmVzaG9sZCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb25fcHJpbnRfaWRfcGFybShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqdGFicywgY29uc3QgZGV2X2xvZ19pZF9wYXJtICppZF9wYXJtKQoreworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICJuYW1lPSUxNnMsIGxvZ190eXBlPSV1LCBkZWZhdWx0X2xvZ190eXBlPSV1LCBsb2dfbGV2ZWxfcHJpbnQ9JWMgKCV1KSwgbG9nX2xldmVsX3NhdmU9JWMgKCV1KSwgZGVmYXVsdF9sb2dfbGV2ZWw9JWMgKCV1KSwgc3R5bGU9JXMgKCV1KSwgbG9zdF9tc2dfY250PSV1LCBwcmludF9za2lwcGVkX2NvdW50PSV1XG4iLAorICAgICAgICBpZF9wYXJtLT5uYW1lLAorICAgICAgICBpZF9wYXJtLT5sb2dfdHlwZSwKKyAgICAgICAgaWRfcGFybS0+ZGVmYXVsdF9sb2dfdHlwZSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltpZF9wYXJtLT5sb2dfbGV2ZWxfcHJpbnRdLAorICAgICAgICBpZF9wYXJtLT5sb2dfbGV2ZWxfcHJpbnQsCisgICAgICAgIGxvZ19sZXZlbF9zdHJbaWRfcGFybS0+bG9nX2xldmVsX3NhdmVdLAorICAgICAgICBpZF9wYXJtLT5sb2dfbGV2ZWxfc2F2ZSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltpZF9wYXJtLT5kZWZhdWx0X2xvZ19sZXZlbF0sCisgICAgICAgIGlkX3Bhcm0tPmRlZmF1bHRfbG9nX2xldmVsLAorICAgICAgICBkZXZfbG9nX3N0cl9zdHlsZShpZF9wYXJtLT5zdHlsZSksCisgICAgICAgIGlkX3Bhcm0tPnN0eWxlLAorICAgICAgICBpZF9wYXJtLT5sb3N0X21zZ19jbnQsCisgICAgICAgIGlkX3Bhcm0tPnByaW50X3NraXBwZWRfY291bnQpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICIlc2NvdW50ZXJzICAgICAgICAgID0geyVjICUtNXUsJWMgJS01dSwlYyAlLTV1LCVjICUtNXUsJWMgJS01dSwlYyAlLTV1fVxuIiwKKyAgICAgICAgdGFicywKKyAgICAgICAgbG9nX2xldmVsX3N0cltERVZfTE9HX0xFVkVMX05PX0xPR10sCisgICAgICAgIGlkX3Bhcm0tPmNvdW50ZXJzW0RFVl9MT0dfTEVWRUxfTk9fTE9HXSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltERVZfTE9HX0xFVkVMX0ZBVEFMXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9GQVRBTF0sCisgICAgICAgIGxvZ19sZXZlbF9zdHJbREVWX0xPR19MRVZFTF9FUlJPUl0sCisgICAgICAgIGlkX3Bhcm0tPmNvdW50ZXJzW0RFVl9MT0dfTEVWRUxfRVJST1JdLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW0RFVl9MT0dfTEVWRUxfV0FSTklOR10sCisgICAgICAgIGlkX3Bhcm0tPmNvdW50ZXJzW0RFVl9MT0dfTEVWRUxfV0FSTklOR10sCisgICAgICAgIGxvZ19sZXZlbF9zdHJbREVWX0xPR19MRVZFTF9JTkZPXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9JTkZPXSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltERVZfTE9HX0xFVkVMX0RFQlVHXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9ERUJVR10pOworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9wcmludF9mZWF0dXJlcyhzZXNzaW9uLCB0YWJzLCBpZF9wYXJtKTsKKyNlbmRpZgorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX3ByaW50X2Rldl9sb2coCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHVpbnQzMl90IGk7CisgICAgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBERVZfTE9HX01BWF9GSUxFUzsgaSsrKQorICAgIHsKKyAgICAgICAgZmlsZSA9IGJjbV9kZXZfbG9nX2ZpbGVfZ2V0KGkpOworICAgICAgICBpZiAoIWZpbGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICAiZmlsZVsldV06XG4iLCBpKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAibWF4X21zZ3MgPSAldVxuIiwgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9tZXNzYWdlcyhmaWxlKSk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgImZpbGVfcGFybTpcbiIpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIzICJzdGFydF9hZGRyID0gJXBcbiIsIGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLnN0YXJ0X2FkZHIpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIzICJzaXplICAgICAgID0gJXVcbiIsIGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLnNpemUpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIzICJyZWFkX2NiICAgID0gJXBcbiIsICh2b2lkICopZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0ucmVhZF9jYik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgIndyaXRlX2NiICAgPSAlcFxuIiwgKHZvaWQgKilkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS53cml0ZV9jYik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgImZsYWdzICAgICAgPSAleFxuIiwgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0uZmxhZ3MpOworICAgIH0KKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgInN0YXRlICAgICA9ICV1XG4iLCBkZXZfbG9nLnN0YXRlKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgIm1zZ19jb3VudCA9ICV1XG4iLCBkZXZfbG9nLm1zZ19jb3VudCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJzYXZlX3F1ZXVlOlxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiaXNfd2FpdGluZyAgPSAldVxuIiwgZGV2X2xvZy5zYXZlX3F1ZXVlLmlzX3dhaXRpbmcpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQiAicHJpbnRfcXVldWU6XG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJpc193YWl0aW5nICA9ICV1XG4iLCBkZXZfbG9nLnByaW50X3F1ZXVlLmlzX3dhaXRpbmcpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQiAic2F2ZV90YXNrOlxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiYWN0aXZlX21vZHVsZXMgID0gJXVcbiIsIGRldl9sb2cuc2F2ZV90YXNrLmFjdGl2ZV9tb2R1bGVzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJjdXJyZW50X21vZHVsZSAgPSAldVxuIiwgZGV2X2xvZy5zYXZlX3Rhc2suY3VycmVudF9tb2R1bGUpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQiAicHJpbnRfdGFzazpcbiIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgImFjdGl2ZV9tb2R1bGVzICA9ICV1XG4iLCBkZXZfbG9nLnByaW50X3Rhc2suYWN0aXZlX21vZHVsZXMpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgImN1cnJlbnRfbW9kdWxlICA9ICV1XG4iLCBkZXZfbG9nLnByaW50X3Rhc2suY3VycmVudF9tb2R1bGUpOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJudW1faWRzID0gJXVcbiIsIGRldl9sb2cubnVtX2lkcyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICAiaWRzW106XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGV2X2xvZy5udW1faWRzOyBpKyspCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICAiaWRzWyUydV06ICIsIGkpOworICAgICAgICBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9wcmludF9pZF9wYXJtKHNlc3Npb24sIFRBQjMsICZkZXZfbG9nLmlkc1tpXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGxvZ19uYW1lX3RhYmxlX2luZGV4OyBpKyspCisgICAgeworICAgICAgICBpZiAobG9nc19uYW1lc1tpXS5maXJzdF9pbnN0YW5jZSA9PSBMT0dfTkFNRV9OT19JTlNUQU5DRSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAgIiVzXG4iLCBsb2dzX25hbWVzW2ldLm5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAgIiVzICVkIC0gJWRcbiIsIGxvZ3NfbmFtZXNbaV0ubmFtZSwgbG9nc19uYW1lc1tpXS5maXJzdF9pbnN0YW5jZSwgbG9nc19uYW1lc1tpXS5sYXN0X2luc3RhbmNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2xvZ2dlcl9jb250cm9sKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbV9kZXZfbG9nX3NldF9jb250cm9sKHBhcm1bMF0udmFsdWUudW51bWJlciAhPSAwKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9maWxlX3ByaW50KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHJldHVybiBiY21fZGV2X2xvZ19maWxlX3ByaW50KAorICAgICAgICBwYXJtWzBdLnZhbHVlLnVudW1iZXIsCisgICAgICAgIDAsCisgICAgICAgIChiY21fZGV2X2xvZ19wcmludF9jYiliY21jbGlfc2Vzc2lvbl9wcmludCwKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgKGJjbW9zX2Jvb2wpcGFybVsxXS52YWx1ZS51bnVtYmVyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9maWxlX2NsZWFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUgPSBiY21fZGV2X2xvZ19maWxlX2dldChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmICghZmlsZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfZmlsZV9jbGVhcihmaWxlKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9maWxlX3NldF9mbGFncyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nLmZpbGVzW3Bhcm1bMF0udmFsdWUudW51bWJlcl0uZmlsZV9wYXJtLmZsYWdzIHw9IChiY21fZGV2X2xvZ19maWxlX2ZsYWdzKXBhcm1bMV0udmFsdWUudW51bWJlcjsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9maWxlX3Jlc2V0X2ZsYWdzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2cuZmlsZXNbcGFybVswXS52YWx1ZS51bnVtYmVyXS5maWxlX3Bhcm0uZmxhZ3MgPSAwOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2lkX2dldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworICAgIGRldl9sb2dfaWRfcGFybSBpZF9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlkID0gcGFybVswXS52YWx1ZS51bnVtYmVyID09IElEX0JZX0lOREVYID8gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMV0udmFsdWUudW51bWJlcikgOgorICAgICAgICBiY21fZGV2X2xvZ19pZF9nZXRfYnlfbmFtZShwYXJtWzFdLnZhbHVlLnN0cmluZyk7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICBlcnIgPSBiY21fZGV2X2xvZ19pZF9nZXQoaWQsICZpZF9wYXJtKTsKKyAgICBpZiAoZXJyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yOiBjYW4gZ2V0IGlkIChlcnI6ICVkKVxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9wcmludF9pZF9wYXJtKHNlc3Npb24sIFRBQiwgJmlkX3Bhcm0pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfc2V0X3R5cGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X3R5cGUoaWQsIChiY21fZGV2X2xvZ19pZF90eXBlKXBhcm1bMV0udmFsdWUudW51bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfc2V0X2xldmVsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbCgKKyAgICAgICAgaWQsCisgICAgICAgIChiY21fZGV2X2xvZ19sZXZlbClwYXJtWzFdLnZhbHVlLnVudW1iZXIsCisgICAgICAgIChiY21fZGV2X2xvZ19sZXZlbClwYXJtWzJdLnZhbHVlLnVudW1iZXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX25hbWVfc2V0X2xldmVsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKHBhcm1bMF0udmFsdWUuc3RyaW5nKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorCisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbCgKKyAgICAgICAgaWQsCisgICAgICAgIChiY21fZGV2X2xvZ19sZXZlbClwYXJtWzFdLnZhbHVlLnVudW1iZXIsCisgICAgICAgIChiY21fZGV2X2xvZ19sZXZlbClwYXJtWzJdLnZhbHVlLnVudW1iZXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2lkX3NldF90b19kZWZhdWx0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdChpZCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfc2V0X3N0eWxlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisgICAgYmNtX2Rldl9sb2dfc3R5bGUgc3R5bGU7CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRleCIpLT52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICBzdHlsZSA9IChiY21fZGV2X2xvZ19zdHlsZSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdHlsZSIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2lkX3NldF9zdHlsZShpZCwgc3R5bGUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2lkX2NsZWFyX2NvdW50ZXJzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2lkX2NsZWFyX2NvdW50ZXJzKGlkKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9sb2coYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWw7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNtZF9wYXJtOworCisgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVswXS52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIGlmICgoY21kX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb3VudCIpKSkKKyAgICB7CisgICAgICAgIGNvdW50ID0gY21kX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIGlmICghY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxvZ19sZXZlbCA9IChiY21fZGV2X2xvZ19sZXZlbClwYXJtWzFdLnZhbHVlLnVudW1iZXI7CisgICAgc3RyaW5nID0gcGFybVsyXS52YWx1ZS5zdHJpbmc7CisKKyAgICB3aGlsZSAoY291bnQtLSkKKyAgICB7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyhpZCwgbG9nX2xldmVsLCBCQ01fTE9HX0ZMQUdfTk9ORSwgIiU1dXwgTWVzc2FnZTogJXNcbiIsIGNvdW50LCBzdHJpbmcpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2luc3RhbmNlX2VuYWJsZSgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBzdGF0aWMgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICBiY21vc19ib29sIGVuYWJsZSA9IChiY21vc19ib29sKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IGluc3QgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnN0YW5jZSIpLT52YWx1ZS51bnVtYmVyOworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxvZ19uYW1lX3RhYmxlX2luZGV4OyBpKyspCisgICAgeworICAgICAgICBpZiAobG9nc19uYW1lc1tpXS5maXJzdF9pbnN0YW5jZSAhPSBMT0dfTkFNRV9OT19JTlNUQU5DRSAmJgorICAgICAgICAgICAgaW5zdCA+PSBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlICYmCisgICAgICAgICAgICBpbnN0IDw9IGxvZ3NfbmFtZXNbaV0ubGFzdF9pbnN0YW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSksICIlcyV1IiwgbG9nc19uYW1lc1tpXS5uYW1lLCBpbnN0KTsKKyAgICAgICAgICAgIGxvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKGxvZ19uYW1lKTsKKyAgICAgICAgICAgIGlmIChsb2dfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJFcnJvcjogbG9nIElEIG5vdCBmb3VuZDogJXNcbiIsIGxvZ19uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGJjbV9kZXZfbG9nX2lkX3NldF90eXBlKGxvZ19pZCwgZW5hYmxlID8gREVWX0xPR19JRF9UWVBFX0JPVEggOiBERVZfTE9HX0lEX1RZUEVfTk9ORSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yIHNldHRpbmcgbG9nIHR5cGU6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkxvZyAnJXMnICVzXG4iLCBsb2dfbmFtZSwgZW5hYmxlID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfdGhyb3R0bGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfc2V0X3Rocm90dGxlKGlkLCBwYXJtWzFdLnZhbHVlLnVudW1iZXIsIHBhcm1bMl0udmFsdWUudW51bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfdHJpZ2dlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworICAgIGludDMyX3QgcmVwZWF0ID0gMDsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNtZF9wYXJtOworCisgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVswXS52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIGlmICgoY21kX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXBlYXQiKSkpCisgICAgICAgIHJlcGVhdCA9IGNtZF9wYXJtLT52YWx1ZS5udW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfc2V0X3RyaWdnZXIoaWQsIHBhcm1bMV0udmFsdWUudW51bWJlciwgcGFybVsyXS52YWx1ZS51bnVtYmVyLCBwYXJtWzNdLnZhbHVlLnVudW1iZXIsIHJlcGVhdCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfZ2V0X2ZlYXR1cmVzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisgICAgZGV2X2xvZ19pZF9wYXJtIGlkX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVswXS52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIGVyciA9IGJjbV9kZXZfbG9nX2lkX2dldChpZCwgJmlkX3Bhcm0pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3I6IGNhbiBnZXQgaWQgKGVycjogJWQpXG4iLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX3ByaW50X2ZlYXR1cmVzKHNlc3Npb24sIFRBQiwgJmlkX3Bhcm0pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkZXZfbG9nX2NsaV9zZXNzaW9uX3dyaXRlX2NiKGJjbWNsaV9zZXNzaW9uICpjbGlfc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uICpzZXNzaW9uID0gYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KGNsaV9zZXNzaW9uKTsKKyAgICBjaGFyIHRtcF9zdHJbREVWX0xPR19DTElfU0VTU0lPTl9NQVhfTVNHX1NJWkVdID0ge307CisgICAgY2hhciAqcDsKKyAgICB1aW50MzJfdCB0bXBfc3RyX2xlbjsKKworICAgIHN0cm5jcHkodG1wX3N0ciwgYnVmLCBzaXplb2YodG1wX3N0cikgLSAxKTsgLyogbGVhdmUgcm9vbSBmb3IgdGhlIHRlcm1pbmF0b3IgKi8KKworICAgIHAgPSB0bXBfc3RyOworICAgIHRtcF9zdHJfbGVuID0gc3RybGVuKHRtcF9zdHIpOworICAgIHdoaWxlICh0bXBfc3RyX2xlbiA+IHNlc3Npb24tPmZyZWVfbGVuKQorICAgIHsKKyAgICAgICAgLyogTm90IGVub3VnaCBzcGFjZSBpbiAnc3RyJyBmb3IgY29uY2F0ZW5hdGluZyB3aGF0J3MgaW4gJ3AnIC0+IHNwbGl0IGl0LiAqLworICAgICAgICBzdHJuY2F0KHNlc3Npb24tPnN0ciwgcCwgc2Vzc2lvbi0+ZnJlZV9sZW4pOworICAgICAgICBiY21fZGV2X2xvZ19sb2coCisgICAgICAgICAgICBzZXNzaW9uLT5sb2dfaWQsIHNlc3Npb24tPmxvZ19sZXZlbCwgQkNNX0xPR19GTEFHX05PX0hFQURFUiB8IEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULCAiJXMiLCBzZXNzaW9uLT5zdHIpOworICAgICAgICAqc2Vzc2lvbi0+c3RyID0gJ1wwJzsKKyAgICAgICAgcCArPSBzZXNzaW9uLT5mcmVlX2xlbjsKKyAgICAgICAgdG1wX3N0cl9sZW4gLT0gc2Vzc2lvbi0+ZnJlZV9sZW47CisgICAgICAgIHNlc3Npb24tPmZyZWVfbGVuID0gTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFIC0gMTsKKyAgICB9CisKKyAgICAvKiBFbm91Z2ggc3BhY2UgaW4gJ3N0cicgZm9yIGNvbmNhdGVuYXRpbmcgd2hhdCdzIGluICdwJy4gKi8KKyAgICBzdHJuY2F0KHNlc3Npb24tPnN0ciwgcCwgdG1wX3N0cl9sZW4pOworICAgIHNlc3Npb24tPmZyZWVfbGVuIC09IHRtcF9zdHJfbGVuOworCisgICAgLyogSWYgdGhlIG1lc3NhZ2UgaXMgbm90IHRlcm1pbmF0ZWQgYnkgJ1xuJywgZG8gbm90IHN1Ym1pdCB0aGUgbWVzc2FnZSB0byBsb2dnZXIgeWV0CisgICAgICogKHJhdGhlciBzYXZlIGl0LCB3YWl0aW5nIGZvciBhIGxhdGVyIG1lc3NhZ2Ugd2l0aCAnXG4nKS4gKi8KKyAgICBpZiAoc2Vzc2lvbi0+c3RyW3N0cmxlbihzZXNzaW9uLT5zdHIpIC0gMV0gPT0gJ1xuJykKKyAgICB7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgICAgIHNlc3Npb24tPmxvZ19pZCwgc2Vzc2lvbi0+bG9nX2xldmVsLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSIHwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsICIlcyIsIHNlc3Npb24tPnN0cik7CisgICAgICAgICpzZXNzaW9uLT5zdHIgPSAnXDAnOworICAgICAgICBzZXNzaW9uLT5mcmVlX2xlbiA9IE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAtIDE7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX2NyZWF0ZSgKKyAgICBkZXZfbG9nX2lkIGxvZ19pZCwKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWwsCisgICAgYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb24gKipzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFyYW1zID0geyAud3JpdGUgPSBkZXZfbG9nX2NsaV9zZXNzaW9uX3dyaXRlX2NiIH07CisKKyAgICAqc2Vzc2lvbiA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb24pKTsKKyAgICBpZiAoKnNlc3Npb24gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIHNlc3Npb25fcGFyYW1zLnVzZXJfcHJpdiA9ICpzZXNzaW9uOworICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3Npb25fcGFyYW1zLCAmKCgqc2Vzc2lvbiktPnNlc3Npb24pKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc19mcmVlKCpzZXNzaW9uKTsKKyAgICAgICAgKnNlc3Npb24gPSBOVUxMOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICgqc2Vzc2lvbiktPmxvZ19pZCA9IGxvZ19pZDsKKyAgICAoKnNlc3Npb24pLT5sb2dfbGV2ZWwgPSBsb2dfbGV2ZWw7CisgICAgKCpzZXNzaW9uKS0+ZnJlZV9sZW4gPSBNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUgLSAxOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21jbGlfZW50cnkgKmJjbV9kZXZfbG9nX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqcm9vdF9kaXIpCit7CisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBlbnVtX3RhYmxlX2xvZ19sZXZlbFtdID0KKyAgICB7CisgICAgICAgIHsgLm5hbWUgPSAiTk9fTE9HIiwgLnZhbCA9IChsb25nKURFVl9MT0dfTEVWRUxfTk9fTE9HIH0sCisgICAgICAgIHsgLm5hbWUgPSAiRkFUQUwiLCAudmFsID0gKGxvbmcpREVWX0xPR19MRVZFTF9GQVRBTCB9LAorICAgICAgICB7IC5uYW1lID0gIkVSUk9SIiwgLnZhbCA9IChsb25nKURFVl9MT0dfTEVWRUxfRVJST1IgfSwKKyAgICAgICAgeyAubmFtZSA9ICJXQVJOSU5HIiwgLnZhbCA9IChsb25nKURFVl9MT0dfTEVWRUxfV0FSTklOR30sCisgICAgICAgIHsgLm5hbWUgPSAiSU5GTyIsIC52YWwgPSAobG9uZylERVZfTE9HX0xFVkVMX0lORk8gfSwKKyAgICAgICAgeyAubmFtZSA9ICJERUJVRyIsIC52YWwgPSAobG9uZylERVZfTE9HX0xFVkVMX0RFQlVHIH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgaWYgKChkaXIgPSBiY21jbGlfZGlyX2ZpbmQoTlVMTCwgImxvZ2dlciIpKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZGlyOworCisgICAgZGlyID0gYmNtY2xpX2Rpcl9hZGQocm9vdF9kaXIsICJsb2dnZXIiLCAiRGV2IExvZyIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworCisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgInByaW50X2Rldl9sb2ciLCAiUHJpbnQgRGV2IGxvZyIsIGJjbV9kZXZfbG9nX2NsaV9wcmludF9kZXZfbG9nKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAibG9nZ2VyX2NvbnRyb2wiLCAiTG9nZ2VyIENvbnRyb2wiLCBiY21fZGV2X2xvZ19jbGlfbG9nZ2VyX2NvbnRyb2wsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJlbmFibGUiLCAiZW5hYmxlIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDAsIDAsIDEpKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiZmlsZV9wcmludCIsICJQcmludCBsb2dnZXIgZmlsZSIsIGJjbV9kZXZfbG9nX2NsaV9maWxlX3ByaW50LAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJjbGVhciIsICJjbGVhciIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwLCAwLCAxKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImZpbGVfY2xlYXIiLCAiQ2xlYXIgZmlsZSIsIGJjbV9kZXZfbG9nX2NsaV9maWxlX2NsZWFyLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW51bV90YWJsZV9maWxlX2ZsYWdzW10gPQorICAgICAgICB7CisgICAgICAgICAgICB7IC5uYW1lID0gIlZBTElEIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJXUkFQX0FST1VORCIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19GSUxFX0ZMQUdfV1JBUF9BUk9VTkQgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiU1RPUF9XSEVOX0ZVTEwiLCAudmFsID0gKGxvbmcpQkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMIH0sCisgICAgICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgICAgIH07CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJmaWxlX3NldF9mbGFncyIsICJTZXQgZmlsZSBmbGFncyIsIGJjbV9kZXZfbG9nX2NsaV9maWxlX3NldF9mbGFncywKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDAsIDAsIERFVl9MT0dfTUFYX0ZJTEVTLTEpLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJmbGFncyIsICJmbGFncyIsIGVudW1fdGFibGVfZmlsZV9mbGFncywgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJmaWxlX3Jlc2V0X2ZsYWdzIiwgIlJlc2V0IGZpbGUgZmxhZ3MiLCBiY21fZGV2X2xvZ19jbGlfZmlsZV9yZXNldF9mbGFncywKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDAsIDAsIERFVl9MT0dfTUFYX0ZJTEVTLTEpKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGF0aWMgYmNtY2xpX2NtZF9wYXJtIHNldDFbXT0KKyAgICAgICAgeworICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfUEFSTV9MSVNUX1RFUk1JTkFUT1IKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9jbWRfcGFybSBzZXQyW10gPQorICAgICAgICB7CisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJuYW1lIiwgIm5hbWUiLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTElTVF9URVJNSU5BVE9SCisgICAgICAgIH07CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgc2VsZWN0b3JfdGFibGVbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiYnlfaW5kZXgiLCAudmFsID0gSURfQllfSU5ERVgsIC5wYXJtcyA9IHNldDEgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiYnlfbmFtZSIsIC52YWwgPSBJRF9CWV9OQU1FLCAucGFybXMgPSBzZXQyIH0sCisgICAgICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgICAgIH07CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9nZXQiLCAiaWRfZ2V0IiwgYmNtX2Rldl9sb2dfY2xpX2lkX2dldCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fU0VMRUNUT1IoImJ5IiwgImJ5Iiwgc2VsZWN0b3JfdGFibGUsIDApKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGVudW1fdGFibGVbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSAobG9uZylERVZfTE9HX0lEX1RZUEVfTk9ORSB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJwcmludCIsIC52YWwgPSAobG9uZylERVZfTE9HX0lEX1RZUEVfUFJJTlQgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAic2F2ZSIsIC52YWwgPSAobG9uZylERVZfTE9HX0lEX1RZUEVfU0FWRSB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJib3RoIiwgLnZhbCA9IChsb25nKURFVl9MT0dfSURfVFlQRV9CT1RIIH0sCisgICAgICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgICAgIH07CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfdHlwZSIsICJpZF9zZXRfdHlwZSIsIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfdHlwZSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfdHlwZSIsICJsb2dfdHlwZSIsIGVudW1fdGFibGUsIDApKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaWRfc2V0X2xldmVsIiwgImlkX3NldF9sZXZlbCIsIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfbGV2ZWwsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgibG9nX2xldmVsX3ByaW50IiwgImxvZ19sZXZlbCIsIGVudW1fdGFibGVfbG9nX2xldmVsLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgibG9nX2xldmVsX3NhdmUiLCAibG9nX2xldmVsIiwgZW51bV90YWJsZV9sb2dfbGV2ZWwsIDApKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAibmFtZV9zZXRfbGV2ZWwiLCAibmFtZV9zZXRfbGV2ZWwiLCBiY21fZGV2X2xvZ19jbGlfbmFtZV9zZXRfbGV2ZWwsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJuYW1lIiwgIm5hbWUiLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfcHJpbnQiLCAibG9nX2xldmVsIiwgZW51bV90YWJsZV9sb2dfbGV2ZWwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfc2F2ZSIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfdG9fZGVmYXVsdCIsICJpZF9zZXRfdG9fZGVmYXVsdCIsIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfdG9fZGVmYXVsdCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGVudW1fdGFibGVfbG9nX3N0eWxlW10gPQorICAgICAgICB7CisgICAgICAgICAgICB7IC5uYW1lID0gIm5vcm1hbCIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19TVFlMRV9OT1JNQUwgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiYm9sZCIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19TVFlMRV9CT0xEIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gInVuZGVybGluZSIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19TVFlMRV9VTkRFUkxJTkUgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiYmxpbmsiLCAudmFsID0gKGxvbmcpQkNNX0RFVl9MT0dfU1RZTEVfQkxJTksgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAicmV2ZXJzZV92aWRlbyIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPIH0sCisgICAgICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgICAgIH07CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfc3R5bGUiLCAiaWRfc2V0X3N0eWxlIiwgYmNtX2Rldl9sb2dfY2xpX2lkX3NldF9zdHlsZSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJzdHlsZSIsICJzdHlsZSIsIGVudW1fdGFibGVfbG9nX3N0eWxlLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX2NsZWFyX2NvdW50ZXJzIiwgImlkX2NsZWFyX2NvdW50ZXJzIiwgYmNtX2Rldl9sb2dfY2xpX2lkX2NsZWFyX2NvdW50ZXJzLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJsb2ciLCAibG9nIiwgYmNtX2Rldl9sb2dfY2xpX2xvZywKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfcHJpbnQiLCAibG9nX2xldmVsIiwgZW51bV90YWJsZV9sb2dfbGV2ZWwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic3RyaW5nIiwgInN0cmluZyIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJjb3VudCIsICJOdW1iZXIgb2YgbWVzc2FnZXMgdG8gc2VuZCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImluc3RhbmNlX2VuYWJsZSIsICJlbmFibGUvZGlzYWJsZSBpbnN0YW5jZSBudW1iZXIiLCBiY21fZGV2X2xvZ19jbGlfaW5zdGFuY2VfZW5hYmxlLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJlbmFibGUiLCAiZW5hYmxlIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbnN0YW5jZSIsICJpbnN0YW5jZSBudW1iZXIiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworICAgIH0KKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaWRfc2V0X3Rocm90dGxlIiwgInNldCB0aHJvdHRsZSIsIGJjbV9kZXZfbG9nX2NsaV90aHJvdHRsZSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfcHJpbnQiLCAibG9nX2xldmVsIiwgZW51bV90YWJsZV9sb2dfbGV2ZWwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidGhyb3R0bGUiLCAidGhyb3R0bGUiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfdHJpZ2dlciIsICJzZXQgdHJpZ2dlciIsIGJjbV9kZXZfbG9nX2NsaV90cmlnZ2VyLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9wcmludCIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzdGFydCIsICJzdGFydCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInN0b3AiLCAic3RvcCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInJlcGVhdCIsICJyZXBlYXQiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX2dldF9mZWF0dXJlIiwgImdldCBmZWF0dXJlIiwgYmNtX2Rldl9sb2dfY2xpX2dldF9mZWF0dXJlcywKKyAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBkaXI7Cit9CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwOTBiNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX2NsaS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNX0RFVl9MT0dfQ0xJX0hfCisjZGVmaW5lIEJDTV9ERVZfTE9HX0NMSV9IXworCisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4KKyNpbmNsdWRlICJiY21fZGV2X2xvZ190YXNrLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsOworICAgIGNoYXIgc3RyW01BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRV07CisgICAgdWludDMyX3QgZnJlZV9sZW47Cit9IGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uOworCisvKiBjcmVhdGUgYSBDTEkgc2Vzc2lvbiBhZGFwdGF0aW9uIGxheWVyIHRoYXQgb3V0cHV0cyB0byBhIGRldiBsb2cgaW5zdGVhZCBvZiB0byBhIENMSSBzaGVsbCAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb25fY3JlYXRlKAorICAgIGRldl9sb2dfaWQgbG9nX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbCwKKyAgICBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbiAqKnNlc3Npb24pOworCisvKiBpbml0aWFsaXplIHRoZSBkZXYgbG9nIENMSSBmdW5jdGlvbnMgKi8KK2JjbWNsaV9lbnRyeSAqYmNtX2Rldl9sb2dfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpyb290X2Rpcik7CisKKyNlbmRpZiAvKiBCQ01fREVWX0xPR19DTElfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY1NTg4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5jCkBAIC0wLDAgKzEsMTc1MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmZGVmIEVOQUJMRV9MT0cKKworI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2suaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZ190YXNrX2ludGVybmFsLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlICJiY21vbHRfZGV2X2xvZ19saW51eC5oIgorI2VuZGlmCisKKyNpZmRlZiBERVZfTE9HX1NZU0xPRworI2luY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgVVNFX0FOU0lfRVNDQVBFX0NPREVTCisKKyNpZmRlZiBVU0VfQU5TSV9FU0NBUEVfQ09ERVMKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9OT1JNQUwgICAgICAgICJcMDMzWzBtXDAzMyM1IgorI2RlZmluZSBERVZfTE9HX1NUWUxFX0JPTEQgICAgICAgICAgIlwwMzNbMW0iCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfVU5ERVJMSU5FICAgICAiXDAzM1s0bSIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9CTElOSyAgICAgICAgICJcMDMzWzVtIgorI2RlZmluZSBERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU8gIlwwMzNbN20iCisjZWxzZQorI2RlZmluZSBERVZfTE9HX1NUWUxFX05PUk1BTCAgICAgICAgIiAgICAiCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfQk9MRCAgICAgICAgICAiKioqICIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9VTkRFUkxJTkUgICAgICJfX18gIgorI2RlZmluZSBERVZfTE9HX1NUWUxFX0JMSU5LICAgICAgICAgIm9fbyAiCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyAiISEhICIKKyNlbmRpZgorCisjZGVmaW5lIERFVl9MT0dfTVNHX1NUQVJUX0NIQVIgICAgICAweDFlICAgICAgICAvKiByZWNvcmQgc2VwYXJhdG9yIGNoYXJhY3RlciAqLworCisjZGVmaW5lIE1FTV9GSUxFX0hEUl9TSVpFICAgICAgIHNpemVvZihkZXZfbG9nX21lbV9maWxlX2hlYWRlcikKKworI2RlZmluZSBMT0dfTUlOKGEsYikgICAgICAgICgoKGludCkoYSkgPD0gKGludCkoYikpID8gKGEpIDogKGIpKQorCitkZXZfbG9nX2lkIGRlZl9sb2dfaWQ7CisKK3N0YXRpYyBiY21fZGV2X2xvZ19zdHlsZSBkZXZfbG9nX2xldmVsMnN0eWxlW0RFVl9MT0dfTEVWRUxfTlVNX09GXSA9Cit7CisgICAgW0RFVl9MT0dfTEVWRUxfRkFUQUxdID0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtERVZfTE9HX0xFVkVMX0VSUk9SXSA9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCwKKyAgICBbREVWX0xPR19MRVZFTF9XQVJOSU5HXSA9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCwKKyAgICBbREVWX0xPR19MRVZFTF9JTkZPXSA9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCwKKyAgICBbREVWX0xPR19MRVZFTF9ERUJVR10gPSBCQ01fREVWX0xPR19TVFlMRV9OT1JNQUwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZGV2X2xvZ19zdHlsZV9hcnJheVtdID0KK3sKKyAgICBbQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMXSA9IERFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtCQ01fREVWX0xPR19TVFlMRV9CT0xEXSA9IERFVl9MT0dfU1RZTEVfQk9MRCwKKyAgICBbQkNNX0RFVl9MT0dfU1RZTEVfVU5ERVJMSU5FXSA9IERFVl9MT0dfU1RZTEVfVU5ERVJMSU5FLAorICAgIFtCQ01fREVWX0xPR19TVFlMRV9CTElOS10gPSBERVZfTE9HX1NUWUxFX0JMSU5LLAorICAgIFtCQ01fREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPXSA9IERFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTywKK307CisKK2JjbV9kZXZfbG9nIGRldl9sb2cgPSB7ezB9fTsKK2NvbnN0IGNoYXIgKmxvZ19sZXZlbF9zdHIgPSAiP0ZFV0lEIjsKKworc3RhdGljIHZvaWQgYmNtX2Rldl9sb2dfc2h1dGRvd25fbXNnX3JlbGVhc2UoYmNtb3NfbXNnICptKQoreworICAgICh2b2lkKW07IC8qIGRvIG5vdGhpbmcsIHRoZSBtZXNzYWdlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCit9CisKK3N0YXRpYyBiY21vc19tc2cgc2h1dGRvd25fbXNnID0geyAucmVsZWFzZSA9IGJjbV9kZXZfbG9nX3NodXRkb3duX21zZ19yZWxlYXNlIH07CisKK3N0YXRpYyB2b2lkIGJjbV9kZXZfbG9nX2ZpbGVfc2F2ZV9tc2coYmNtX2Rldl9sb2dfZmlsZSAqZmlsZXMsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBsZW4gPSBzdHJsZW4obWVzc2FnZSkgKyAxOyAvKiBpbmNsdWRpbmcgMCB0ZXJtaW5hdG9yICovCisKKyAgICBmb3IgKGkgPSAwOyAoaSA8IERFVl9MT0dfTUFYX0ZJTEVTKSAmJiAoZmlsZXNbaV0uZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEKTsgaSsrKQorICAgIHsKKyAgICAgICAgZmlsZXNbaV0uZmlsZV9wYXJtLndyaXRlX2NiKCZmaWxlc1tpXSwgbWVzc2FnZSwgbGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9sb2dfc2F2ZV90YXNrX2hhbmRsZV9tZXNzYWdlKGJjbW9zX21zZyAqbXNnKQoreworICAgIHN0YXRpYyBjaGFyIGxvZ19zdHJpbmdbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdOworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICBjaGFyIHRpbWVfc3RyWzE3XTsKKyAgICBkZXZfbG9nX3F1ZXVlX21zZyAqcmVjZWl2ZV9tc2cgPSBtc2ctPmRhdGE7CisgICAgZGV2X2xvZ19pZF9wYXJtICpsb2dfaWQgPSByZWNlaXZlX21zZy0+bG9nX2lkOworICAgIGJjbV9kZXZfbG9nX2xldmVsIG1zZ19sZXZlbCA9IHJlY2VpdmVfbXNnLT5tc2dfbGV2ZWw7CisKKyAgICAvKiBCdWlsZCBtZXNzYWdlIGhlYWRlciAqLworICAgICpsb2dfc3RyaW5nID0gJ1wwJzsKKyAgICBpZiAoIShyZWNlaXZlX21zZy0+ZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSKSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHNpemVvZih0aW1lX3N0cik7CisgICAgICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnRpbWVfdG9fc3RyX2NiKHJlY2VpdmVfbXNnLT50aW1lX3N0YW1wLCB0aW1lX3N0ciwgbGVuZ3RoKTsKKyAgICAgICAgc25wcmludGYoCisgICAgICAgICAgICBsb2dfc3RyaW5nLAorICAgICAgICAgICAgc2l6ZW9mKGxvZ19zdHJpbmcpLAorICAgICAgICAgICAgIlslczogJWMgJS0yMHNdICIsCisgICAgICAgICAgICB0aW1lX3N0ciwKKyAgICAgICAgICAgIGxvZ19sZXZlbF9zdHJbbXNnX2xldmVsXSwKKyAgICAgICAgICAgIGxvZ19pZC0+bmFtZSk7CisgICAgfQorCisgICAgLyogTW9kaWZ5IHRoZSBfX0ZJTEVfXyBmb3JtYXQgc28gaXQgd291bGQgcHJpbnQgdGhlIGZpbGVuYW1lIG9ubHkgd2l0aG91dCB0aGUgcGF0aC4KKyAgICAgKiBJZiB1c2luZyBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgaXQgaXMgZG9uZSBpbiBjYWxsZXIgY29udGV4dCwgYmVjYXVzZSBmaWxlbmFtZSBtaWdodCBiZSBsb25nLCB0YWtpbmcgYSBsb3Qgb2YKKyAgICAgKiB0aGUgc3BhY2Ugb2YgdGhlIG1lc3NhZ2UgaXRzZWxmLiAqLworICAgIGlmICgocmVjZWl2ZV9tc2ctPmZsYWdzICYgQkNNX0xPR19GTEFHX0ZJTEVOQU1FX0lOX0ZNVCkgJiYgIShyZWNlaXZlX21zZy0+ZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCkpCisgICAgICAgIHJlY2VpdmVfbXNnLT51LmZtdF9hcmdzLmZtdCA9IGRldl9sb2dfYmFzZW5hbWUocmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuZm10KTsKKworICAgIGlmIChyZWNlaXZlX21zZy0+ZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCkKKyAgICB7CisgICAgICAgIC8qIENvcHkgdXNlciBzdHJpbmcgdG8gYnVmZmVyICovCisgICAgICAgIHN0cm5jYXQobG9nX3N0cmluZywgcmVjZWl2ZV9tc2ctPnUuc3RyLCBzaXplb2YobG9nX3N0cmluZykgLSBzdHJsZW4obG9nX3N0cmluZykgLSAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gKChsb25nKXJlY2VpdmVfbXNnLT51LmZtdF9hcmdzLmFyZ3MgJSA4ID09IDApID8gMCA6IDE7IC8qIHN0YXJ0IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAqLworICAgICAgICB2YV9saXN0IGFwOworICAgICAgICAqKHZvaWQgKiopJmFwID0gJnJlY2VpdmVfbXNnLT51LmZtdF9hcmdzLmFyZ3Nbb2Zmc2V0XTsKKworICAgICAgICAvKiBDb3B5IHVzZXIgc3RyaW5nIHRvIGJ1ZmZlciAqLworICAgICAgICB2c25wcmludGYobG9nX3N0cmluZyArIHN0cmxlbihsb2dfc3RyaW5nKSwKKyAgICAgICAgICAgIHNpemVvZihsb2dfc3RyaW5nKSAtIHN0cmxlbihsb2dfc3RyaW5nKSwKKyAgICAgICAgICAgIHJlY2VpdmVfbXNnLT51LmZtdF9hcmdzLmZtdCwKKyAgICAgICAgICAgIGFwKTsKKyAgICB9CisKKyAgICAvKiBGb3JjZSBsYXN0IGNoYXIgdG8gYmUgZW5kIG9mIHN0cmluZyAqLworICAgIGxvZ19zdHJpbmdbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUgLSAxXSA9ICdcMCc7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50LCBpZiB0aGUgbWVzc2FnZSBpcyBnb2luZyB0byBiZSBzZW50IHRvIHRoZSBwcmludCB0YXNrLCBzYXZlIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHRoZW4gZm9yd2FyZCBpdC4KKyAgICAgKiBPdGhlcndpc2UsIHdlIGNhbiByZWxlYXNlIHRoZSBtZXNzYWdlIGJlZm9yZSB3cml0aW5nIGl0IHRvIFJBTS4gKi8KKyAgICBpZiAoKGxvZ19pZC0+bG9nX3R5cGUgJiBERVZfTE9HX0lEX1RZUEVfUFJJTlQpICYmCisgICAgICAgIChtc2dfbGV2ZWwgPD0gbG9nX2lkLT5sb2dfbGV2ZWxfcHJpbnQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21fZGV2X2xvZ19sZXZlbF9pc19lcnJvcihtc2dfbGV2ZWwpICYmCisgICAgICAgICAgICAocmVjZWl2ZV9tc2ctPmZsYWdzICYgQkNNX0xPR19GTEFHX0RPTlRfU0tJUF9QUklOVCkgIT0gMCAmJgorICAgICAgICAgICAgYmNtX2Rldl9sb2dfcG9vbF9vY2N1cGFuY3lfcGVyY2VudF9nZXQoKSA+PSBERVZfTE9HX1NLSVBfUFJJTlRfVEhSRVNIT0xEX1BFUkNFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ19pZC0+cHJpbnRfc2tpcHBlZF9jb3VudCsrOworICAgICAgICAgICAgYmNtb3NfbXNnX2ZyZWUobXNnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmNweShyZWNlaXZlX21zZy0+dS5zdHIsIGxvZ19zdHJpbmcpOyAvKiBzbyB0aGUgcHJpbnQgdGFzayBkb2Vzbid0IG5lZWQgdG8gcmUtZm9ybWF0IGl0ICovCisgICAgICAgICAgICBiY21vc19tc2dfc2VuZCgmZGV2X2xvZy5wcmludF9xdWV1ZSwgbXNnLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgIH0KKworICAgIC8qIFNhdmUgdG8gZmlsZSAqLworICAgIGlmICgobG9nX2lkLT5sb2dfdHlwZSAmIERFVl9MT0dfSURfVFlQRV9TQVZFKSAmJgorICAgICAgICAobXNnX2xldmVsIDw9IGxvZ19pZC0+bG9nX2xldmVsX3NhdmUpKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfZmlsZV9zYXZlX21zZyhkZXZfbG9nLmZpbGVzLCBsb2dfc3RyaW5nKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9sb2dfcHJpbnRfdGFza19oYW5kbGVfbWVzc2FnZShiY21vc19tc2cgKm1zZykKK3sKKyAgICBzdGF0aWMgY2hhciBsb2dfc3RyaW5nW01BWF9ERVZfTE9HX1NUUklOR19TSVpFXTsKKyAgICBkZXZfbG9nX3F1ZXVlX21zZyAqcmVjZWl2ZV9tc2cgPSBtc2ctPmRhdGE7CisgICAgZGV2X2xvZ19pZF9wYXJtICpsb2dfaWQgPSByZWNlaXZlX21zZy0+bG9nX2lkOworICAgIGJjbV9kZXZfbG9nX2xldmVsIG1zZ19sZXZlbCA9IHJlY2VpdmVfbXNnLT5tc2dfbGV2ZWw7CisKKyAgICAvKiBtYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgcHJlLWZvcm1hdHRlZCBzdHJpbmcgKGl0IHdhcyBmb3JtYXR0ZWQgaW4gdGhlIHNhdmUgdGFzaykgKi8KKyAgICBzdHJjcHkobG9nX3N0cmluZywgcmVjZWl2ZV9tc2ctPnUuc3RyKTsKKworICAgIC8qIGZyZWUgdGhlIG1lc3NhZ2UgQVNBUCBzaW5jZSBwcmludGluZyBtaWdodCB0YWtlIHNvbWUgdGltZSAqLworICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisKKyAgICBpZiAobG9nX2lkLT5zdHlsZSA9PSBCQ01fREVWX0xPR19TVFlMRV9OT1JNQUwgJiYKKyAgICAgICAgZGV2X2xvZ19sZXZlbDJzdHlsZVttc2dfbGV2ZWxdID09IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCkKKyAgICB7CisgICAgICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiKGRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiX2FyZywgIiVzIiwgbG9nX3N0cmluZyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIElmIHN0eWxlIHdhcyBzZXQgcGVyIGxvZyBpZCwgdGhlbiB1c2UgaXQuICovCisgICAgICAgIGlmIChsb2dfaWQtPnN0eWxlICE9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCkKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IoCisgICAgICAgICAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2JfYXJnLAorICAgICAgICAgICAgICAgICIlcyVzJXMiLAorICAgICAgICAgICAgICAgIGRldl9sb2dfc3R5bGVfYXJyYXlbbG9nX2lkLT5zdHlsZV0sCisgICAgICAgICAgICAgICAgbG9nX3N0cmluZywKKyAgICAgICAgICAgICAgICBkZXZfbG9nX3N0eWxlX2FycmF5W0JDTV9ERVZfTE9HX1NUWUxFX05PUk1BTF0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3RoZXJ3aXNlIC0gc3R5bGUgd2FzIHNldCBwZXIgbG9nIGxldmVsLiAqLworICAgICAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IoCisgICAgICAgICAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2JfYXJnLAorICAgICAgICAgICAgICAgICIlcyVzJXMiLAorICAgICAgICAgICAgICAgIGRldl9sb2dfc3R5bGVfYXJyYXlbZGV2X2xvZ19sZXZlbDJzdHlsZVttc2dfbGV2ZWxdXSwKKyAgICAgICAgICAgICAgICBsb2dfc3RyaW5nLAorICAgICAgICAgICAgICAgIGRldl9sb2dfc3R5bGVfYXJyYXlbQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGV2X2xvZ19wcmludF90YXNrKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19tc2cgKm07CisgICAgYmNtb3NfZXJybm8gZXJyb3I7CisgICAgY29uc3QgY2hhciBlcnJvcl9zdHJbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdID0gIkVycm9yOiBDYW4ndCByZWNlaXZlIGZyb20gcXVldWUgLSBkZXZfbG9nIHByaW50IHRhc2sgZXhpdFxuIjsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgZXJyb3IgPSBiY21vc19tc2dfcmVjdigmZGV2X2xvZy5wcmludF9xdWV1ZSwgQkNNT1NfV0FJVF9GT1JFVkVSLCAmbSk7CisgICAgICAgIGlmIChlcnJvciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiJXMiLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IoZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2JfYXJnLCAiJXMiLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgYmNtX2Rldl9sb2dfZmlsZV9zYXZlX21zZyhkZXZfbG9nLmZpbGVzLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAobSA9PSAmc2h1dGRvd25fbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzaHV0IGRvd24gZ3JhY2VmdWxseSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2xvZ19wcmludF90YXNrX2hhbmRsZV9tZXNzYWdlKG0pOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3Nfc2VtX3Bvc3QoJmRldl9sb2cucHJpbnRfdGFza19pc190ZXJtaW5hdGVkKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldl9sb2dfc2F2ZV90YXNrKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19tc2cgKm07CisgICAgYmNtb3NfZXJybm8gZXJyb3I7CisgICAgY29uc3QgY2hhciBlcnJvcl9zdHJbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdID0gIkVycm9yOiBDYW4ndCByZWNlaXZlIGZyb20gcXVldWUgLSBkZXZfbG9nIHNhdmUgdGFzayBleGl0XG4iOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBlcnJvciA9IGJjbW9zX21zZ19yZWN2KCZkZXZfbG9nLnNhdmVfcXVldWUsIEJDTU9TX1dBSVRfRk9SRVZFUiwgJm0pOworICAgICAgICBpZiAoZXJyb3IgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIiVzIiwgZXJyb3Jfc3RyKTsKKyAgICAgICAgICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiKGRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiX2FyZywgIiVzIiwgZXJyb3Jfc3RyKTsKKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX2ZpbGVfc2F2ZV9tc2coZGV2X2xvZy5maWxlcywgZXJyb3Jfc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KWVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG0gPT0gJnNodXRkb3duX21zZykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbXNnX2ZyZWUobSk7CisgICAgICAgICAgICBicmVhazsgLyogc2h1dCBkb3duIGdyYWNlZnVsbHkgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldl9sb2dfc2F2ZV90YXNrX2hhbmRsZV9tZXNzYWdlKG0pOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3Nfc2VtX3Bvc3QoJmRldl9sb2cuc2F2ZV90YXNrX2lzX3Rlcm1pbmF0ZWQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF90aW1lX3RvX3N0cih1aW50MzJfdCB0aW1lX3N0YW1wLCBjaGFyICp0aW1lX3N0ciwgaW50IHRpbWVfc3RyX3NpemUpCit7CisgICAgcmV0dXJuIHNucHJpbnRmKHRpbWVfc3RyLCB0aW1lX3N0cl9zaXplLCAiJXUiLCB0aW1lX3N0YW1wKTsKK30KKworc3RhdGljIHVpbnQzMl90IGRlZmF1bHRfZ2V0X3RpbWUodm9pZCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3ByaW50KHZvaWQgKmFyZywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBiY21vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZGVmYXVsdF9vcGVuX2NhbGxiYWNrX2NvbmRfcmVzZXQoY29uc3QgYmNtX2Rldl9sb2dfZmlsZV9wYXJtICpmaWxlX3Bhcm0sIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIGJjbW9zX2Jvb2wgaXNfcmV3aW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgfHwgZmlsZS0+ZmlsZV9wYXJtLnNpemUgPD0gTUVNX0ZJTEVfSERSX1NJWkUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICAvKiBDcmVhdGUgZmlsZSBtdXRleCAqLworICAgIGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCwgMCwgTlVMTCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBjcmVhdGUgbXV0ZXggKGVycm9yOiAlZClcbiIsIChpbnQpZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmaWxlIG1hZ2ljIHN0cmluZyAqLworICAgIG1lbWNweSgmZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlciwgKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciwgTUVNX0ZJTEVfSERSX1NJWkUpOworICAgIGlmIChtZW1jbXAoRklMRV9NQUdJQ19TVFIsIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV9tYWdpYywgRklMRV9NQUdJQ19TVFJfU0laRSkpCisgICAgeworICAgICAgICBERVZfTE9HX0lORk9fUFJJTlRGKCJObyBmaWxlIG1hZ2ljIHN0cmluZyAtIGZpbGUgaXMgZW1wdHkvY29ycnVwdFxuIik7CisgICAgICAgIGlmICghaXNfcmV3aW5kIHx8ICFmaWxlLT5maWxlX3Bhcm0ucmV3aW5kX2NiKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tdXRleF9kZXN0cm95KCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlLT5maWxlX3Bhcm0ucmV3aW5kX2NiKGZpbGUpOworICAgIH0KKworICAgIERFVl9MT0dfSU5GT19QUklOVEYoIkF0dGFjaGVkIHRvIGV4aXN0aW5nIGZpbGVcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZWZhdWx0X29wZW5fY2FsbGJhY2soY29uc3QgYmNtX2Rldl9sb2dfZmlsZV9wYXJtICpmaWxlX3Bhcm0sIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgcmV0dXJuIGRlZmF1bHRfb3Blbl9jYWxsYmFja19jb25kX3Jlc2V0KGZpbGVfcGFybSwgZmlsZSwgQkNNT1NfVFJVRSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZWZhdWx0X2Nsb3NlX2NhbGxiYWNrKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIExvb2sgZm9yIHN0YXJ0IG9mIG1zZyBjaGFyYWN0ZXIgKi8KK3N0YXRpYyBpbnQgZ2V0X21zZ19zdGFydF9vZmZzZXQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBtYXhfbGVuKQoreworICAgIHVpbnQ4X3QgKmJ1ZiwgKm1zZzsKKworICAgIGJ1ZiA9ICh1aW50OF90ICopZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBvZmZzZXQgKyBNRU1fRklMRV9IRFJfU0laRTsKKyAgICBtc2cgPSBtZW1jaHIoYnVmLCBERVZfTE9HX01TR19TVEFSVF9DSEFSLCBtYXhfbGVuKTsKKyAgICBpZiAoIW1zZykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAobXNnIC0gYnVmICsgMSk7Cit9CisKKy8qIExvb2sgZm9yIDAtdGVybWluYXRvciAqLworc3RhdGljIGludCBnZXRfbXNnX2VuZF9vZmZzZXQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBtYXhfbGVuKQoreworICAgIHVpbnQ4X3QgKmJ1ZiwgKmVuZDsKKworICAgIGJ1ZiA9ICh1aW50OF90ICopZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBvZmZzZXQgKyBNRU1fRklMRV9IRFJfU0laRTsKKyAgICBlbmQgPSBtZW1jaHIoYnVmLCAwLCBtYXhfbGVuKTsKKyAgICBpZiAoIWVuZCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAoZW5kIC0gYnVmICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9yZWFkX2NhbGxiYWNrKGJjbV9kZXZfbG9nX2ZpbGUgKmxvZ19maWxlLCB1aW50MzJfdCAqcF9vZmZzZXQsIHZvaWQgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKQoreworICAgIHVpbnQzMl90IG9mZnNldCA9ICpwX29mZnNldDsKKyAgICB1aW50MzJfdCByZWFsX2xlbmd0aCA9IDA7CisgICAgaW50IHN0YXJ0LCBlbmQ7CisKKyAgICAvKiBJZiBmaWxlIHdyYXBwZWQgYXJvdW5kLCBvZmZzZXQgc3RhcnRzIGZyb20gd3JpdGVfb2Zmc2V0LCBvdGhlcndpc2UsCisgICAgICogaXQgc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZworICAgICAqLworICAgIGlmIChsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5maWxlX3dyYXBfY250KQorICAgIHsKKyAgICAgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+PSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5kYXRhX3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSAtIG9mZnNldDsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0ID49IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSkKKyAgICAgICAgICAgIG9mZnNldCAtPSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5kYXRhX3NpemU7CisgICAgICAgIC8qIEZpbmQgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IG1lc3NhZ2UgKi8KKyAgICAgICAgc3RhcnQgPSBnZXRfbXNnX3N0YXJ0X29mZnNldChsb2dfZmlsZSwgb2Zmc2V0LCBMT0dfTUlOKGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSAtIG9mZnNldCwKKyAgICAgICAgICAgIE1BWF9ERVZfTE9HX1NUUklOR19TSVpFKSk7CisgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpZG4ndCBmaW5kIGFueSB1cCB0byB0aGUgZW5kIG9mIGJ1ZmZlci4gTG9vayBmcm9tIHRoZSBzdGFydCAqLworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGlmICghbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgc3RhcnQgPSBnZXRfbXNnX3N0YXJ0X29mZnNldChsb2dfZmlsZSwgMCwgTE9HX01JTihsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQgLSAxLAorICAgICAgICAgICAgICAgIE1BWF9ERVZfTE9HX1NUUklOR19TSVpFKSk7CisgICAgICAgICAgICBpZiAoc3RhcnQgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gc3RhcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFN0YXJ0IGJlZ2lubmluZyBvZiBtZXNzYWdlLiBXaXRob3V0IHdyYXAtYXJvdW5kIGl0IHNob3VsZCBiZSByaWdodCBhdCB0aGUgb2Zmc2V0LAorICAgICAgICAgKiBzbywgaXQgaXMganVzdCBhIHByZWNhdXRpb24gKi8KKyAgICAgICAgc3RhcnQgPSBnZXRfbXNnX3N0YXJ0X29mZnNldChsb2dfZmlsZSwgb2Zmc2V0LCBMT0dfTUlOKGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSAtIG9mZnNldCwKKyAgICAgICAgICAgIE1BWF9ERVZfTE9HX1NUUklOR19TSVpFKSk7CisgICAgICAgIGlmIChzdGFydCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG9mZnNldCArPSBzdGFydDsKKyAgICAgICAgLyogU3RvcCByZWFkaW5nIHdoZW4gcmVhY2hlZCB3cml0ZV9vZmZzZXQgKi8KKyAgICAgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+PSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgbGVuZ3RoID0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0IC0gb2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2UgaGF2ZSB0aGUgYmVnaW5uaW5nLiBOb3cgZmluZCB0aGUgZW5kIG9mIG1lc3NhZ2UgYW5kIGNvcHkgdG8gdGhlIHVzZXIKKyAgICAgKiBidWZmZXIgaWYgdGhlcmUgaXMgZW5vdWdoIHJvb20gKi8KKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgbGVuZ3RoMSA9IG9mZnNldCArIGxlbmd0aCAtIGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZTsgLyogdGFpbCBsZW5ndGggKi8KKyAgICAgICAgbGVuZ3RoIC09IGxlbmd0aDE7CisgICAgICAgIGVuZCA9IGdldF9tc2dfZW5kX29mZnNldChsb2dfZmlsZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBpZiAoZW5kID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweShidWYsICh1aW50OF90ICopbG9nX2ZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyICsgb2Zmc2V0ICsgTUVNX0ZJTEVfSERSX1NJWkUsIGVuZCk7CisgICAgICAgICAgICAqcF9vZmZzZXQgKz0gZW5kICsgc3RhcnQ7CisgICAgICAgICAgICByZXR1cm4gZW5kOworICAgICAgICB9CisKKyAgICAgICAgLyogRGlkbid0IGZpbmQgZW5kIG9mIG1lc3NhZ2UgaW4gdGhlIGVuZCBvZiBmaWxlIGRhdGEgYnVmZmVyLiB3cmFwIGFyb3VuZCAqLworICAgICAgICBtZW1jcHkoYnVmLCAodWludDhfdCAqKWxvZ19maWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIG9mZnNldCArIE1FTV9GSUxFX0hEUl9TSVpFLCBsZW5ndGgpOworICAgICAgICByZWFsX2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgYnVmID0gKHVpbnQ4X3QgKilidWYgKyBsZW5ndGg7CisgICAgICAgIGxlbmd0aCA9IGxlbmd0aDE7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgfQorICAgIGVuZCA9IGdldF9tc2dfZW5kX29mZnNldChsb2dfZmlsZSwgb2Zmc2V0LCBNQVhfREVWX0xPR19TVFJJTkdfU0laRSk7CisgICAgaWYgKGVuZCA8PSAwKQorICAgIHsKKyAgICAgICAgLyogc29tZXRoaW5nIGlzIHdyb25nLiBtc2cgaXMgbm90IHRlcm1pbmF0ZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIElmIHRoZXJlIGlzIG5vIHJvb20gZm9yIHRoZSB3aG9sZSBtZXNzYWdlIC0gcmV0dXJuIG92ZXJmbG93ICovCisgICAgaWYgKGVuZCA+IGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIChpbnQpQkNNX0VSUl9PVkVSRkxPVzsKKworICAgIG1lbWNweShidWYsICh1aW50OF90ICopbG9nX2ZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyICsgb2Zmc2V0ICsgTUVNX0ZJTEVfSERSX1NJWkUsIGVuZCk7CisgICAgcmVhbF9sZW5ndGggKz0gZW5kOworCisgICAgKnBfb2Zmc2V0ICs9IHJlYWxfbGVuZ3RoICsgc3RhcnQ7CisKKyAgICByZXR1cm4gcmVhbF9sZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X251bV9vZl9vdmVyd3JpdHRlbl9tZXNzYWdlcyh1aW50OF90ICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICB1aW50OF90ICpwOworICAgIGludCBuID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBwID0gbWVtY2hyKGJ1ZiwgREVWX0xPR19NU0dfU1RBUlRfQ0hBUiwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICArK247CisgICAgICAgIGxlbmd0aCAtPSAocCArIDEgLSBidWYpOworICAgICAgICBidWYgPSBwICsgMTsKKyAgICB9IHdoaWxlKGxlbmd0aCk7CisKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3dyaXRlX2NhbGxiYWNrKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIGNvbnN0IHZvaWQgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKQoreworICAgIHVpbnQzMl90IG9mZnNldCwgbmV4dF9vZmZzZXQ7CisgICAgdWludDhfdCAqcDsKKyAgICBpbnQgbl9vdmVyd3JpdHRlbiA9IDA7CisKKyAgICBpZiAoKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19TVE9QX1dIRU5fRlVMTCkgJiYgZmlsZS0+aXNfZnVsbCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKworICAgIG9mZnNldCA9IGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0OworICAgIG5leHRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoICsgMTsgLyogMSBleHRyYSBjaGFyYWN0ZXIgZm9yIHJlY29yZCBkZWxpbWl0ZXIgKi8KKworICAgIC8qIEhhbmRsZSBvdmVyZmxvdyAqLworICAgIGlmIChuZXh0X29mZnNldCA+PSBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHRhaWxfbGVuZ3RoOworCisgICAgICAgIC8qIFNwbGl0IGJ1ZmZlciBpbiAyICovCisgICAgICAgIHRhaWxfbGVuZ3RoID0gbmV4dF9vZmZzZXQgLSBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZTsgICAvKiAybmQgc2VnbWVudCBsZW5ndGggKi8KKworICAgICAgICBpZiAoKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19TVE9QX1dIRU5fRlVMTCkgJiYgdGFpbF9sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGUtPmlzX2Z1bGwgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgbGVuZ3RoIC09IHRhaWxfbGVuZ3RoOworICAgICAgICAvKiAiaWYgKG5leHRfb2Zmc2V0ID49IGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplKSIgY29uZGl0aW9uCisgICAgICAgICAqIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSBpcyByb29tIGZvciBhdCBsZWFzdCAxIGNoYXJhY3RlciBpbiB0aGUgZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgcCA9ICh1aW50OF90ICopZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBvZmZzZXQgKyBNRU1fRklMRV9IRFJfU0laRTsKKyAgICAgICAgaWYgKGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV93cmFwX2NudCkKKyAgICAgICAgICAgIG5fb3ZlcndyaXR0ZW4gKz0gZ2V0X251bV9vZl9vdmVyd3JpdHRlbl9tZXNzYWdlcyhwLCBsZW5ndGggKyAxKTsKKyAgICAgICAgKnAgPSBERVZfTE9HX01TR19TVEFSVF9DSEFSOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkocCArIDEsIGJ1ZiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1ZiA9IChjb25zdCB1aW50OF90ICopYnVmICsgbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmICh0YWlsX2xlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcCA9ICh1aW50OF90ICopZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBNRU1fRklMRV9IRFJfU0laRTsKKyAgICAgICAgICAgIGlmIChmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQpCisgICAgICAgICAgICAgICAgbl9vdmVyd3JpdHRlbiArPSBnZXRfbnVtX29mX292ZXJ3cml0dGVuX21lc3NhZ2VzKHAsIHRhaWxfbGVuZ3RoKTsKKyAgICAgICAgICAgIG1lbWNweShwLCBidWYsIHRhaWxfbGVuZ3RoKTsKKyAgICAgICAgICAgICsrZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5maWxlX3dyYXBfY250OworICAgICAgICB9CisgICAgICAgIG5leHRfb2Zmc2V0ID0gdGFpbF9sZW5ndGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHAgPSAodWludDhfdCAqKWZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyICsgTUVNX0ZJTEVfSERSX1NJWkUgKyBvZmZzZXQ7CisgICAgICAgIGlmIChmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQpCisgICAgICAgICAgICBuX292ZXJ3cml0dGVuICs9IGdldF9udW1fb2Zfb3ZlcndyaXR0ZW5fbWVzc2FnZXMocCwgbGVuZ3RoICsgMSk7CisgICAgICAgICoocCsrKSA9IERFVl9MT0dfTVNHX1NUQVJUX0NIQVI7CisgICAgICAgIG1lbWNweShwLCBidWYsIGxlbmd0aCk7CisgICAgfQorICAgIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0ID0gbmV4dF9vZmZzZXQ7CisgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5udW1fbXNncyArPSAoMSAtIG5fb3ZlcndyaXR0ZW4pOworCisgICAgLyogdXBkYXRlIHRoZSBoZWFkZXIgKi8KKyAgICBtZW1jcHkoKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciwgJmZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIsIE1FTV9GSUxFX0hEUl9TSVpFKTsKKworICAgIC8qIHNlbmQgYWxtb3N0IGZ1bGwgaW5kaWNhdGlvbiBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoZmlsZS0+YWxtb3N0X2Z1bGwuc2VuZF9pbmRfY2IgJiYKKyAgICAgICAgIWZpbGUtPmFsbW9zdF9mdWxsLmluZF9zZW50ICYmCisgICAgICAgIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0ID4gZmlsZS0+YWxtb3N0X2Z1bGwudGhyZXNob2xkKQorICAgIHsKKyAgICAgICAgZmlsZS0+YWxtb3N0X2Z1bGwuaW5kX3NlbnQgPSAoZmlsZS0+YWxtb3N0X2Z1bGwuc2VuZF9pbmRfY2IoZmlsZS0+YWxtb3N0X2Z1bGwucHJpdikgPT0gQkNNX0VSUl9PSyk7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZWZhdWx0X3Jld2luZF9jYWxsYmFjayhiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGJjbW9zX211dGV4X2xvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiQ2xlYXIgZmlsZVxuIik7CisgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5maWxlX3dyYXBfY250ID0gMDsKKyAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLndyaXRlX29mZnNldCA9IDA7CisgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5kYXRhX3NpemUgPSBmaWxlLT5maWxlX3Bhcm0uc2l6ZSAtIE1FTV9GSUxFX0hEUl9TSVpFOworICAgIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIubnVtX21zZ3MgPSAwOworICAgIHN0cmNweShmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfbWFnaWMsIEZJTEVfTUFHSUNfU1RSKTsKKyAgICBtZW1jcHkoKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciwgJmZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIsIE1FTV9GSUxFX0hEUl9TSVpFKTsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC5pbmRfc2VudCA9IEJDTU9TX0ZBTFNFOworCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2ZpbGVfY2FsbGJhY2tzKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgZmlsZS0+ZmlsZV9wYXJtLm9wZW5fY2IgID0gZGVmYXVsdF9vcGVuX2NhbGxiYWNrOworICAgIGZpbGUtPmZpbGVfcGFybS5jbG9zZV9jYiAgPSBkZWZhdWx0X2Nsb3NlX2NhbGxiYWNrOworICAgIGZpbGUtPmZpbGVfcGFybS5yZWFkX2NiICA9IGRlZmF1bHRfcmVhZF9jYWxsYmFjazsKKyAgICBmaWxlLT5maWxlX3Bhcm0ud3JpdGVfY2IgPSBkZWZhdWx0X3dyaXRlX2NhbGxiYWNrOworICAgIGZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IgPSBkZWZhdWx0X3Jld2luZF9jYWxsYmFjazsKK30KKworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbV9kZXZfbG9nX2lzX21lbW9yeV9maWxlKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgcmV0dXJuIChmaWxlLT5maWxlX3Bhcm0ub3Blbl9jYiA9PSBkZWZhdWx0X29wZW5fY2FsbGJhY2spOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19maWxlX2NsZWFyKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgaWYgKCFmaWxlIHx8ICEoZmlsZS0+ZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKworICAgIHJldHVybiBmaWxlLT5maWxlX3Bhcm0ucmV3aW5kX2NiKGZpbGUpOworfQorCisvKiBGaWxlIGluZGV4IHRvIGZpbGUgaGFuZGxlICovCitiY21fZGV2X2xvZ19maWxlICpiY21fZGV2X2xvZ19maWxlX2dldCh1aW50MzJfdCBmaWxlX2luZGV4KQoreworICAgIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUgPSAmZGV2X2xvZy5maWxlc1tmaWxlX2luZGV4XTsKKworICAgIGlmICgoZmlsZV9pbmRleCA+PSBERVZfTE9HX01BWF9GSUxFUykgfHwgIShmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZmlsZTsKK30KKworLyogUmVhZCBmcm9tIGZpbGUgKi8KK2ludCBiY21fZGV2X2xvZ19maWxlX3JlYWQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKm9mZnNldCwgY2hhciAqYnVmLCB1aW50MzJfdCBidWZfbGVuKQoreworICAgIGludCBsZW47CisgICAgaWYgKCFmaWxlIHx8ICFidWYgfHwgIShmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpKQorICAgICAgICByZXR1cm4gKGludClCQ01fRVJSX1BBUk07CisKKyAgICBsZW4gPSBmaWxlLT5maWxlX3Bhcm0ucmVhZF9jYihmaWxlLCBvZmZzZXQsIGJ1ZiwgYnVmX2xlbik7CisgICAgLyogSWYgbm90aGluZyBtb3JlIHRvIHJlYWQgYW5kIENMRUFSX0FGVEVSX1JFQUQgbW9kZSwgcmVhZCBhZ2FpbiB1bmRlciBsb2NrIGFuZCBjbGVhciBpZiBubyBuZXcgcmVjb3JkcyAqLworICAgIGlmICghbGVuICYmIGJjbV9kZXZfbG9nX2lzX21lbW9yeV9maWxlKGZpbGUpICYmIChmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfQ0xFQVJfQUZURVJfUkVBRCkpCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICAgICAgbGVuID0gZmlsZS0+ZmlsZV9wYXJtLnJlYWRfY2IoZmlsZSwgb2Zmc2V0LCBidWYsIGJ1Zl9sZW4pOworICAgICAgICBpZiAoIWxlbikKKyAgICAgICAgICAgIGZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IoZmlsZSk7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKKy8qIEF0dGFjaCBmaWxlIHRvIG1lbW9yeSBidWZmZXIgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfYXR0YWNoKHZvaWQgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbiwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBkZXZfbG9nX21lbV9maWxlX2hlYWRlciAqaGRyID0gKGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyICopYnVmOworCisgICAgaWYgKCFidWYgfHwgIWZpbGUgfHwgYnVmX2xlbiA8PSBNRU1fRklMRV9IRFJfU0laRSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmIChtZW1jbXAoRklMRV9NQUdJQ19TVFIsIGhkci0+ZmlsZV9tYWdpYywgRklMRV9NQUdJQ19TVFJfU0laRSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisjaWYgREVWX0xPR19FTkRJQU4gIT0gQkNNX0NQVV9FTkRJQU4KKyAgICBoZHItPmZpbGVfd3JhcF9jbnQgPSBiY21vc19lbmRpYW5fc3dhcF91MzIoaGRyLT5maWxlX3dyYXBfY250KTsKKyAgICBoZHItPndyaXRlX29mZnNldCA9IGJjbW9zX2VuZGlhbl9zd2FwX3UzMihoZHItPndyaXRlX29mZnNldCk7CisgICAgaGRyLT5kYXRhX3NpemUgPSBiY21vc19lbmRpYW5fc3dhcF91MzIoaGRyLT5kYXRhX3NpemUpOworICAgIGhkci0+bnVtX21zZ3MgPSBiY21vc19lbmRpYW5fc3dhcF91MzIoaGRyLT5udW1fbXNncyk7CisjZW5kaWYKKworICAgIG1lbXNldChmaWxlLCAwLCBzaXplb2YoKmZpbGUpKTsKKyAgICBmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciA9IGJ1ZjsKKyAgICBmaWxlLT5maWxlX3Bhcm0uc2l6ZSA9IGJ1Zl9sZW47CisgICAgZmlsZS0+ZmlsZV9wYXJtLmZsYWdzID0gQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEOworICAgIHNldF9kZWZhdWx0X2ZpbGVfY2FsbGJhY2tzKGZpbGUpOworICAgIHJjID0gZGVmYXVsdF9vcGVuX2NhbGxiYWNrX2NvbmRfcmVzZXQoJmZpbGUtPmZpbGVfcGFybSwgZmlsZSwgQkNNT1NfRkFMU0UpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgaWYgKCFmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLm51bV9tc2dzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXRhY2ggZmlsZSBoYW5kbGUgZnJvbSBtZW1vcnkgYnVmZmVyICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19maWxlX2RldGFjaChiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGlmICghZmlsZSB8fCAhKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgZmlsZS0+ZmlsZV9wYXJtLmZsYWdzID0gQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEOworICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKyNpZmRlZiBCQ01fT1NfUE9TSVgKKyAgICAvKiBSZWd1bGFyIGZpbGUgY2FsbGJhY2tzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogT1BFTiBDQUxMQkFDSzogb3BlbiBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlX3Bhcm0gLSBmaWxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGUgICAgICAtIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfcmVnX2ZpbGVfb3Blbihjb25zdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gKmZpbGVfcGFybSwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgZmlsZS0+ZmlsZV9wYXJtID0gKmZpbGVfcGFybTsKKyAgICBmaWxlLT51LnJlZ19maWxlX2hhbmRsZSA9IGZvcGVuKChjaGFyICopZmlsZV9wYXJtLT51ZGVmX3Bhcm1zLCAidysiKTsKKyAgICBpZiAoIWZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJERVZfTE9HOiBjYW4ndCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRpbmdcbiIsIChjaGFyICopZmlsZV9wYXJtLT51ZGVmX3Bhcm1zKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9JTzsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDTE9TRSBDQUxMQkFDSzogY2xvc2UgbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZSAgICAgIC0gZmlsZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBfZGV2X2xvZ19yZWdfZmlsZV9jbG9zZShiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGlmIChmaWxlLT51LnJlZ19maWxlX2hhbmRsZSkKKyAgICB7CisgICAgICAgIGZjbG9zZShmaWxlLT51LnJlZ19maWxlX2hhbmRsZSk7CisgICAgICAgIGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkVXSU5EIENBTExCQUNLOiBjbGVhcnMgbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlICAgICAgLSBmaWxlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfbG9nX3JlZ19maWxlX3Jld2luZChiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgRklMRSAqZjsKKworICAgIGlmIChmaWxlLT51LnJlZ19maWxlX2hhbmRsZSkKKyAgICB7CisgICAgICAgIGYgPSBmcmVvcGVuKChjb25zdCBjaGFyICopZmlsZS0+ZmlsZV9wYXJtLnVkZWZfcGFybXMsICJ3KyIsIGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gZikKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUgPSBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9JTzsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiREVWX0xPRzogY2FuJ3Qgb3BlbiBmaWxlICVzIGZvciB3cml0aW5nXG4iLCAoY2hhciAqKWZpbGUtPmZpbGVfcGFybS51ZGVmX3Bhcm1zKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkVBRF9DQUxMQkFDSzogcmVhZCBmb3JtIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBvZmZzZXQgLSB0aGUgb2Zmc2V0IGluIGJ5dGVzIHRvIHJlYWQgZnJvbSwgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gQnVmZmVyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIGZyb20gZmlsZSBvciAwIGlmIEVPRiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfZGV2X2xvZ19yZWdfZmlsZV9yZWFkKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIHVpbnQzMl90ICpvZmZzZXQsIHZvaWQgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKQoreworICAgIGludCBuID0gMDsKKyAgICBpZiAoZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpCisgICAgeworICAgICAgICBpZiAoIWZzZWVrKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlLCBTRUVLX1NFVCwgKm9mZnNldCkpCisgICAgICAgICAgICBuID0gZnJlYWQoYnVmLCAxLCBsZW5ndGgsIGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKTsKKyAgICAgICAgKm9mZnNldCA9IGZ0ZWxsKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIChuIDwgMCkgPyAwIDogbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXUklURV9DQUxMQkFDSzogd3JpdGUgZm9ybSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFRoZSBidWZmZXIgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIGZpbGUgb3IgMCBpZiBFT0YgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfZGV2X2xvZ19yZWdfZmlsZV93cml0ZShiY21fZGV2X2xvZ19maWxlICpmaWxlLCBjb25zdCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBjb25zdCBjaGFyICpjYnVmID0gKGNvbnN0IGNoYXIgKilidWY7CisgICAgaW50IG4gPSAwOworICAgIGlmIChmaWxlLT51LnJlZ19maWxlX2hhbmRsZSkKKyAgICB7CisgICAgICAgIC8qIFJlbW92ZSAwIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgaWYgKGxlbmd0aCAmJiAhY2J1ZltsZW5ndGgtMV0pCisgICAgICAgICAgICAtLWxlbmd0aDsKKyAgICAgICAgbiA9IGZ3cml0ZShidWYsIDEsIGxlbmd0aCwgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgICAgICBmZmx1c2goZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgc2V0X3JlZ3VsYXJfZmlsZV9jYWxsYmFja3MoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBmaWxlLT5maWxlX3Bhcm0ub3Blbl9jYiAgPSBfZGV2X2xvZ19yZWdfZmlsZV9vcGVuOworICAgIGZpbGUtPmZpbGVfcGFybS5jbG9zZV9jYiAgPSBfZGV2X2xvZ19yZWdfZmlsZV9jbG9zZTsKKyAgICBmaWxlLT5maWxlX3Bhcm0ucmVhZF9jYiAgPSBfZGV2X2xvZ19yZWdfZmlsZV9yZWFkOworICAgIGZpbGUtPmZpbGVfcGFybS53cml0ZV9jYiA9IF9kZXZfbG9nX3JlZ19maWxlX3dyaXRlOworICAgIGZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IgPSBfZGV2X2xvZ19yZWdfZmlsZV9yZXdpbmQ7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQkNNX09TX1BPU0lYICovCisKKyNpZmRlZiBERVZfTE9HX1NZU0xPRworICAgIC8qIGxpbnV4IHN5c2xvZyBpbnRlZ3JhdGlvbiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBPUEVOIENBTExCQUNLOiBvcGVuIHN5c2xvZyBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGVfcGFybS0+dWRlZl9wYXJtIGNvbnRhaW5zIG9wdGlvbmFsIGxvZyBpZGVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfb3Blbihjb25zdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gKmZpbGVfcGFybSwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBmaWxlLT5maWxlX3Bhcm0gPSAqZmlsZV9wYXJtOworICAgIG9wZW5sb2coKGNvbnN0IGNoYXIgKilmaWxlX3Bhcm0tPnVkZWZfcGFybXMsIDAsIExPR19VU0VSKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDTE9TRSBDQUxMQkFDSzogY2xvc2Ugc3lzbG9nIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfbG9nX3N5c2xvZ19maWxlX2Nsb3NlKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgY2xvc2Vsb2coKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSRVdJTkQgQ0FMTEJBQ0s6IG5vdCBzdXBwb3J0ZWQgYnkgc3lzbG9nLiBSZXR1cm4gT0sgdG8gcHJldmVudCByZXF1ZXN0IGZhaWx1cmUgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfbG9nX3N5c2xvZ19maWxlX3Jld2luZChiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJFQURfQ0FMTEJBQ0s6IHJlYWRpbmcgZnJvbSBzeXNsb2cgaXMgbm90IHN1cHBvcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9kZXZfbG9nX3N5c2xvZ19maWxlX3JlYWQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKm9mZnNldCwgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV1JJVEVfQ0FMTEJBQ0s6IHdyaXRlIHRvIHN5c2xvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBidWYgICAgLSBUaGUgYnVmZmVyIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGxlbmd0aCAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiB0byBmaWxlIG9yIDAgaWYgRU9GICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX2Rldl9sb2dfc3lzbG9nX2ZpbGVfd3JpdGUoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgY29uc3QgY2hhciAqY2J1ZiA9IChjb25zdCBjaGFyICopYnVmOworICAgIHN0YXRpYyBpbnQgbG9nX3ByaW9yaXR5ID0gTE9HX0RFQlVHOworCisgICAgLyogSWRlbnRpZnkgbG9nIGxvdmVsICovCisgICAgaWYgKGNidWYgJiYgY2J1ZlswXSA9PSAnWycpCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpjbGV2ZWwgPSBzdHJjaHIoY2J1ZiwgJyAnKTsKKyAgICAgICAgaWYgKGNsZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICgqKGNsZXZlbCArIDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgbG9nX3ByaW9yaXR5ID0gTE9HX0NSSVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgICAgICBsb2dfcHJpb3JpdHkgPSBMT0dfRVJSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgbG9nX3ByaW9yaXR5ID0gTE9HX1dBUk5JTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICBsb2dfcHJpb3JpdHkgPSBMT0dfSU5GTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIGxvZ19wcmlvcml0eSA9IExPR19ERUJVRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3lzbG9nKGxvZ19wcmlvcml0eSwgIiVzIiwgY2J1Zik7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHZvaWQgc2V0X3N5c2xvZ19maWxlX2NhbGxiYWNrcyhiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGZpbGUtPmZpbGVfcGFybS5vcGVuX2NiICA9IF9kZXZfbG9nX3N5c2xvZ19maWxlX29wZW47CisgICAgZmlsZS0+ZmlsZV9wYXJtLmNsb3NlX2NiICA9IF9kZXZfbG9nX3N5c2xvZ19maWxlX2Nsb3NlOworICAgIGZpbGUtPmZpbGVfcGFybS5yZWFkX2NiICA9IF9kZXZfbG9nX3N5c2xvZ19maWxlX3JlYWQ7CisgICAgZmlsZS0+ZmlsZV9wYXJtLndyaXRlX2NiID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfd3JpdGU7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYiA9IF9kZXZfbG9nX3N5c2xvZ19maWxlX3Jld2luZDsKK30KKworI2VuZGlmIC8qICNpZmRlZiBERVZfTE9HX1NZU0xPRyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY3JlYXRlKAorICAgIGNvbnN0IGJjbV9kZXZfbG9nX3Bhcm0gKmRldl9sb2dfcGFybSwKKyAgICBjb25zdCBiY21vc190YXNrX3Bhcm0gKnNhdmVfdGFza19wYXJtLAorICAgIGNvbnN0IGJjbW9zX3Rhc2tfcGFybSAqcHJpbnRfdGFza19wYXJtLAorICAgIGNvbnN0IGJjbW9zX21zZ19xdWV1ZV9wYXJtICpzYXZlX3F1ZXVlX3Bhcm0sCisgICAgY29uc3QgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gKnByaW50X3F1ZXVlX3Bhcm0sCisgICAgY29uc3QgYmNtb3NfbXNnX3Bvb2xfcGFybSAqcG9vbF9wYXJtKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBpbnQgaTsKKworICAgIGlmICghZGV2X2xvZ19wYXJtKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKGRldl9sb2cuc3RhdGUgIT0gQkNNX0RFVl9MT0dfU1RBVEVfVU5JTklUSUFMSVpFRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKworICAgIC8qIFNldCB1c2VyIGNhbGxiYWNrcyAqLworICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtID0gKmRldl9sb2dfcGFybTsKKyAgICBpZiAoIWRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiKQorICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYiA9IGRlZmF1bHRfcHJpbnQ7CisgICAgaWYgKCFkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYikKKyAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0uZ2V0X3RpbWVfY2IgPSBkZWZhdWx0X2dldF90aW1lOworICAgIGlmICghZGV2X2xvZy5kZXZfbG9nX3Bhcm0udGltZV90b19zdHJfY2IpCisgICAgICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnRpbWVfdG9fc3RyX2NiID0gZGVmYXVsdF90aW1lX3RvX3N0cjsKKworICAgIGZvciAoaSA9IDA7IChpIDwgREVWX0xPR19NQVhfRklMRVMpICYmIChkZXZfbG9nX3Bhcm0tPmxvZ19maWxlW2ldLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEKTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogQ29weSBsb2cgZmlsZXMgKi8KKyAgICAgICAgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0gPSBkZXZfbG9nX3Bhcm0tPmxvZ19maWxlW2ldOworICAgICAgICBpZiAoIWRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLm9wZW5fY2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS50eXBlID09IEJDTV9ERVZfTE9HX0ZJTEVfTUVNT1JZKQorICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X2ZpbGVfY2FsbGJhY2tzKCZkZXZfbG9nLmZpbGVzW2ldKTsKKyNpZmRlZiBCQ01fT1NfUE9TSVgKKyAgICAgICAgICAgIGVsc2UgaWYgKGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLnR5cGUgPT0gQkNNX0RFVl9MT0dfRklMRV9SRUdVTEFSKQorICAgICAgICAgICAgICAgIHNldF9yZWd1bGFyX2ZpbGVfY2FsbGJhY2tzKCZkZXZfbG9nLmZpbGVzW2ldKTsKKyNlbmRpZgorI2lmZGVmIERFVl9MT0dfU1lTTE9HCisgICAgICAgICAgICBlbHNlIGlmIChkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS50eXBlID09IEJDTV9ERVZfTE9HX0ZJTEVfU1lTTE9HKQorICAgICAgICAgICAgICAgIHNldF9zeXNsb2dfZmlsZV9jYWxsYmFja3MoJmRldl9sb2cuZmlsZXNbaV0pOworI2VuZGlmCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoImZpbGUlZDogb3Blbl9jYiBtdXN0IGJlIHNldCBmb3IgdXNlci1kZWZpbmVkIGZpbGVcblxuIiwgaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0ub3Blbl9jYigmZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0sICZkZXZfbG9nLmZpbGVzW2ldKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoImZpbGUlZDogb3BlbiBmYWlsZWQ6ICVzICglZClcblxuIiwgaSwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBERVZfTE9HX0lORk9fUFJJTlRGKCJmaWxlOiBzdGFydF9hZGRyOiAweCVwLCBzaXplOiAldSwgbWF4IG1zZyBzaXplICV1XG4iLAorICAgICAgICAgICAgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0uc3RhcnRfYWRkciwgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0uc2l6ZSwgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUpOworICAgIH0KKworICAgIC8qIENyZWF0ZSBwb29sICovCisgICAgZXJyID0gYmNtb3NfbXNnX3Bvb2xfY3JlYXRlKCZkZXZfbG9nLnBvb2wsIHBvb2xfcGFybSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBjcmVhdGUgcG9vbCAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIENyZWF0ZSBtZXNzYWdlIHF1ZXVlcyAqLworICAgIGVyciA9IGJjbW9zX21zZ19xdWV1ZV9jcmVhdGUoJmRldl9sb2cuc2F2ZV9xdWV1ZSwgc2F2ZV9xdWV1ZV9wYXJtKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiKCVzKSBFcnJvcjogQ2FuJ3QgY3JlYXRlIHNhdmUgcXVldWUgKGVycm9yOiAlZClcbiIsIF9fRlVOQ1RJT05fXywgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlcnIgPSBiY21vc19tc2dfcXVldWVfY3JlYXRlKCZkZXZfbG9nLnByaW50X3F1ZXVlLCBwcmludF9xdWV1ZV9wYXJtKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiKCVzKSBFcnJvcjogQ2FuJ3QgY3JlYXRlIHByaW50IHF1ZXVlIChlcnJvcjogJWQpXG4iLCBfX0ZVTkNUSU9OX18sIChpbnQpZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGFza3MgKi8KKyAgICBlcnIgPSBiY21vc190YXNrX2NyZWF0ZSgmZGV2X2xvZy5zYXZlX3Rhc2ssIHNhdmVfdGFza19wYXJtKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IHNwYXduIHNhdmUgdGFzayAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlcnIgPSBiY21vc190YXNrX2NyZWF0ZSgmZGV2X2xvZy5wcmludF90YXNrLCBwcmludF90YXNrX3Bhcm0pOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogQ2FuJ3Qgc3Bhd24gcHJpbnQgdGFzayAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbW9zX3NlbV9jcmVhdGUoJmRldl9sb2cuc2F2ZV90YXNrX2lzX3Rlcm1pbmF0ZWQsIDAsIDAsICJzYXZlX3Rhc2tfc2VtIik7CisgICAgYmNtb3Nfc2VtX2NyZWF0ZSgmZGV2X2xvZy5wcmludF90YXNrX2lzX3Rlcm1pbmF0ZWQsIDAsIDAsICJwcmludF90YXNrX3NlbSIpOworCisgICAgZGV2X2xvZy5zdGF0ZSA9IEJDTV9ERVZfTE9HX1NUQVRFX0VOQUJMRUQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY21fZGV2X2xvZ19kZXN0cm95KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQzMl90IGk7CisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgbXNnX2ZsYWdzOworCisgICAgaWYgKGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfVU5JTklUSUFMSVpFRCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBTZW5kIGEgc2h1dGRvd24gbWVzc2FnZSB0byBlYWNoIHRhc2suIFdoZW4gcmVjZWl2ZWQgYnkgdGhlIG1haW4gbG9vcHMsIGl0IHdpbGwgdGVhciBkb3duIHRoZSB0YXNrcyBncmFjZWZ1bGx5LgorICAgICAqIElmIHRoZSBmbGFnIGlzIHNldCB0byB0ZWFyIGRvd24gaW1tZWRpYXRlbHksIHdlJ2xsIHNlbmQgYW4gVVJHRU5UIHRlYXJkb3duIG1lc3NhZ2UsIHNvIGl0J2xsIGJlIGhhbmRsZWQgYmVmb3JlCisgICAgICogYWxsIG91c3RhbmRpbmcgbG9nIG1lc3NhZ2VzICh0aGUgb3VzdGFuZGluZyBsb2cgbWVzc2FnZXMgd2lsbCBiZSBmcmVlZCBkdXJpbmcgYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3kpLiAqLworICAgIG1zZ19mbGFncyA9IEJDTU9TX01TR19TRU5EX05PTElNSVQ7CisgICAgaWYgKChkZXZfbG9nLmZsYWdzICYgQkNNX0RFVl9MT0dfRkxBR19ERVNUUk9ZX0lNTUVESUFURUxZKSAhPSAwKQorICAgICAgICBtc2dfZmxhZ3MgfD0gQkNNT1NfTVNHX1NFTkRfVVJHRU5UOworCisgICAgLyogVGhlIHNhdmUgdGFzayBkZXBlbmRzIG9uIHRoZSBwcmludCB0YXNrLCBzbyB3ZSB0ZXJtaW5hdGUgdGhlIHNhdmUgdGFzayBmaXJzdC4gKi8KKyAgICBiY21vc19tc2dfc2VuZCgmZGV2X2xvZy5zYXZlX3F1ZXVlLCAmc2h1dGRvd25fbXNnLCBtc2dfZmxhZ3MpOworICAgIGJjbW9zX3NlbV93YWl0KCZkZXZfbG9nLnNhdmVfdGFza19pc190ZXJtaW5hdGVkLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworCisgICAgYmNtb3NfbXNnX3NlbmQoJmRldl9sb2cucHJpbnRfcXVldWUsICZzaHV0ZG93bl9tc2csIG1zZ19mbGFncyk7CisgICAgYmNtb3Nfc2VtX3dhaXQoJmRldl9sb2cucHJpbnRfdGFza19pc190ZXJtaW5hdGVkLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworCisgICAgYmNtb3Nfc2VtX2Rlc3Ryb3koJmRldl9sb2cuc2F2ZV90YXNrX2lzX3Rlcm1pbmF0ZWQpOworICAgIGJjbW9zX3NlbV9kZXN0cm95KCZkZXZfbG9nLnByaW50X3Rhc2tfaXNfdGVybWluYXRlZCk7CisKKyAgICBlcnIgPSBiY21vc190YXNrX2Rlc3Ryb3koJmRldl9sb2cuc2F2ZV90YXNrKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGRlc3Ryb3kgZGV2X2xvZyBzYXZlIHRhc2sgKGVycm9yOiAlZClcbiIsIChpbnQpZXJyKTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vc190YXNrX2Rlc3Ryb3koJmRldl9sb2cucHJpbnRfdGFzayk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBkZXN0cm95IGRldl9sb2cgcHJpbnQgdGFzayAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KCZkZXZfbG9nLnNhdmVfcXVldWUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogQ2FuJ3QgZGVzdHJveSBzYXZlIHF1ZXVlIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgfQorCisgICAgZXJyID0gYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3koJmRldl9sb2cucHJpbnRfcXVldWUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogQ2FuJ3QgZGVzdHJveSBwcmludCBxdWV1ZSAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX21zZ19wb29sX2Rlc3Ryb3koJmRldl9sb2cucG9vbCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBkZXN0cm95IHBvb2wgKGVycm9yOiAlZClcbiIsIChpbnQpZXJyKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyAoaSA8IERFVl9MT0dfTUFYX0ZJTEVTKSAmJiAoZGV2X2xvZy5kZXZfbG9nX3Bhcm0ubG9nX2ZpbGVbaV0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpOyBpKyspCisgICAgeworICAgICAgICBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5jbG9zZV9jYigmZGV2X2xvZy5maWxlc1tpXSk7CisgICAgfQorCisgICAgZGV2X2xvZy5zdGF0ZSA9IEJDTV9ERVZfTE9HX1NUQVRFX1VOSU5JVElBTElaRUQ7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnIG1zZzsKKyAgICBkZXZfbG9nX3F1ZXVlX21zZyBsb2dfcXVldWVfbXNnOworICAgIGJjbW9zX2Jvb2wgbG9jazsKKyAgICBiY21vc19mYXN0bG9jayBmYXN0bG9jazsKK30gYmNtX2Rldl9sb2dfZHJvcF9tc2c7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtX2Rldl9sb2dfZHJvcF9tc2cgbXNnOworICAgIHVpbnQzMl90IGRyb3BzOworICAgIHVpbnQzMl90IHJlcG9ydGVkX2Ryb3BzOworICAgIGJjbW9zX3RpbWVyIHRpbWVyOworICAgIHVpbnQzMl90IGxhc3RfcmVwb3J0X3RpbWVzdGFtcDsKK30gYmNtX2Rldl9sb2dfZHJvcDsKKworc3RhdGljIGJjbV9kZXZfbG9nX2Ryb3AgZGV2X2xvZ19kcm9wOworCitzdGF0aWMgdm9pZCBiY21fZGV2X2xvZ19sb2dfbWVzc2FnZV9yZWxlYXNlX2Ryb3AoYmNtb3NfbXNnICptKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2spOworICAgIGRldl9sb2dfZHJvcC5tc2cubG9jayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworCisgICAgLyogU2NoZWR1bGUgYSB0aW1lciB0byByZXBvcnQgZXh0cmEgZHJvcHMsIGJlY2F1c2Ugd2UgbWF5IG5vdCBtZWV0IERFVl9MT0dfRFJPUF9SRVBPUlRfRFJPUF9USFJFU0hPTEQgc29vbi4gKi8KKyAgICBiY21vc190aW1lcl9zdGFydCgmZGV2X2xvZ19kcm9wLnRpbWVyLCBERVZfTE9HX0RST1BfUkVQT1JUX1JBVEVfVVMpOworfQorCitzdGF0aWMgdm9pZCBfYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQodm9pZCkKK3sKKyAgICBiY21vc19tc2cgKm1zZzsKKyAgICBkZXZfbG9nX3F1ZXVlX21zZyAqbG9nX3F1ZXVlX21zZzsKKworICAgIG1zZyA9ICZkZXZfbG9nX2Ryb3AubXNnLm1zZzsKKyAgICBtc2ctPnJlbGVhc2UgPSBiY21fZGV2X2xvZ19sb2dfbWVzc2FnZV9yZWxlYXNlX2Ryb3A7CisgICAgbG9nX3F1ZXVlX21zZyA9ICZkZXZfbG9nX2Ryb3AubXNnLmxvZ19xdWV1ZV9tc2c7CisgICAgbG9nX3F1ZXVlX21zZy0+ZmxhZ3MgPSBCQ01fTE9HX0ZMQUdfRE9OVF9TS0lQX1BSSU5UOworICAgIGxvZ19xdWV1ZV9tc2ctPnRpbWVfc3RhbXAgPSBkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYigpOworICAgIGxvZ19xdWV1ZV9tc2ctPm1zZ19sZXZlbCA9IERFVl9MT0dfTEVWRUxfRVJST1I7CisgICAgbG9nX3F1ZXVlX21zZy0+dS5mbXRfYXJncy5mbXQgPSAiTG9nIG1lc3NhZ2UgcG9vbCBleGhhdXN0ZWQsIGRyb3BwZWQgbWVzc2FnZSBjb3VudD0ldVxuIjsKKyAgICBsb2dfcXVldWVfbXNnLT51LmZtdF9hcmdzLmFyZ3NbMF0gPSAoY29uc3Qgdm9pZCAqKSh1bnNpZ25lZCBsb25nKShkZXZfbG9nX2Ryb3AuZHJvcHMgLSBkZXZfbG9nX2Ryb3AucmVwb3J0ZWRfZHJvcHMpOworICAgIGxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1sxXSA9CisgICAgICAgIGxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1swXTsgLyogYXJnc1swXSBtYXkgb3IgbWF5IG5vdCBiZSBza2lwcGVkIGRlcGVuZGluZyBvbiBhbGlnbm1lbnQgKi8KKyAgICBsb2dfcXVldWVfbXNnLT5sb2dfaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopZGVmX2xvZ19pZDsKKyAgICBsb2dfcXVldWVfbXNnLT50aW1lX3N0YW1wID0gZGV2X2xvZy5kZXZfbG9nX3Bhcm0uZ2V0X3RpbWVfY2IoKTsKKyAgICBkZXZfbG9nX2Ryb3AucmVwb3J0ZWRfZHJvcHMgPSBkZXZfbG9nX2Ryb3AuZHJvcHM7CisgICAgZGV2X2xvZ19kcm9wLmxhc3RfcmVwb3J0X3RpbWVzdGFtcCA9IGJjbW9zX3RpbWVzdGFtcCgpOworCisgICAgbXNnLT5kYXRhID0gbG9nX3F1ZXVlX21zZzsKKyAgICBtc2ctPnNpemUgPSBzaXplb2YoKmxvZ19xdWV1ZV9tc2cpOworICAgIGJjbW9zX21zZ19zZW5kKCZkZXZfbG9nLnNhdmVfcXVldWUsIG1zZywgMCk7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgZGV2X2xvZ19kcm9wLmRyb3BzKys7CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2spOworICAgIC8qIFRoZSAxc3QgZHJvcCByZXBvcnQgd2lsbCBiZSBkb25lIGltbWVkaWF0ZWx5LCBiZWNhdXNlIGFsdGhvdWdoIERFVl9MT0dfRFJPUF9SRVBPUlRfRFJPUF9USFJFU0hPTEQgaXNuJ3QgcmVhY2hlZCwgdGhlIHRpbWUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4KKyAgICAgKiBERVZfTE9HX0RST1BfUkVQT1JUX1JBVEVfVVMuICovCisgICAgaWYgKGRldl9sb2dfZHJvcC5tc2cubG9jayB8fAorICAgICAgICAoKGRldl9sb2dfZHJvcC5kcm9wcyAtIGRldl9sb2dfZHJvcC5yZXBvcnRlZF9kcm9wcyA8IERFVl9MT0dfRFJPUF9SRVBPUlRfRFJPUF9USFJFU0hPTEQpICYmCisgICAgICAgIChiY21vc190aW1lc3RhbXAoKSAtIGRldl9sb2dfZHJvcC5sYXN0X3JlcG9ydF90aW1lc3RhbXAgPCBERVZfTE9HX0RST1BfUkVQT1JUX1JBVEVfVVMpKSkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGV2X2xvZ19kcm9wLm1zZy5sb2NrID0gQkNNT1NfVFJVRTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2ssIGZsYWdzKTsKKworICAgIC8qIERvIHRoZSBhY3R1YWwgcmVwb3J0LiAqLworICAgIF9iY21fZGV2X2xvZ19kcm9wX3JlcG9ydCgpOworfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgYmNtX2Rldl9sb2dfZHJvcF90aW1lcl9jYihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrKTsKKyAgICBpZiAoZGV2X2xvZ19kcm9wLm1zZy5sb2NrKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrLCBmbGFncyk7CisgICAgICAgIC8qIExvZ2dlciB0YXNrIGhhc24ndCByZWxlYXNlZCB0aGUgbG9jayB5ZXQgKHRoZSBkcm9wIG1lc3NhZ2UgaGFzbid0IGJlZW4gcmVwb3J0ZWQgeWV0KSAtPiByZXNjaGVkdWxlIHRoZSB0aW1lci4gKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmRldl9sb2dfZHJvcC50aW1lciwgREVWX0xPR19EUk9QX1JFUE9SVF9SQVRFX1VTKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGRldl9sb2dfZHJvcC5kcm9wcyA9PSBkZXZfbG9nX2Ryb3AucmVwb3J0ZWRfZHJvcHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vIG5ldyBkcm9wcyB0byByZXBvcnQuICovCisgICAgICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKKyAgICAgICAgfQorICAgICAgICBkZXZfbG9nX2Ryb3AubXNnLmxvY2sgPSBCQ01PU19UUlVFOworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2ssIGZsYWdzKTsKKworICAgICAgICAvKiBEbyB0aGUgYWN0dWFsIHJlcG9ydC4gKi8KKyAgICAgICAgX2JjbV9kZXZfbG9nX2Ryb3BfcmVwb3J0KCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pbml0X2RlZmF1bHRfbG9nZ2VyX2V4dCgKKyAgICBiY21fZGV2X2xvZ19wYXJtICpkZXZfbG9nX3Bhcm0sCisgICAgdWludDMyX3QgbnVtX2ZpbGVzLAorICAgIHVpbnQzMl90IHN0YWNrX3NpemUsCisgICAgYmNtb3NfdGFza19wcmlvcml0eSBwcmlvcml0eSwKKyAgICB1aW50MzJfdCBwb29sX3NpemUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX3Rhc2tfcGFybSBzYXZlX3Rhc2tfcGFybSA9IHswfTsKKyAgICBiY21vc190YXNrX3Bhcm0gcHJpbnRfdGFza19wYXJtID0gezB9OworICAgIGJjbW9zX21zZ19xdWV1ZV9wYXJtIHByaW50X3F1ZXVlX3Bhcm0gPSB7MH07CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gc2F2ZV9xdWV1ZV9wYXJtID0gezB9OworICAgIGJjbW9zX21zZ19wb29sX3Bhcm0gcG9vbF9wYXJtID0gezB9OworICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gImRldl9sb2dfZHJvcF90aW1lciIsCisgICAgICAgIC5vd25lciA9IEJDTU9TX01PRFVMRV9JRF9OT05FLCAvKiBXaWxsIGJlIGNhbGxlZCBpbiBJU1IgY29udGV4dCAqLworICAgICAgICAuaGFuZGxlciA9IGJjbV9kZXZfbG9nX2Ryb3BfdGltZXJfY2IsCisgICAgfTsKKworICAgIGlmICghZGV2X2xvZ19wYXJtKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBkZXZfbG9nX3Bhcm0gbXVzdCBiZSBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHNhdmVfdGFza19wYXJtLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgc2F2ZV90YXNrX3Bhcm0uc3RhY2tfc2l6ZSA9IHN0YWNrX3NpemU7CisgICAgc2F2ZV90YXNrX3Bhcm0ubmFtZSA9ICJkZXZfbG9nX3NhdmUiOworICAgIHNhdmVfdGFza19wYXJtLmhhbmRsZXIgPSBkZXZfbG9nX3NhdmVfdGFzazsKKyAgICBzYXZlX3Rhc2tfcGFybS5kYXRhID0gMDsKKworICAgIHByaW50X3Rhc2tfcGFybS5wcmlvcml0eSA9IHByaW9yaXR5OworICAgIHByaW50X3Rhc2tfcGFybS5zdGFja19zaXplID0gc3RhY2tfc2l6ZTsKKyAgICBwcmludF90YXNrX3Bhcm0ubmFtZSA9ICJkZXZfbG9nX3ByaW50IjsKKyAgICBwcmludF90YXNrX3Bhcm0uaGFuZGxlciA9IGRldl9sb2dfcHJpbnRfdGFzazsKKyAgICBwcmludF90YXNrX3Bhcm0uZGF0YSA9IDA7CisKKyAgICAvKiBJdCBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgdGVybWluYXRpbmcgbG9nZ2VyIHRhc2sgZHVyaW5nIGFuIGV4Y2VwdGlvbiwgYXMgbG9nZ2VyIHRhc2sgaXMgbG93IHByaW9yaXR5IGFuZCBtaWdodCBoYXZlIGJhY2tsb2cgb2YgdW5oYW5kbGVkIG1lc3NhZ2VzLgorICAgICAqIEV2ZW4gaWYgYXMgYSByZXN1bHQgb2YgdGhlIGV4Y2VwdGlvbiB0aGUgbG9nZ2VyIHRhc2sgd2lsbCBiZSBpbiBhIGRlYWRsb2NrIHdhaXRpbmcgZm9yIGEgcmVzb3VyY2UgKHNlbWFwaG9yZS9tdXRleC90aW1lciksIGl0IGlzIGluIGxvd2VyIHByaW9yaXR5IHRoYW4gQ0xJIGFuZCB0aHVzIHNob3VsZCBub3QgYmxvY2sKKyAgICAgKiBDTEkuICovCisgICAgc2F2ZV90YXNrX3Bhcm0uZmxhZ3MgPSBCQ01PU19UQVNLX0ZMQUdfTk9fU1VTUEVORF9PTl9PT1BTOworICAgIHByaW50X3Rhc2tfcGFybS5mbGFncyA9IEJDTU9TX1RBU0tfRkxBR19OT19TVVNQRU5EX09OX09PUFM7CisKKyAgICBzYXZlX3F1ZXVlX3Bhcm0ubmFtZSA9ICJkZXZfbG9nX3NhdmUiOworICAgIHNhdmVfcXVldWVfcGFybS5zaXplID0gMDsgLyogdW5saW1pdGVkICovCisgICAgcHJpbnRfcXVldWVfcGFybS5uYW1lID0gImRldl9sb2dfcHJpbnQiOworICAgIHByaW50X3F1ZXVlX3Bhcm0uc2l6ZSA9IDA7IC8qIHVubGltaXRlZCAqLworCisgICAgcG9vbF9wYXJtLm5hbWUgPSAiZGV2X2xvZyI7CisgICAgcG9vbF9wYXJtLnNpemUgPSBwb29sX3NpemU7CisgICAgcG9vbF9wYXJtLmRhdGFfc2l6ZSA9IHNpemVvZihkZXZfbG9nX3F1ZXVlX21zZyk7CisKKyAgICBkZWZfbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoImRlZmF1bHQiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBlcnIgPSBiY21vc190aW1lcl9jcmVhdGUoJmRldl9sb2dfZHJvcC50aW1lciwgJnRpbWVyX3BhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKGVyciwgZXJyLCAiYmNtb3NfdGltZXJfY3JlYXRlIik7CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgMCk7CisKKyAgICBpZiAoIWRldl9sb2dfcGFybS0+Z2V0X3RpbWVfY2IpCisgICAgICAgIGRldl9sb2dfcGFybS0+Z2V0X3RpbWVfY2IgPSBiY21vc190aW1lc3RhbXA7CisKKyAgICBlcnIgPSBiY21fZGV2X2xvZ19jcmVhdGUoCisgICAgICAgIGRldl9sb2dfcGFybSwKKyAgICAgICAgJnNhdmVfdGFza19wYXJtLAorICAgICAgICAmcHJpbnRfdGFza19wYXJtLAorICAgICAgICAmc2F2ZV9xdWV1ZV9wYXJtLAorICAgICAgICAmcHJpbnRfcXVldWVfcGFybSwKKyAgICAgICAgJnBvb2xfcGFybSk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKGVyciwgZXJyLCAiYmNtX2Rldl9sb2dfY3JlYXRlIik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXIodm9pZCAqKnN0YXJ0X2FkZHJlc3NlcywKKyAgICB1aW50MzJfdCAqc2l6ZXMsCisgICAgYmNtX2Rldl9sb2dfZmlsZV9mbGFncyAqZmxhZ3MsCisgICAgdWludDMyX3QgbnVtX2ZpbGVzLAorICAgIHVpbnQzMl90IHN0YWNrX3NpemUsCisgICAgYmNtb3NfdGFza19wcmlvcml0eSBwcmlvcml0eSwKKyAgICB1aW50MzJfdCBwb29sX3NpemUpCit7CisgICAgYmNtX2Rldl9sb2dfcGFybSBkZXZfbG9nX3Bhcm0gPSB7MH07CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZmlsZXM7IGkrKykKKyAgICB7CisgICAgICAgIGRldl9sb2dfcGFybS5sb2dfZmlsZVtpXS5zdGFydF9hZGRyID0gc3RhcnRfYWRkcmVzc2VzW2ldOworICAgICAgICBkZXZfbG9nX3Bhcm0ubG9nX2ZpbGVbaV0uc2l6ZSA9IHNpemVzW2ldOworICAgICAgICAvKiBzaXplW2ldIG1pZ2h0IGJlIDAgaW4gc2ltdWxhdGlvbiBidWlsZCBmb3Igc3JhbSBidWZmZXIuICovCisgICAgICAgIGRldl9sb2dfcGFybS5sb2dfZmlsZVtpXS5mbGFncyA9IChzaXplc1tpXSA/IEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCA6IEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19OT05FKSB8CisgICAgICAgICAgICAoZmxhZ3MgPyBmbGFnc1tpXSA6IEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORCk7CisgICAgfQorCisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXJfZXh0KCZkZXZfbG9nX3Bhcm0sIG51bV9maWxlcywgc3RhY2tfc2l6ZSwgcHJpb3JpdHksCisgICAgICAgIHBvb2xfc2l6ZSk7Cit9CisKK2xvZ19uYW1lX3RhYmxlIGxvZ3NfbmFtZXNbREVWX0xPR19NQVhfSURTXTsKK3VpbnQ4X3QgbG9nX25hbWVfdGFibGVfaW5kZXggPSAwOworCitzdGF0aWMgdm9pZCBkZXZfbG9nX2FkZF9sb2dfbmFtZV90b190YWJsZShjb25zdCBjaGFyICp4aV9uYW1lKQoreworICAgIGNoYXIgbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FICsgMV0gPSB7fTsKKyAgICBjaGFyICpwID0gbmFtZTsKKyAgICBjaGFyICpwX2VuZDsKKyAgICBpbnQgaSA9IDA7CisgICAgbG9uZyB2YWwgPSAtMTsKKworICAgIHN0cm5jcHkobmFtZSwgeGlfbmFtZSwgTUFYX0RFVl9MT0dfSURfTkFNRSk7CisgICAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgICAgLyogV2hpbGUgdGhlcmUgYXJlIG1vcmUgY2hhcmFjdGVycyB0byBwcm9jZXNzLi4uICovCisgICAgICAgIGlmIChpc2RpZ2l0KCpwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVXBvbiBmaW5kaW5nIGEgZGlnaXQsIC4uLiAqLworICAgICAgICAgICAgdmFsID0gc3RydG9sKHAsICZwX2VuZCwgMTApOyAvKiBSZWFkIGEgbnVtYmVyLCAuLi4gKi8KKyAgICAgICAgICAgIGlmICgobmFtZSArIHN0cmxlbihuYW1lKSkgIT0gcF9lbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBkZXZfbG9nX2FkZF9sb2dfbmFtZV90b190YWJsZSAlcylcbiIsIHhpX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnAgPSAnXDAnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE90aGVyd2lzZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBjaGFyYWN0ZXIuICovCisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxvZ19uYW1lX3RhYmxlX2luZGV4OyBpKyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGxvZ3NfbmFtZXNbaV0ubmFtZSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbCA8IGxvZ3NfbmFtZXNbaV0uZmlyc3RfaW5zdGFuY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nc19uYW1lc1tpXS5maXJzdF9pbnN0YW5jZSA9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWwgPiBsb2dzX25hbWVzW2ldLmxhc3RfaW5zdGFuY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nc19uYW1lc1tpXS5sYXN0X2luc3RhbmNlID0gdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChpID09IGxvZ19uYW1lX3RhYmxlX2luZGV4KSAmJiAoaSA8IERFVl9MT0dfTUFYX0lEUykpCisgICAgeworICAgICAgICBzdHJuY3B5KGxvZ3NfbmFtZXNbaV0ubmFtZSwgbmFtZSwgTUFYX0RFVl9MT0dfSURfTkFNRSk7CisgICAgICAgIGlmICh2YWwgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCA9IExPR19OQU1FX05PX0lOU1RBTkNFOworICAgICAgICB9CisgICAgICAgIGxvZ3NfbmFtZXNbaV0ubGFzdF9pbnN0YW5jZSA9IHZhbDsKKyAgICAgICAgbG9nc19uYW1lc1tpXS5maXJzdF9pbnN0YW5jZSA9IHZhbDsKKyAgICAgICAgbG9nX25hbWVfdGFibGVfaW5kZXgrKzsKKyAgICB9Cit9CisKK3ZvaWQgZGV2X2xvZ19nZXRfbG9nX25hbWVfdGFibGUoY2hhciAqYnVmZmVyLCB1aW50MzJfdCBidWZfbGVuKQoreworICAgIHVpbnQzMl90IGkgPSAwOworICAgIHVpbnQzMl90IGJ1Zl9sZW5fZnJlZSAgPSBidWZfbGVuOworCisgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nX25hbWVfdGFibGVfaW5kZXg7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlID09IExPR19OQU1FX05PX0lOU1RBTkNFKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZigmYnVmZmVyW3N0cmxlbihidWZmZXIpXSwgYnVmX2xlbl9mcmVlLCAiJXNcbiIsIGxvZ3NfbmFtZXNbaV0ubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZigmYnVmZmVyW3N0cmxlbihidWZmZXIpXSwgYnVmX2xlbl9mcmVlLCAiJXMgJWQgLSAlZFxuIiwgbG9nc19uYW1lc1tpXS5uYW1lLCBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlLCBsb2dzX25hbWVzW2ldLmxhc3RfaW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcltidWZfbGVuIC0gMV0gPSAnXDAnOworICAgICAgICBidWZfbGVuX2ZyZWUgPSBidWZfbGVuIC0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZfbGVuX2ZyZWUgPD0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBkZXZfbG9nX2dldF9sb2dfbmFtZV90YWJsZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworZGV2X2xvZ19pZCBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihjb25zdCBjaGFyICp4aV9uYW1lLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2RlZmF1bHRfbG9nX2xldmVsLAorICAgIGJjbV9kZXZfbG9nX2lkX3R5cGUgeGlfZGVmYXVsdF9sb2dfdHlwZSkKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKm5ld19pZDsKKworICAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSByb29tIGZvciBvbmUgbW9yZSBJRCAqLworICAgIGlmIChkZXZfbG9nLm51bV9pZHMgPT0gQkNNX1NJWkVPRkFSUkFZKGRldl9sb2cuaWRzKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogd3JvbmcgcGFyYW1ldGVyc1xuIik7CisgICAgICAgIHJldHVybiBERVZfTE9HX0lOVkFMSURfSUQ7CisgICAgfQorCisgICAgLyogR2V0IG5leHQgZnJlZSBsb2dfaWQgaW4gYXJyYXkgYW5kIGluY3JlbWVudCBuZXh0X2lkLgorICAgICAqIFRoZSBuZXdfaWQgc3RydWN0dXJlIGlzIGNsZWFuIGJlY2F1c2UgdGhlIHdob2xlIGRldl9sb2cgYXJyYXkgaXMgaW4gQlNTCisgICAgICovCisgICAgbmV3X2lkID0gJmRldl9sb2cuaWRzW2Rldl9sb2cubnVtX2lkcysrXTsKKworICAgIC8qIEFkZCBwcmVmaXggZm9yIGtlcm5lbCBsb2dfaWRzIGluIG9yZGVyIHRvIGF2b2lkIGNsYXNoIHdpdGggc2ltaWxhcmx5LW5hbWVzIGxvZ3MgaW4gdGhlIHVzZXIgc3BhY2UgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisgICAgc3RyY3B5KG5ld19pZC0+bmFtZSwgImtfIik7CisjZW5kaWYKKworICAgIC8qIFNldCBsb2dfaWQgcGFyYW1ldGVycyAqLworICAgIHN0cm5jYXQobmV3X2lkLT5uYW1lLCB4aV9uYW1lLCBzaXplb2YobmV3X2lkLT5uYW1lKS1zdHJsZW4obmV3X2lkLT5uYW1lKSk7CisgICAgbmV3X2lkLT5uYW1lW01BWF9ERVZfTE9HX0lEX05BTUUtMV0gPSAnXDAnOworCisgICAgbmV3X2lkLT5kZWZhdWx0X2xvZ190eXBlICA9IHhpX2RlZmF1bHRfbG9nX3R5cGU7CisgICAgbmV3X2lkLT5kZWZhdWx0X2xvZ19sZXZlbCA9IHhpX2RlZmF1bHRfbG9nX2xldmVsOworCisgICAgZGV2X2xvZ19hZGRfbG9nX25hbWVfdG9fdGFibGUobmV3X2lkLT5uYW1lKTsKKworICAgIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdCgoZGV2X2xvZ19pZCluZXdfaWQpOworICAgIG5ld19pZC0+c3R5bGUgPSBCQ01fREVWX0xPR19TVFlMRV9OT1JNQUw7CisKKyAgICByZXR1cm4gKGRldl9sb2dfaWQpbmV3X2lkOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfdHlwZShkZXZfbG9nX2lkIHhpX2lkLCBiY21fZGV2X2xvZ19pZF90eXBlIHhpX2xvZ190eXBlKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBJbiBsaW51eCBrZXJuZWwgd2Ugb25seSBzdXBwb3J0IHNhdmUgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisgICAgaWYgKHhpX2xvZ190eXBlICYgREVWX0xPR19JRF9UWVBFX0JPVEgpCisgICAgICAgIHhpX2xvZ190eXBlID0gREVWX0xPR19JRF9UWVBFX1NBVkU7CisjZW5kaWYKKworICAgIERFVl9MT0dfSU5GT19QUklOVEYoIklEOiAweCVseCwgTmV3IGxvZyB0eXBlOiAlZFxuIiwgeGlfaWQsIChpbnQpeGlfbG9nX3R5cGUpOworCisgICAgaWQtPmxvZ190eXBlID0geGlfbG9nX3R5cGU7CisKKyAgICAvKiBJbiBsaW51eCB1c2VyIHNwYWNlIHdlIG5lZWQgdG8gbm90aWZ5IGtlcm5lbCBpbnRlZ3JhdGlvbiBjb2RlICovCisjaWYgZGVmaW5lZChMSU5VWF9LRVJORUxfU1BBQ0UpICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisgICAgYmNtX2Rldl9sb2dfbGludXhfaWRfc2V0X3R5cGUoeGlfaWQsIHhpX2xvZ190eXBlKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbChkZXZfbG9nX2lkIHhpX2lkLCBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWxfcHJpbnQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbF9zYXZlKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBpZiAoKHhpX2xvZ19sZXZlbF9wcmludCA+PSBERVZfTE9HX0xFVkVMX05VTV9PRikgfHwgKHhpX2xvZ19sZXZlbF9zYXZlID49IERFVl9MT0dfTEVWRUxfTlVNX09GKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogd3JvbmcgcGFyYW1ldGVyc1xuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiSUQ6IDB4JXAsIE5ldzogeGlfbG9nX2xldmVsX3ByaW50PSV1LCB4aV9sb2dfbGV2ZWxfc2F2ZT0ldVxuIiwKKyAgICAgICAgKHZvaWQgKilpZCwKKyAgICAgICAgeGlfbG9nX2xldmVsX3ByaW50LAorICAgICAgICB4aV9sb2dfbGV2ZWxfc2F2ZSk7CisKKyAgICBpZC0+bG9nX2xldmVsX3ByaW50ID0geGlfbG9nX2xldmVsX3ByaW50OworICAgIGlkLT5sb2dfbGV2ZWxfc2F2ZSA9IHhpX2xvZ19sZXZlbF9zYXZlOworCisgICAgLyogSW4gbGludXggdXNlciBzcGFjZSB3ZSBuZWVkIHRvIG5vdGlmeSBrZXJuZWwgaW50ZWdyYXRpb24gY29kZSAqLworI2lmIGRlZmluZWQoTElOVVhfS0VSTkVMX1NQQUNFKSAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorICAgIGJjbV9kZXZfbG9nX2xpbnV4X2lkX3NldF9sZXZlbCh4aV9pZCwgeGlfbG9nX2xldmVsX3ByaW50LCB4aV9sb2dfbGV2ZWxfc2F2ZSk7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWxzX2FuZF90eXBlX3RvX2RlZmF1bHQoZGV2X2xvZ19pZCB4aV9pZCkKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWQtPmxvZ19sZXZlbF9wcmludCA9IGlkLT5kZWZhdWx0X2xvZ19sZXZlbDsKKyAgICBpZC0+bG9nX2xldmVsX3NhdmUgPSBpZC0+ZGVmYXVsdF9sb2dfbGV2ZWw7CisgICAgaWQtPmxvZ190eXBlID0gaWQtPmRlZmF1bHRfbG9nX3R5cGU7CisKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisgICAgbWVtc2V0KCZpZC0+dGhyb3R0bGUsMCwgc2l6ZW9mKGRldl9sb2dfaWRfdGhyb3R0bGUpKTsKKyAgICBtZW1zZXQoJmlkLT50cmlnZ2VyLCAwLCBzaXplb2YoZGV2X2xvZ19pZF90cmlnZ2VyKSk7CisgICAgaWQtPnRocm90dGxlX2xvZ19sZXZlbCA9IERFVl9MT0dfTEVWRUxfTk9fTE9HOworICAgIGlkLT50cmlnZ2VyX2xvZ19sZXZlbCA9IERFVl9MT0dfTEVWRUxfTk9fTE9HOworI2VuZGlmCisKKyAgICAvKiBJbiBsaW51eCBrZXJuZWwgc3BhY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBQUklOVCwgb25seSBTQVZFICovCisjaWZkZWYgX19LRVJORUxfXworICAgIGlmIChpZC0+bG9nX3R5cGUgJiBERVZfTE9HX0lEX1RZUEVfQk9USCkKKyAgICAgICAgaWQtPmxvZ190eXBlID0gREVWX0xPR19JRF9UWVBFX1NBVkU7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkIGJjbV9kZXZfbG9nX2xldmVsX3NldF9zdHlsZShiY21fZGV2X2xvZ19sZXZlbCBsZXZlbCwgYmNtX2Rldl9sb2dfc3R5bGUgeGlfc3R5bGUpCit7CisgICAgZGV2X2xvZ19sZXZlbDJzdHlsZVtsZXZlbF0gPSB4aV9zdHlsZTsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0X3N0eWxlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX3N0eWxlIHhpX3N0eWxlKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWQtPnN0eWxlID0geGlfc3R5bGU7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX2NsZWFyX2NvdW50ZXJzKGRldl9sb2dfaWQgeGlfaWQpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBtZW1zZXQoaWQtPmNvdW50ZXJzLCAwLCBzaXplb2YoaWQtPmNvdW50ZXJzKSk7CisgICAgaWQtPmxvc3RfbXNnX2NudCA9IDA7CisgICAgaWQtPnByaW50X3NraXBwZWRfY291bnQgPSAwOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX2dldChkZXZfbG9nX2lkIHhpX2lkLCBkZXZfbG9nX2lkX3Bhcm0gKnhvX2lkKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAqeG9faWQgPSAqaWQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0KGRldl9sb2dfaWQgeGlfaWQsIGRldl9sb2dfaWRfcGFybSAqcGFybXMpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgICppZCA9ICpwYXJtczsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleCh1aW50MzJfdCB4aV9pbmRleCkKK3sKKyAgICBpZiAoeGlfaW5kZXggPj0gZGV2X2xvZy5udW1faWRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFVl9MT0dfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgcmV0dXJuIChkZXZfbG9nX2lkKSYoZGV2X2xvZy5pZHNbeGlfaW5kZXhdKTsKK30KKwordWludDMyX3QgYmNtX2Rldl9sb2dfZ2V0X2luZGV4X2J5X2lkKGRldl9sb2dfaWQgeGlfaWQpCit7CisgICAgdWludDMyX3QgaWR4ID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkIC0gJmRldl9sb2cuaWRzWzBdOworICAgIGlmIChpZHggPj0gZGV2X2xvZy5udW1faWRzKQorICAgICAgICBpZHggPSBERVZfTE9HX0lOVkFMSURfSU5ERVg7CisgICAgcmV0dXJuIGlkeDsKK30KKworZGV2X2xvZ19pZCBiY21fZGV2X2xvZ19pZF9nZXRfYnlfbmFtZShjb25zdCBjaGFyICp4aV9uYW1lKQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBpZiAoeGlfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFVl9MT0dfSU5WQUxJRF9JRDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpPGRldl9sb2cubnVtX2lkczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoZGV2X2xvZy5pZHNbaV0ubmFtZSwgeGlfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoZGV2X2xvZ19pZCkmKGRldl9sb2cuaWRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogY2FuJ3QgZmluZCBuYW1lXG4iKTsKKyAgICByZXR1cm4gREVWX0xPR19JTlZBTElEX0lEOworfQorCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX2VudHJpZXModm9pZCkKK3sKKyAgICByZXR1cm4gZGV2X2xvZy5udW1faWRzOworfQorCitiY21vc19ib29sIGJjbV9kZXZfbG9nX2dldF9jb250cm9sKHZvaWQpCit7CisgICAgcmV0dXJuIGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRDsKK30KKwordWludDMyX3QgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9tZXNzYWdlcyhiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIHJldHVybiBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLm51bV9tc2dzOworfQorCit2b2lkIGJjbV9kZXZfbG9nX3NldF9jb250cm9sKGJjbW9zX2Jvb2wgY29udHJvbCkKK3sKKyAgICBpZiAoY29udHJvbCAmJiBkZXZfbG9nLnN0YXRlID09IEJDTV9ERVZfTE9HX1NUQVRFX0RJU0FCTEVEKQorICAgICAgICBkZXZfbG9nLnN0YXRlID0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRDsKKyAgICBlbHNlIGlmICghY29udHJvbCAmJiBkZXZfbG9nLnN0YXRlID09IEJDTV9ERVZfTE9HX1NUQVRFX0VOQUJMRUQpCisgICAgICAgIGRldl9sb2cuc3RhdGUgPSBCQ01fREVWX0xPR19TVEFURV9ESVNBQkxFRDsKK30KKworYmNtX2Rldl9sb2dfZmlsZV9mbGFncyBiY21fZGV2X2xvZ19nZXRfZmlsZV9mbGFncyh1aW50MzJfdCBmaWxlX2lkKQoreworICAgIHJldHVybiBkZXZfbG9nLmZpbGVzW2ZpbGVfaWRdLmZpbGVfcGFybS5mbGFnczsKK30KKwordm9pZCBiY21fZGV2X2xvZ19zZXRfZmlsZV9mbGFncyh1aW50MzJfdCBmaWxlX2lkLCBiY21fZGV2X2xvZ19maWxlX2ZsYWdzIGZsYWdzKQoreworICAgIGRldl9sb2cuZmlsZXNbZmlsZV9pZF0uZmlsZV9wYXJtLmZsYWdzID0gZmxhZ3M7Cit9CisKK2JjbV9kZXZfbG9nX2ZsYWdzIGJjbV9kZXZfbG9nX2dldF9mbGFncyh2b2lkKQoreworICAgIHJldHVybiBkZXZfbG9nLmZsYWdzOworfQorCit2b2lkIGJjbV9kZXZfbG9nX3NldF9mbGFncyhiY21fZGV2X2xvZ19mbGFncyBmbGFncykKK3sKKyAgICBkZXZfbG9nLmZsYWdzID0gZmxhZ3M7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X3ByaW50X2NiKGJjbV9kZXZfbG9nX3ByaW50X2NiIGNiKQoreworICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiID0gY2I7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X2dldF90aW1lX2NiKGJjbV9kZXZfbG9nX2dldF90aW1lX2NiIGNiKQoreworICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLmdldF90aW1lX2NiID0gY2I7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X3RpbWVfdG9fc3RyX2NiKGJjbV9kZXZfbG9nX3RpbWVfdG9fc3RyX2NiIGNiKQoreworICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnRpbWVfdG9fc3RyX2NiID0gY2I7Cit9CisKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX3NldF90aHJvdHRsZQkJCQkJCQkJCQkJCQkJCSovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIEFic3RyYWN0OiBTZXQgdGhyb3R0bGUgbGV2ZWwgZm9yIHRoZSBzcGVjaWZpYyBsb2cgaXMgYW5kIGl0cyBsZXZlbAkJCQkJCSovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIEFyZ3VtZW50czoJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiAgIC0geGlfaWQJCS0gVGhlIElEIGluIHRoZSBEZXYgbG9nICh3aGF0IHdlIGdvdCBmb3JtIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKQkJKi8KKy8qICAgLSB4aV9sb2dfbGV2ZWwJLSBsb2cgbGV2ZWwJCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV90aHJvdHRsZQktIHRocm90dGxlIG51bWJlciwgMCAtIG5vIHRocm90dGxlCQkJCQkJCQkJCSovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIFJldHVybiBWYWx1ZToJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfc2V0X3Rocm90dGxlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwgdWludDMyX3QgeGlfdGhyb3R0bGUpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZC0+dGhyb3R0bGVfbG9nX2xldmVsID0geGlfbG9nX2xldmVsOworICAgIGlkLT50aHJvdHRsZS50aHJlc2hvbGQgPSB4aV90aHJvdHRsZTsKKyAgICBpZC0+dGhyb3R0bGUuY291bnRlciA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19zZXRfdHJpZ2dlcgkJCQkJCQkJCQkJCQkJCSovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIEFic3RyYWN0OiBTZXQgdHJpZ2dlciBjb3VudGVycyBmb3IgdGhlIHNwZWNpZmljIGxvZyBpcyBhbmQgaXRzIGxldmVsCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogQXJndW1lbnRzOgkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qICAgLSB4aV9pZAkJLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpCQkqLworLyogICAtIHhpX2xvZ19sZXZlbAktIGxvZyBsZXZlbAkJCQkJCQkJCQkJICAgICAgICAgICAgICAgIAkqLworLyogICAtIHhpX3N0YXJ0IAktIHN0YXJ0IHByaW50aW5nIGFmdGVyIHRoaXMgbnVtYmVyLCAwIC0gbm8gdHJpZ2dlcgkJCQkJCSovCisvKiAgIC0geGlfc3RvcCAgIAktIHN0b3AgcHJpbnRpbmcgYWZ0ZXIgdGhpcyBudW1iZXIsICAwIC0gZG8gbm90IHN0b3AJCQkJCQkqLworLyogICAtIHhpX3JlcGVhdCAJLSBzdGFydCBwcmludGluZyBhZnRlciB0aGlzIG51bWJlciwgMCAtIG5vIHJlcGVhdCwgLTEgYWx3YXlzCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogUmV0dXJuIFZhbHVlOgkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19zZXRfdHJpZ2dlcihkZXZfbG9nX2lkIHhpX2lkLCBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsIHVpbnQzMl90IHhpX3N0YXJ0LCB1aW50MzJfdCB4aV9zdG9wLCBpbnQzMl90IHhpX3JlcGVhdCkKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlkLT50cmlnZ2VyX2xvZ19sZXZlbCA9IHhpX2xvZ19sZXZlbDsKKyAgICBpZC0+dHJpZ2dlci5zdGFydF90aHJlc2hvbGQgPSB4aV9zdGFydDsKKyAgICBpZC0+dHJpZ2dlci5zdG9wX3RocmVzaG9sZCA9IHhpX3N0b3A7CisgICAgaWQtPnRyaWdnZXIucmVwZWF0X3RocmVzaG9sZCA9IHhpX3JlcGVhdDsKKyAgICBpZC0+dHJpZ2dlci5jb3VudGVyID0gMDsKKyAgICBpZC0+dHJpZ2dlci5yZXBlYXQgPSAwOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYgLyogVFJJR0dFUl9MT0dHRVJfRkVBVFVSRSAqLworCisvKiBHZXQgZmlsZSBpbmZvOiBtYXggZGF0YSBzaXplLCB1c2VkIGJ5dGVzICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19nZXRfZmlsZV9pbmZvKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIHVpbnQzMl90ICpmaWxlX3NpemUsIHVpbnQzMl90ICp1c2VkX2J5dGVzKQoreworICAgIGlmICghZmlsZSB8fCAhZmlsZV9zaXplIHx8ICF1c2VkX2J5dGVzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIC8qIE9ubHkgc3VwcG9ydGVkIGZvciBtZW1vcnkgZmlsZXMgKi8KKyAgICBpZiAoIWJjbV9kZXZfbG9nX2lzX21lbW9yeV9maWxlKGZpbGUpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICpmaWxlX3NpemUgPSBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZTsKKyAgICAqdXNlZF9ieXRlcyA9IChmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQgfHwgZmlsZS0+aXNfZnVsbCkgPworICAgICAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSA6IGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0OworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBSZWdpc3RlciBpbmRpY2F0aW9uIHRvIGJlIHNlbnQgd2hlbiBmaWxlIHV0aWxpemF0aW9uIGNyb3NzZXMgdGhyZXNob2xkICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19hbG1vc3RfZnVsbF9pbmRfcmVnaXN0ZXIoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgdXNlZF9ieXRlc190aHJlc2hvbGQsCisgICAgRl9kZXZfbG9nX2ZpbGVfYWxtb3N0X2Z1bGwgc2VuZF9pbmRfY2IsIGxvbmcgaW5kX2NiX3ByaXYpCit7CisgICAgaWYgKCFmaWxlIHx8ICh1c2VkX2J5dGVzX3RocmVzaG9sZCAmJiAhc2VuZF9pbmRfY2IpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIC8qIE9ubHkgc3VwcG9ydGVkIGZvciBtZW1vcnkgZmlsZXMgKi8KKyAgICBpZiAoIWJjbV9kZXZfbG9nX2lzX21lbW9yeV9maWxlKGZpbGUpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisgICAgZmlsZS0+YWxtb3N0X2Z1bGwudGhyZXNob2xkID0gdXNlZF9ieXRlc190aHJlc2hvbGQ7CisgICAgZmlsZS0+YWxtb3N0X2Z1bGwuc2VuZF9pbmRfY2IgPSBzZW5kX2luZF9jYjsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC5wcml2ID0gaW5kX2NiX3ByaXY7CisgICAgZmlsZS0+YWxtb3N0X2Z1bGwuaW5kX3NlbnQgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNlbmRpZiAvKiBFTkFCTEVfTE9HICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3YmIxMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suaApAQCAtMCwwICsxLDY1MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfX0JDTV9ERVZfTE9HX1RBU0tfSF8KKyNkZWZpbmUgX19CQ01fREVWX0xPR19UQVNLX0hfCisKKy8qIEJlY2F1c2Ugd2UgY2FzdCBmcm9tIGRldl9sb2dfaWQgdG8gcG9pbnRlciB0eXBlIGluIGJjbV9kZXZfbG9nLmMsIHdlIHdhbnQgaXQgdG8gYmUgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgc2l6ZSAoZS5nOiAidHlwZWRlZiB1aW50MzJfdCBkZXZfbG9nX2lkIiB3b24ndCB3b3JrCisgKiBvbiA2NGJpdCBwbGF0Zm9ybSkuICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZGV2X2xvZ19pZDsKKworI2RlZmluZSBERVZfTE9HX0lOVkFMSURfSUQgICAgICAgICAgICAgIChkZXZfbG9nX2lkKVVJTlRfTUFYCisKKyNpZmRlZiBFTkFCTEVfTE9HCisKKy8qIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZW5hYmxlIGluZm8gcHJpbnRzIGZvciBkZXZfbG9nIGRlYnVnZ2luZyAqLworLyogI2RlZmluZSBERVZfTE9HX0RFQlVHICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTG9nIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZWZpbmVzL1R5cGVkZWZzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU1RSSU5HSUZZKHgpICN4CisjZGVmaW5lIFNUUklOR0lGWV9FWFBBTkQoc3RyKSBTVFJJTkdJRlkoc3RyKQorCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBERVZfTE9HX1BSSU5URiBwcmludGsKKyNkZWZpbmUgREVWX0xPR19WUFJJTlRGIHZwcmludGsKKyNlbHNlCisjZGVmaW5lIERFVl9MT0dfUFJJTlRGIGJjbW9zX3ByaW50ZgorI2RlZmluZSBERVZfTE9HX1ZQUklOVEYgYmNtb3NfdnByaW50ZgorI2VuZGlmCisKKyNpZmRlZiBERVZfTE9HX0RFQlVHCisjZGVmaW5lIERFVl9MT0dfSU5GT19QUklOVEYoZm10LCBhcmdzLi4uKSBERVZfTE9HX1BSSU5URigiKCVzOiIgU1RSSU5HSUZZX0VYUEFORChfX0xJTkVfXykgIikgIiBmbXQsIF9fRlVOQ1RJT05fXywgIyNhcmdzKQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZfbG9nX2luZm9fcHJpbnRmX2lnbm9yZShjb25zdCBjaGFyICpmbXQsIC4uLikgeyB9CisjZGVmaW5lIERFVl9MT0dfSU5GT19QUklOVEYoZm10LCBhcmdzLi4uKSBkZXZfbG9nX2luZm9fcHJpbnRmX2lnbm9yZShmbXQsICMjYXJncykKKyNlbmRpZgorI2RlZmluZSBERVZfTE9HX0VSUk9SX1BSSU5URihmbXQsIGFyZ3MuLi4pIERFVl9MT0dfUFJJTlRGKCIoJXM6IiBTVFJJTkdJRllfRVhQQU5EKF9fTElORV9fKSAiKSAiIGZtdCwgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisKKy8qIElNUE9SVEFOVCEgd2hlbiBtb2RpZnlpbmcgREVWX0xPR19NQVhfQVJHUywKKyAqIGRvbid0IGZvcmdldCB0byBhZGQvcmVtb3ZlIF9CQ01fTE9HX0FSR1MuLi4gbWFjcm9zIGluIG9yZGVyIHRvIGZvcmNlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gY29tcGlsZSB0aW1lCisgKi8KKyNkZWZpbmUgREVWX0xPR19NQVhfQVJHUyAgICAgICAgICAgICAgICAzNgorLyogU3RyaW5nIGJpZ2dlciB0aGFuIHRoaXMgc2l6ZSB3aWxsIGJlIGN1dCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWF9ERVZfTE9HX0lEX05BTUUgICAgICAgICAgICAgMzIgIC8qIE1heGltdW0gc2l6ZSBvZiBsb2dfaWQgbmFtZSAqLworI2RlZmluZSBERVZfTE9HX01BWF9JRFMgICAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBERVZfTE9HX01BWF9GSUxFUyAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUgICAgICAgICAyNTYgLyogTm90ZSB0aGF0IHRoaXMgc2l6ZSBpbmNsdWRlcyBoZWFkZXIuICovCisjZGVmaW5lIE1BWF9ERVZfTE9HX0hFQURFUl9TSVpFICAgICAgICAgKDcgKyAxNiArIDIwKSAvKiAodGltZT0xNiwgSUQ9MjAsIGRlbGltaXRlcnM9NykgKi8KKyNkZWZpbmUgTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFICAgICAoTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUgLSBNQVhfREVWX0xPR19IRUFERVJfU0laRSkKKyNkZWZpbmUgREVWX0xPR19JTlZBTElEX0lOREVYICAgICAgICAgICBVSU5UX01BWAorI2RlZmluZSBERVZfTE9HX0RST1BfUkVQT1JUX1JBVEVfVVMgICAgIDEwMDAwMDAgLyogMSBzZWNvbmQgKi8KKyNkZWZpbmUgREVWX0xPR19EUk9QX1JFUE9SVF9EUk9QX1RIUkVTSE9MRCAxMDAwCisjZGVmaW5lIERFVl9MT0dfRU5ESUFOICAgICAgICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRQorCisvKiBJZiB0aGUgbG9nIG1lc3NhZ2UgcG9vbCB1dGlsaXphdGlvbiBpcyA+PSB0aGlzIHBlcmNlbnRhZ2UsIGRvIG5vdCBwcmludCBtZXNzYWdlcyAob25seSBzYXZlIHRoZW0pLgorICogKG5vdGUgdGhhdCBlcnJvci9mYXRhbCBtZXNzYWdlcyB3aWxsIG5vdCBvYmpleSB0aGlzIHJ1bGUpLiAqLworI2RlZmluZSBERVZfTE9HX1NLSVBfUFJJTlRfVEhSRVNIT0xEX1BFUkNFTlQgNTAKKworLyogSWYgdGhlIGxvZyBtZXNzYWdlIHBvb2wgdXRpbGl6YXRpb24gaXMgPj0gdGhpcyBwZXJjZW50YWdlLCBkcm9wIGFsbCBtZXNzYWdlcyB0aGF0IGFyZW4ndCAnZXJyb3InIG9yICdmYXRhbCcgbGV2ZWwuICovCisjZGVmaW5lIERFVl9MT0dfRVJST1JfT05MWV9USFJFU0hPTERfUEVSQ0VOVCA3NQorCisvKiBMb2cgbGV2ZWwgZW51bSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgREVWX0xPR19MRVZFTF9OT19MT0cgPSAwLAorICAgIERFVl9MT0dfTEVWRUxfRkFUQUwsCisgICAgREVWX0xPR19MRVZFTF9FUlJPUiwKKyAgICBERVZfTE9HX0xFVkVMX1dBUk5JTkcsCisgICAgREVWX0xPR19MRVZFTF9JTkZPLAorICAgIERFVl9MT0dfTEVWRUxfREVCVUcsCisKKyAgICBERVZfTE9HX0xFVkVMX05VTV9PRgorfSBiY21fZGV2X2xvZ19sZXZlbDsKKworLyogTG9nIHR5cGUgZW51bSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgLyogQml0WzBdIC0gUHJpbnQgRW5hYmxlLCBCaXRbMV0gLSBTYXZlIEVuYWJsZSAqLworICAgIERFVl9MT0dfSURfVFlQRV9OT05FID0gMCwgICAgICAgLyogTk8gU0FWRSwgTk8gUFJJTlQqLworICAgIERFVl9MT0dfSURfVFlQRV9QUklOVCA9IDEsCisgICAgREVWX0xPR19JRF9UWVBFX1NBVkUgPSAxIDw8IDEsCisgICAgREVWX0xPR19JRF9UWVBFX0JPVEggPSBERVZfTE9HX0lEX1RZUEVfUFJJTlQgfCBERVZfTE9HX0lEX1RZUEVfU0FWRSwgLyogU0FWRSAmIFBSSU5UICovCit9IGJjbV9kZXZfbG9nX2lkX3R5cGU7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9ERVZfTE9HX0ZMQUdfTk9ORSA9IDAsCisKKyAgICAvKiBFdmVuIGlmIGxvZ2dlciBpcyBkaXNhYmxlZCwgQkNNX0xPRygpIGNhbGxzIGFyZSByZWRpcmVjdGVkIHRvIGJjbW9zX3ByaW50ZigpLiAqLworICAgIEJDTV9ERVZfTE9HX0ZMQUdfRElTQUJMRURfV0lUSF9QUklOVEYgPSAxIDw8IDAsCisKKyAgICAvKiBXaGVuIGJjbV9kZXZfbG9nX2Rlc3Ryb3koKSBpcyBjYWxsZWQsIGRvIG5vdCB3YWl0IGZvciBvdXRzdGFuZGluZyBsb2cgbWVzc2FnZXMgdG8gYmUgZHJhaW5lZC4gRGlzY2FyZCB0aGUKKyAgICAgKiBtZXNzYWdlcyBhbmQgZGVzdHJveSB0aGUgdGFzayBpbW1lZGlhdGVseS4gKi8KKyAgICBCQ01fREVWX0xPR19GTEFHX0RFU1RST1lfSU1NRURJQVRFTFkgPSAxIDw8IDEsCit9IGJjbV9kZXZfbG9nX2ZsYWdzOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01fREVWX0xPR19GSUxFX0ZMQUdfTk9ORSA9IDAsCisgICAgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEID0gMSwgLyoqPCBmaWxlIGlzIHZhbGlkICovCisgICAgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1dSQVBfQVJPVU5EID0gMSA8PCAxLCAvKio8IG5ldyBtZXNzYWdlcyB3aWxsIG92ZXJyaWRlIG9sZCAqLworICAgIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19TVE9QX1dIRU5fRlVMTCA9IDEgPDwgMiwgLyoqPCBzdG9wIGxvZ2dpbmcgaWYgdGhlIGZpbGUgaXMgZnVsbCAqLworICAgIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19DTEVBUl9BRlRFUl9SRUFEID0gMSA8PCA0LCAvKio8IGF1dG8tY2xlYXIgbG9nIHdoZW4gaXQgaXMgZnVsbHkgcmVhZCAqLworfSBiY21fZGV2X2xvZ19maWxlX2ZsYWdzOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01fREVWX0xPR19TVFlMRV9OT1JNQUwsCisgICAgQkNNX0RFVl9MT0dfU1RZTEVfQk9MRCwKKyAgICBCQ01fREVWX0xPR19TVFlMRV9VTkRFUkxJTkUsCisgICAgQkNNX0RFVl9MT0dfU1RZTEVfQkxJTkssCisgICAgQkNNX0RFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTywKK30gYmNtX2Rldl9sb2dfc3R5bGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENhbGxiYWNrcyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmYXVsdCBsb2dnZXIgSUQgKi8KK2V4dGVybiBkZXZfbG9nX2lkIGRlZl9sb2dfaWQ7CisKKy8qIExvZyBmaWxlIHR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9ERVZfTE9HX0ZJTEVfTUVNT1JZLCAgICAvKio8IE1lbW9yeSBmaWxlICovCisjaWZkZWYgQkNNX09TX1BPU0lYCisgICAgQkNNX0RFVl9MT0dfRklMRV9SRUdVTEFSLCAgIC8qKjwgUmVndWxhciBmaWxlICovCisjZW5kaWYKKyNpZmRlZiBERVZfTE9HX1NZU0xPRworICAgIEJDTV9ERVZfTE9HX0ZJTEVfU1lTTE9HLCAgICAvKio8IHN5c2xvZyAiZmlsZSIgKi8KKyNlbmRpZgorICAgIEJDTV9ERVZfTE9HX0ZJTEVfVURFRiAgICAgICAvKio8IFVzZXItZGVmaW5lZCBmaWxlICovCit9IGJjbV9kZXZfbG9nX2ZpbGVfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgYmNtX2Rldl9sb2dfZmlsZV9wYXJtIGJjbV9kZXZfbG9nX2ZpbGVfcGFybTsKK3R5cGVkZWYgc3RydWN0IGJjbV9kZXZfbG9nX2ZpbGUgYmNtX2Rldl9sb2dfZmlsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBPUEVOIENBTExCQUNLOiBvcGVuIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGVfcGFybSAtIGZpbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZSAgICAgIC0gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpiY21fZGV2X2xvZ19maWxlX29wZW5fY2IpKGNvbnN0IGJjbV9kZXZfbG9nX2ZpbGVfcGFybSAqZmlsZV9wYXJtLCBiY21fZGV2X2xvZ19maWxlICpmaWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDTE9TRSBDQUxMQkFDSzogY2xvc2UgbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZSAgICAgIC0gZmlsZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpiY21fZGV2X2xvZ19maWxlX2Nsb3NlX2NiKShiY21fZGV2X2xvZ19maWxlICpmaWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSRVdJTkQgQ0FMTEJBQ0s6IGNsZWFycyBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGUgICAgICAtIGZpbGUgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtX2Rldl9sb2dfZmlsZV9yZXdpbmRfY2IpKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJFQURfQ0FMTEJBQ0s6IHJlYWQgZm9ybSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogb2Zmc2V0IC0gdGhlIG9mZnNldCBpbiBieXRlcyB0byByZWFkIGZyb20sIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBidWYgICAgLSBXaGVyZSB0byBwdXQgdGhlIHJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGxlbmd0aCAtIEJ1ZmZlciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBmcm9tIGZpbGUgb3IgMCBpZiBFT0YgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgaW50ICgqYmNtX2Rldl9sb2dfZmlsZV9yZWFkX2NiKShiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCAqb2Zmc2V0LCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV1JJVEVfQ0FMTEJBQ0s6IHdyaXRlIGZvcm0gbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBidWYgICAgLSBUaGUgYnVmZmVyIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGxlbmd0aCAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiB0byBmaWxlIG9yIDAgaWYgRU9GICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgaW50ICgqYmNtX2Rldl9sb2dfZmlsZV93cml0ZV9jYikoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpOworCisvKiBGaWxlIGFsbW9zdCBmdWxsIGluZGljYXRpb24gY2FsbGJhY2sgcHJvdG90eXBlICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqRl9kZXZfbG9nX2ZpbGVfYWxtb3N0X2Z1bGwpKGxvbmcgcHJpdik7CisKKy8qIEZpbGUgcGFyYW1ldGVycyAqLworc3RydWN0IGJjbV9kZXZfbG9nX2ZpbGVfcGFybQoreworICAgIGJjbV9kZXZfbG9nX2ZpbGVfdHlwZSB0eXBlOworICAgIC8qIEZpbGUtYWNjZXNzIGNhbGxiYWNrcyBjYW4gYmUgTlVMTCBmb3IgbWVtb3J5IGZpbGVzLCBpbiB0aGlzIGNhc2Ugc3RhcnRfYWRkciAgICAqLworICAgIC8qIHNob3VsZCBiZSBhIHZhbGlkIG1lbW9yeSBhZGRyZXNzLCBhbGwgcmVhZC93cml0ZXMgb3B0aW9ucyB3aWxsIGJlICAgICAgICAqLworICAgIC8qIHBlcmZvcm1lZCBkaXJlY3RseSB0byB0aGlzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgKnN0YXJ0X2FkZHI7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICBiY21fZGV2X2xvZ19maWxlX29wZW5fY2Igb3Blbl9jYjsKKyAgICBiY21fZGV2X2xvZ19maWxlX2Nsb3NlX2NiIGNsb3NlX2NiOworICAgIGJjbV9kZXZfbG9nX2ZpbGVfd3JpdGVfY2Igd3JpdGVfY2I7CisgICAgYmNtX2Rldl9sb2dfZmlsZV9yZWFkX2NiIHJlYWRfY2I7CisgICAgYmNtX2Rldl9sb2dfZmlsZV9yZXdpbmRfY2IgcmV3aW5kX2NiOworICAgIGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgZmxhZ3M7CisgICAgdm9pZCAqdWRlZl9wYXJtczsKK307CisKKyNkZWZpbmUgRklMRV9NQUdJQ19TVFJfU0laRSAgICAgICAgICAgICAxNgorI2RlZmluZSBGSUxFX01BR0lDX1NUUiAiQExPR0ZJTEUgTUFHSUNAIiAvKiBsZW5ndGggc2hvdWxkIGJlIEZJTEVfTUFHSUNfU1RSX1NJWkUgKGluY2x1ZGluZyAnXDAnKSAqLworCisvKiBGaWxlIGFsbW9zdCBmdWxsIGluZGljYXRpb24gY29udHJvbCBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBkZXZfbG9nX2FsbW9zdF9mdWxsX2luZm8KK3sKKyAgICBGX2Rldl9sb2dfZmlsZV9hbG1vc3RfZnVsbCBzZW5kX2luZF9jYjsKKyAgICB1aW50MzJfdCB0aHJlc2hvbGQ7CisgICAgYmNtb3NfYm9vbCBpbmRfc2VudDsKKyAgICBsb25nIHByaXY7Cit9IGRldl9sb2dfYWxtb3N0X2Z1bGxfaW5mbzsKKworLyogTWVtb3J5IGZpbGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBkZXZfbG9nX21lbV9maWxlX2hlYWRlcgoreworICAgIHVpbnQzMl90IGZpbGVfd3JhcF9jbnQ7CisgICAgdWludDMyX3Qgd3JpdGVfb2Zmc2V0OworICAgIHVpbnQzMl90IGRhdGFfc2l6ZTsKKyAgICB1aW50MzJfdCBudW1fbXNnczsKKyAgICBjaGFyIGZpbGVfbWFnaWNbRklMRV9NQUdJQ19TVFJfU0laRV07CisgICAgY2hhciBtc2dfYnVmZmVyWzBdOworfSBkZXZfbG9nX21lbV9maWxlX2hlYWRlcjsKKworc3RydWN0IGJjbV9kZXZfbG9nX2ZpbGUKK3sKKyAgICBiY21fZGV2X2xvZ19maWxlX3Bhcm0gZmlsZV9wYXJtOworICAgIGRldl9sb2dfYWxtb3N0X2Z1bGxfaW5mbyBhbG1vc3RfZnVsbDsKKyAgICBiY21vc19ib29sIGlzX2Z1bGw7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIC8qIE1lbW9yeSBmaWxlICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tdXRleCBtdXRleDsgLyogTXV0ZXggdG8gbG9jayBmaWxlIGFjY2VzcyB3aGlsZSBwcmludGluZyBpdCAqLworICAgICAgICAgICAgZGV2X2xvZ19tZW1fZmlsZV9oZWFkZXIgZmlsZV9oZWFkZXI7CisgICAgICAgIH0gbWVtX2ZpbGU7CisKKyNpZmRlZiBCQ01fT1NfUE9TSVgKKyAgICAgICAgRklMRSAqcmVnX2ZpbGVfaGFuZGxlOworI2VuZGlmCisKKyAgICAgICAgLyogVXNlci1kZWZpbmVkIGZpbGUgaGFuZGxlICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgdWRlZl9oYW5kbGU7CisgICAgfSB1OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZXQgdGltZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRpbWUuIElmIE5VTEwgdGltZSBwcmludHMgd2lsbCBiZSBkaXNhYmxlZC4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB1aW50MzJfdCAoKmJjbV9kZXZfbG9nX2dldF90aW1lX2NiKSh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGltZSB0byBzdHJpbmcgY2FsbGJhY2sgcmVjZWl2ZXMgdGltZXN0YW1wICh1cykgYW5kIHNob3VsZCBjb252ZXJ0IGludG8gdGltZV9zdHIgICAgICAgICAgICAgICAgICAgICAqLworLyogdGltZV9zdHJfc2l6ZSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkLiBJbiB0aGUgZW5kIGZ1bmN0aW9uIHNob3VsZCB1cGRhdGUgdGhlICAgICAqLworLyogbnVtYmVyIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSWYgTlVMTCB0aW1lIHdpbGwgcHJpbnRlZCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBpbnQgKCpiY21fZGV2X2xvZ190aW1lX3RvX3N0cl9jYikodWludDMyX3QgdGltZSwgY2hhciAqdGltZV9zdHIsIGludCB0aW1lX3N0cl9zaXplKTsKK3R5cGVkZWYgaW50ICgqYmNtX2Rldl9sb2dfcHJpbnRfY2IpKHZvaWQgKmFyZywgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBTdHJ1Y3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtX2Rldl9sb2dfZ2V0X3RpbWVfY2IgZ2V0X3RpbWVfY2I7CisgICAgYmNtX2Rldl9sb2dfdGltZV90b19zdHJfY2IgdGltZV90b19zdHJfY2I7CisgICAgYmNtX2Rldl9sb2dfcHJpbnRfY2IgcHJpbnRfY2I7CisgICAgdm9pZCAqcHJpbnRfY2JfYXJnOworICAgIGJjbV9kZXZfbG9nX2ZpbGVfcGFybSBsb2dfZmlsZVtERVZfTE9HX01BWF9GSUxFU107Cit9IGJjbV9kZXZfbG9nX3Bhcm07CisKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCit0eXBlZGVmIHN0cnVjdAoreworICAgdWludDMyX3QgdGhyZXNob2xkOyAgLyogZXZlcnkgdGhyZXNob2xkIG1lc3NhZ2VzLCBwcmludCBvbmUgKi8KKyAgIHVpbnQzMl90IGNvdW50ZXI7ICAgIC8qIGN1cnJlbnQgaW5kZXggLSBydW5zIGZyb20gMCB0byB0aHJlc2hvbGQsIHBlcmlvZGljYWxseSAqLworfSBkZXZfbG9nX2lkX3Rocm90dGxlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgdWludDMyX3Qgc3RhcnRfdGhyZXNob2xkOyAvKiBzdGFydCBwcmludGluZyB3aGVuIHRocmVzaG9sZCBpcyByZWFjaGVkICovCisgICB1aW50MzJfdCBzdG9wX3RocmVzaG9sZDsgIC8qIHN0b3AgcHJpbnRpbmcgd2hlbiB0aHJlc2hvbGQgaXMgcmVhY2hlZCwgc3RhcnRpbmcgY291bnRpbmcgZnJvbSBzdGFydCwgaWYgMCwgZG8gbm8gc3RvcCAqLworICAgdWludDMyX3QgY291bnRlcjsgICAgICAgICAvKiBjdXJyZW50IGluZGV4IC0gcnVucyA6IGZpcnN0IC0gZnJvbSAwIHRvIHN0YXJ0X3RocmVzaG9sZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCAtIGZyb20gc3RhcnRfdGhyZXNob2xkIHRvIHN0b3BfdGhyZXNob2xkICovCisgICBpbnQzMl90IHJlcGVhdF90aHJlc2hvbGQ7LyogdGhlIHRyaWdnZXIgcGVyaW9kLCBob3cgbWFueSB0aW1lcyB0aGUgdHJpZ2dlciBpcyBzZXQsIC0xID0gYWx3YXlzICovCisgICBpbnQzMl90IHJlcGVhdDsgICAgICAgICAgLyogY3VycmVudCByZXBlYXQgY291bnRlciAqLworfSBkZXZfbG9nX2lkX3RyaWdnZXI7CisjZW5kaWYKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhciBuYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgIGJjbV9kZXZfbG9nX2lkX3R5cGUgbG9nX3R5cGU7CisgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSBkZWZhdWx0X2xvZ190eXBlOworICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbF9wcmludDsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWxfc2F2ZTsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBkZWZhdWx0X2xvZ19sZXZlbDsKKyAgICBiY21fZGV2X2xvZ19zdHlsZSBzdHlsZTsKKyAgICB1aW50MzJfdCBsb3N0X21zZ19jbnQ7CisgICAgdWludDMyX3QgcHJpbnRfc2tpcHBlZF9jb3VudDsgLyogc2VlIERFVl9MT0dfU0tJUF9QUklOVF9USFJFU0hPTERfUEVSQ0VOVCAqLworICAgIHVpbnQzMl90IGNvdW50ZXJzW0RFVl9MT0dfTEVWRUxfTlVNX09GXTsKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgdGhyb3R0bGVfbG9nX2xldmVsOworICAgIGRldl9sb2dfaWRfdGhyb3R0bGUgdGhyb3R0bGU7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgdHJpZ2dlcl9sb2dfbGV2ZWw7CisgICAgZGV2X2xvZ19pZF90cmlnZ2VyIHRyaWdnZXI7CisjZW5kaWYKK30gZGV2X2xvZ19pZF9wYXJtOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBUZWFyIGRvd24gdGhlIGRldl9sb2csIGZyZWVpbmcgYWxsIE9TIHJlc291cmNlcy4gKi8KK3ZvaWQgYmNtX2Rldl9sb2dfZGVzdHJveSh2b2lkKTsKKworLyogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGRlZmF1bHQgbG9nZ2VyIHRoYXQgc3VwcG9ydHMgbG9nZ2luZyBvbiB0aGUgc2NyZWVuIGFuZAorICogaW50byAwIG9yIG1vcmUgbWVtb3J5IGZpbGVzLgorICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pbml0X2RlZmF1bHRfbG9nZ2VyKHZvaWQgKipzdGFydF9hZGRyZXNzZXMsCisgICAgdWludDMyX3QgKnNpemVzLAorICAgIGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgKmZsYWdzLAorICAgIHVpbnQzMl90IG51bV9maWxlcywKKyAgICB1aW50MzJfdCBzdGFja19zaXplLAorICAgIGJjbW9zX3Rhc2tfcHJpb3JpdHkgcHJpb3JpdHksCisgICAgdWludDMyX3QgcG9vbF9zaXplKTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBtb3JlIGZsZXhpYmxlIGNvbXBhcmluZyB3aXRoIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXIoKS4KKyAqIEl0IGNyZWF0ZXMgbG9nZ2VyIHRoYXQgc3VwcG9ydHMgbG9nZ2luZyBvbiB0aGUgc2NyZWVuIGFuZCBpbnRvIDAgb3IgbW9yZQorICogbWVtb3J5LCByZWd1bGFyIGFuZCB1c2VyLWRlZmluZWQgZmlsZXMuCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXJfZXh0KAorICAgIGJjbV9kZXZfbG9nX3Bhcm0gKmRldl9sb2dfcGFybSwKKyAgICB1aW50MzJfdCBudW1fZmlsZXMsCisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZSwKKyAgICBiY21vc190YXNrX3ByaW9yaXR5IHByaW9yaXR5LAorICAgIHVpbnQzMl90IHBvb2xfc2l6ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogQWRkIG5ldyBJRCB0byBkZXZfbG9nIGFuZCByZXR1cm4gaXQgdG8gdXNlciAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHhpX25hbWUgICAgICAgICAgICAgICAgLSBJRCBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB4aV9kZWZhdWx0X2xvZ19sZXZlbCAgIC0gSUQgZGVmYXVsdCBsb2cgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgeGlfZGVmYXVsdF9sb2dfdHlwZSAgICAtIElEIGRlZmF1bHQgbG9nIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgbmV3IElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Rldl9sb2dfaWQgYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoY29uc3QgY2hhciAqeGlfbmFtZSwKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB4aV9kZWZhdWx0X2xvZ19sZXZlbCwKKyAgICBiY21fZGV2X2xvZ19pZF90eXBlIHhpX2RlZmF1bHRfbG9nX3R5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9zZXRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogU2V0IGN1cnJlbnQgbG9nIHR5cGUgZm9yIGFuIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgIC0gVGhlIElEIGluIHRoZSBEZXYgbG9nICh3aGF0IHdlIGdvdCBmb3JtIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKSAgICAgICovCisvKiAgIC0geGlfbG9nX3R5cGUgIC0gTmV3IGxvZyB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfdHlwZShkZXZfbG9nX2lkIHhpX2lkLCBiY21fZGV2X2xvZ19pZF90eXBlIHhpX2xvZ190eXBlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFNldCBjdXJyZW50IGxvZyBsZXZlbCBmb3IgYW4gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2lkICAgICAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICAgICAqLworLyogICAtIHhpX2xvZ19sZXZlbCAtIE5ldyBsb2cgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbF9wcmludCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsX3NhdmUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9zZXRfdG9fZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogU2V0IGxvZ190eXBlIGFuZCBsb2dfbGV2ZWwgdG8gZGVmYXVsdCAoY3JlYXRpb24pIHZhbHVlcyBmb3IgYW4gSUQgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWxzX2FuZF90eXBlX3RvX2RlZmF1bHQoZGV2X2xvZ19pZCB4aV9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2xldmVsX3NldF9zdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBTZXQgbG9nIHN0eWxlIHBlciBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9sZXZlbCAgICAtIExvZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9zdHlsZSAgICAtIFRoZSBzdHlsZSBvZiB0aGUgbG9nLCBOT1JNQUwsIEJPTEQsIFVOREVSTElORSwgQkxJTkssIFJFVkVSU0VfVklERU8gICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlKGJjbV9kZXZfbG9nX2xldmVsIGxldmVsLCBiY21fZGV2X2xvZ19zdHlsZSB4aV9zdHlsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2lkX3NldF9zdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBTZXQgbG9nIHN0eWxlIHBlciBsb2cgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9pZCAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICAgICAgICAgKi8KKy8qICAgLSB4aV9zdHlsZSAgICAtIFRoZSBzdHlsZSBvZiB0aGUgbG9nLCBOT1JNQUwsIEJPTEQsIFVOREVSTElORSwgQkxJTkssIFJFVkVSU0VfVklERU8gICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF9zdHlsZShkZXZfbG9nX2lkIHhpX2lkLCBiY21fZGV2X2xvZ19zdHlsZSB4aV9zdHlsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfY2xlYXJfY291bnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogQ2xlYXIgY291bnRlciBmb3IgYW4gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgICAgICAgICAgLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9jbGVhcl9jb3VudGVycyhkZXZfbG9nX2lkIHhpX2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IEdldCB0aGUgSUQgc3RhdHVzICh0eXBlLCBsZXZlbCwgY291bnRlcnMgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2lkICAgICAgICAgICAgLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpICAqLworLyogICAtIHhvX2lkX3N0YXR1cyAgICAgLSBSZXR1cm5lZCBzdGF0dXMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfZ2V0KGRldl9sb2dfaWQgeGlfaWQsIGRldl9sb2dfaWRfcGFybSAqeG9faWRfc3RhdHVzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IHNldCB0aGUgSUQgc3RhdHVzICh0eXBlLCBsZXZlbCwgc3R5bGUgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2lkICAgICAgICAgICAgLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpICAqLworLyogICAtIHhpX3Bhcm1zICAgICAgICAgLSBzdHJ1Y3R1cmUgdG8gc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0KGRldl9sb2dfaWQgeGlfaWQsIGRldl9sb2dfaWRfcGFybSAqeGlfcGFybXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogUmV0dXJuIElEIGZvciBpbmRleCwgaWYgbm8gc3VjaCBpbmRleCByZXR1cm4gKERFVl9MT0dfSU5WQUxJRF9JRCkgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB4aV9pbmRleCAgICAgICAgIC0gVGhlIGluZGV4IG9mIHRoZSBJRCBpbiB0aGUgZ2xvYmFsIGFycmF5LiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHVpbnQzMl90IC0gVGhlIElEIChERVZfTE9HX0lOVkFMSURfSUQgaWYgaW5kZXggaXMgbm90IHZhbGlkKSAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleCh1aW50MzJfdCB4aV9pbmRleCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2dldF9pbmRleF9ieV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBSZXR1cm4gSUQgZm9yIGluZGV4LCBpZiBubyBzdWNoIGluZGV4IHJldHVybiAoREVWX0xPR19JTlZBTElEX0lEKSAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHhpX2lkICAgICAgICAgICAgICAgICAgICAgICAgLSBMb2cgaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdWludDMyX3QgLSBUaGUgaW5kZXggSUQgKERFVl9MT0dfSU5WQUxJRF9JTkRFWCBpZiBpZCBpcyBub3QgdmFsaWQpICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbV9kZXZfbG9nX2dldF9pbmRleF9ieV9pZChkZXZfbG9nX2lkIHhpX2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFJldHVybiBJRCBpbmRleCBmb3IgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogeGlfX25hbWUgICAgICAgICAtIFRoZSBuYW1lIG9mIHRoZSBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBpbnQzMl90IC0gVGhlIElEIGluZGV4ICgtMSBpZiBuYW1lIGlzIG5vdCB2YWxpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZGV2X2xvZ19pZCBiY21fZGV2X2xvZ19pZF9nZXRfYnlfbmFtZShjb25zdCBjaGFyKiB4aV9uYW1lKTsKKwordWludDMyX3QgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9lbnRyaWVzKHZvaWQpOworCitiY21vc19ib29sIGJjbV9kZXZfbG9nX2dldF9jb250cm9sKHZvaWQpOwordm9pZCBiY21fZGV2X2xvZ19zZXRfY29udHJvbChiY21vc19ib29sIGNvbnRyb2wpOworCitiY21fZGV2X2xvZ19maWxlX2ZsYWdzIGJjbV9kZXZfbG9nX2dldF9maWxlX2ZsYWdzKHVpbnQzMl90IGZpbGVfaWQpOwordm9pZCBiY21fZGV2X2xvZ19zZXRfZmlsZV9mbGFncyh1aW50MzJfdCBmaWxlX2lkLCBiY21fZGV2X2xvZ19maWxlX2ZsYWdzIGZsYWdzKTsKKworYmNtX2Rldl9sb2dfZmxhZ3MgYmNtX2Rldl9sb2dfZ2V0X2ZsYWdzKHZvaWQpOwordm9pZCBiY21fZGV2X2xvZ19zZXRfZmxhZ3MoYmNtX2Rldl9sb2dfZmxhZ3MgZmxhZ3MpOworCit2b2lkIGJjbV9kZXZfbG9nX3NldF9wcmludF9jYihiY21fZGV2X2xvZ19wcmludF9jYiBjYik7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF9nZXRfdGltZV9jYihiY21fZGV2X2xvZ19nZXRfdGltZV9jYiBjYik7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF90aW1lX3RvX3N0cl9jYihiY21fZGV2X2xvZ190aW1lX3RvX3N0cl9jYiBjYik7CisKKy8qIEZpbGUgaW5kZXggdG8gZmlsZSBoYW5kbGUgKi8KK2JjbV9kZXZfbG9nX2ZpbGUgKmJjbV9kZXZfbG9nX2ZpbGVfZ2V0KHVpbnQzMl90IGZpbGVfaW5kZXgpOworCisvKiBHZXQgbnVtYmVyIG9mIG1lc3NhZ2VzIHN0b3JlZCBpbiB0aGUgZmlsZSAqLwordWludDMyX3QgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9tZXNzYWdlcyhiY21fZGV2X2xvZ19maWxlICpmaWxlKTsKKworLyogR2V0IGZpbGUgaW5mbzogbWF4IGRhdGEgc2l6ZSwgdXNlZCBieXRlcyAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZ2V0X2ZpbGVfaW5mbyhiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCAqZmlsZV9zaXplLCB1aW50MzJfdCAqdXNlZF9ieXRlcyk7CisKKy8qIFJlYWQgZnJvbSBmaWxlLgorICogXHBhcmFtW2luXSAgICAgICAgICAgZmlsZSAgICBGaWxlIHRvIHJlYWQgZnJvbQorICogXHBhcmFtW2luLG91dF0gICAgICAgb2Zmc2V0ICBvZmZzZXQgdG8gcmVhZCBmcm9tLiAwPXJlYWQgZnJvbSB0aGUgc3RhcnQKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGJ1ZiAgICAgYnVmZmVyIHRvIHJlYWQgcmVjb3JkcyB0bworICogXHBhcmFtW2luXSAgICAgICAgICAgYnVmX2xlbiBidWYgc2l6ZQorICogXHJldHVybnMgLSBudW1iZXIgb2YgYnl0ZXMgcmVhZCA+PSAwIG9yIGJjbW9zX2Vycm5vIDwgMAorICogMCA9IG5vIG1vcmUgcmVjb3JkcyB0byByZWFkCisgKiBCQ01fRVJSX09WRVJGTE9XIC0gYnVmZmVyIGlzIHRvbyBzaG9ydCBmb3IgbG9nIHJlY29yZAorICovCitpbnQgYmNtX2Rldl9sb2dfZmlsZV9yZWFkKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIHVpbnQzMl90ICpvZmZzZXQsIGNoYXIgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbik7CisKKy8qIENsZWFyIGZpbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGZpbGUgICAgRmlsZSBoYW5kbGUKKyAqIFxyZXR1cm5zICAgICBiY21vc19lcnJubyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfY2xlYXIoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSk7CisKKy8qIEF0dGFjaCBmaWxlIHRvIG1lbW9yeSBidWZmZXIuCisgKiBUaGUgZmlsZSBkYXRhIGNhbiBiZSByZWFkIHVzaW5nIGJjbV9kZXZfbG9nX2ZpbGVfcmVhZCBvciBiY21fZGV2X2xvZ19maWxlX3JlYWRfY3V0CisgKiBccGFyYW1baW5dICAgICAgICAgICBidWYgICAgIGJ1ZmZlciB0byBiZSBpbnRlcnByZXRlZCBhcyBtZW1vcnkgZmlsZQorICogXHBhcmFtW2luXSAgICAgICAgICAgYnVmX2xlbiBidWYgc2l6ZQorICogXHBhcmFtW291dF0gICAgICAgICAgZmlsZSAgICBGaWxlIGhhbmRsZS4KKyAqIGZpbGVfaGFuZGxlIGhhcyB0byBiZSBkZXN0cm95ZWQgdXNpbmcgYmNtX2Rldl9sb2dfZmlsZV9kZXRhY2goKSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgKiBccmV0dXJucyAgICAgYmNtb3NfZXJybm8gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19maWxlX2F0dGFjaCh2b2lkICpidWYsIHVpbnQzMl90IGJ1Zl9sZW4sIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKiBEZXRhY2ggZmlsZSBoYW5kbGUgZnJvbSBtZW1vcnkgYnVmZmVyLgorICogRm9sbG93aW5nIHRoaXMgY2FsbCwgdGhlIGZpbGUgaGFuZGxlIGJlY29tZXMgaW52YWxpZAorICogXHBhcmFtW2luXSAgICAgICAgICAgZmlsZSAgICBGaWxlIGhhbmRsZS4KKyAqIFxyZXR1cm5zICAgICBiY21vc19lcnJubyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfZGV0YWNoKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKiBSZWdpc3RlciBpbmRpY2F0aW9uIHRvIGJlIHNlbnQgd2hlbiBmaWxlIHV0aWxpemF0aW9uIGNyb3NzZXMgdGhyZXNob2xkICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19hbG1vc3RfZnVsbF9pbmRfcmVnaXN0ZXIoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgdXNlZF9ieXRlc190aHJlc2hvbGQsCisgICAgRl9kZXZfbG9nX2ZpbGVfYWxtb3N0X2Z1bGwgc2VuZF9pbmRfY2IsIGxvbmcgaW5kX2NiX3ByaXYpOworCit2b2lkIGRldl9sb2dfZ2V0X2xvZ19uYW1lX3RhYmxlKGNoYXIgKmJ1ZmZlciwgdWludDMyX3QgYnVmX2xlbik7CisKK3ZvaWQgYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQodm9pZCk7CisKKy8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gbG9nIGxldmVsIHF1YWxpZmllcyBhcyBhbiBlcnJvci4gKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21fZGV2X2xvZ19sZXZlbF9pc19lcnJvcihiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWwpCit7CisgICAgcmV0dXJuIGxvZ19sZXZlbCA9PSBERVZfTE9HX0xFVkVMX0ZBVEFMIHx8IGxvZ19sZXZlbCA9PSBERVZfTE9HX0xFVkVMX0VSUk9SOworfQorCisvKiogUmV0dXJucyB0aGUgcGVyY2VudGFnZSAoMCAtIDEwMCkgb2YgdGhlIG1zZyBwb29sIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZS4gKi8KK3VpbnQ4X3QgYmNtX2Rldl9sb2dfcG9vbF9vY2N1cGFuY3lfcGVyY2VudF9nZXQodm9pZCk7CisKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19zZXRfdGhyb3R0bGUoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLCB1aW50MzJfdCB4aV90aHJvdHRsZSk7CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX3NldF90cmlnZ2VyKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwgdWludDMyX3QgeGlfc3RhcnQsIHVpbnQzMl90IHhpX3N0b3AsIGludDMyX3QgeGlfcmVwZWF0KTsKKyNlbmRpZiAvKiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFICovCisKKyNlbmRpZiAvKiBFTkFCTEVfTE9HICovCisKKyNlbmRpZiAvKiBfX0JDTV9ERVZfTE9HX1RBU0tfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEzZTgxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9fQkNNX0RFVl9MT0dfVEFTS19JTlRFUk5BTF9IXworI2RlZmluZSBfX0JDTV9ERVZfTE9HX1RBU0tfSU5URVJOQUxfSF8KKworI2lmZGVmIEVOQUJMRV9MT0cKKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisjZGVmaW5lIExPR19OQU1FX05PX0lOU1RBTkNFIDB4ZmYKKyNkZWZpbmUgTE9HX05BTUVfTEVOR1RIICAgICAgMTAwCisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9ERVZfTE9HX1NUQVRFX1VOSU5JVElBTElaRUQsCisgICAgQkNNX0RFVl9MT0dfU1RBVEVfRElTQUJMRUQsCisgICAgQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRCwKK30gYmNtX2Rldl9sb2dfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtX2Rldl9sb2dfcGFybSBkZXZfbG9nX3Bhcm07CisgICAgYmNtX2Rldl9sb2dfZmlsZSBmaWxlc1tERVZfTE9HX01BWF9GSUxFU107IC8qIGxvZyBmaWxlcyAqLworICAgIHVpbnQzMl90IG1zZ19jb3VudDsgLyogTWVzc2FnZSBjb3VudGVyICovCisgICAgZGV2X2xvZ19pZF9wYXJtIGlkc1tERVZfTE9HX01BWF9JRFNdOyAvKiBkZXZfbG9nIElEUyBhcnJheSAqLworICAgIHVpbnQzMl90IG51bV9pZHM7IC8qIE51bWJlciBvZiBhY3R1YWxseSByZWdpc3RlcmVkIGlkcyAqLworICAgIGJjbV9kZXZfbG9nX3N0YXRlIHN0YXRlOworICAgIGJjbW9zX21zZ19xdWV1ZSBzYXZlX3F1ZXVlOyAvKiBMb2cgbWVzc2FnZXMgdG8gYmUgc2F2ZWQgdG8gUkFNIChmaXJzdCBzdGFnZSBvZiBwaXBlbGluZSkgKi8KKyAgICBiY21vc19tc2dfcXVldWUgcHJpbnRfcXVldWU7IC8qIExvZyBtZXNzYWdlcyB0byBiZSBwcmludGVkIChzZWNvbmQgc3RhZ2Ugb2YgcGlwZWxpbmUpICovCisgICAgYmNtb3NfdGFzayBzYXZlX3Rhc2s7CisgICAgYmNtb3NfdGFzayBwcmludF90YXNrOworICAgIGJjbW9zX3NlbSBzYXZlX3Rhc2tfaXNfdGVybWluYXRlZDsKKyAgICBiY21vc19zZW0gcHJpbnRfdGFza19pc190ZXJtaW5hdGVkOworICAgIGJjbW9zX21zZ19wb29sIHBvb2w7CisgICAgYmNtX2Rldl9sb2dfZmxhZ3MgZmxhZ3M7IC8qIEdlbmVyYWwgZmxhZ3MgYXBwbGllZCBvbiB0aGUgZW50aXJlIGZlYXR1cmUgKHVubGlrZSBmaWxlIGZsYWdzIHdoaWNoIHJlc2lkZSBpbiAnZmlsZXMnIHN1Yi1zdHJ1Y3R1cmUpLiAqLworfSBiY21fZGV2X2xvZzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmxvZ19pZDsKKyAgICB1aW50MzJfdCB0aW1lX3N0YW1wOworICAgIGJjbV9kZXZfbG9nX2xldmVsIG1zZ19sZXZlbDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtdDsKKyAgICAgICAgICAgIC8qIFJvb20gZm9yIE1BWCArIDEgYXJndW1lbnRzIHNpbmNlIHRoZSBhcmd1bWVudCBsaXN0IG5lZWRzIHRvIHN0YXJ0IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAtIHRoZSBmaXJzdAorICAgICAgICAgICAgICogZW50cnkgbWF5IGJlIHVudXNlZCBpZiB0aGUgYXJyYXkgZG9lc24ndCBuYXR1cmFsbHkgc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAqLworICAgICAgICAgICAgY29uc3Qgdm9pZCAqYXJnc1tERVZfTE9HX01BWF9BUkdTICsgMV07CisgICAgICAgIH0gZm10X2FyZ3M7IC8qIFJlbGV2YW50IGluIGRlZmF1bHQgbW9kZSAtIHdoZW4gbm90IHVzaW5nIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UICovCisgICAgICAgIGNoYXIgc3RyW01BWF9ERVZfTE9HX1NUUklOR19TSVpFXTsgLyogUmVsZXZhbnQgb25seSBpZiB1c2luZyBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCAqLworICAgIH0gdTsKK30gZGV2X2xvZ19xdWV1ZV9tc2c7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhciBuYW1lW0xPR19OQU1FX0xFTkdUSF07CisgICAgdWludDhfdCBmaXJzdF9pbnN0YW5jZTsKKyAgICB1aW50OF90IGxhc3RfaW5zdGFuY2U7Cit9bG9nX25hbWVfdGFibGU7CisKK2V4dGVybiBiY21fZGV2X2xvZyBkZXZfbG9nOworZXh0ZXJuIGNvbnN0IGNoYXIgKmxvZ19sZXZlbF9zdHI7CisKK2V4dGVybiBsb2dfbmFtZV90YWJsZSBsb2dzX25hbWVzW0RFVl9MT0dfTUFYX0lEU107CitleHRlcm4gdWludDhfdCBsb2dfbmFtZV90YWJsZV9pbmRleDsKKworYmNtb3NfZXJybm8gX2JjbV9kZXZfbG9nX2ZpbGVfY2xlYXJfbm9fbG9jayh1aW50MzJfdCBmaWxlX2luZGV4KTsKKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KKworI2VuZGlmIC8qIF9fQkNNX0RFVl9MT0dfVEFTS19JTlRFUk5BTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODgyY2JjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIyBkZXZfbG9nIGxpbnV4IHN1cHBvcnQKKyMgbGludXggdXNlciBzcGFjZQorIyAKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gZGV2X2xvZ19saW51eAorTU9EX1RZUEUgPSBsaWIKKworaWZlcSAoIiQoRU5BQkxFX0xPRykiLCAieSIpCisKK01PRF9ERVBTID0gZGV2X2xvZworc3JjcyA9IGJjbW9sdF9kZXZfbG9nX2xpbnV4LmMKKworZW5kaWYKKworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2JjbW9sdF9kZXZfbG9nX2xpbnV4LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9iY21vbHRfZGV2X2xvZ19saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTJhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9iY21vbHRfZGV2X2xvZ19saW51eC5jCkBAIC0wLDAgKzEsMjcwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2Rldl9sb2dfbGludXguYworICoKKyAqIExpbnV4LXNwZWNpZmljIGNvZGUuIFVzZXIgc3BhY2UKKyAqLworCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9sb2dfbGludXguaD4KKyNpbmNsdWRlIDxrZXJuZWwvYmNtb2x0X2Rldl9sb2dfaW9jdGwuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2RlZmluZSBCQ01fREVWX0xPR19GSUxFX05BTUUgICAgICAgICAgICIvZGV2L2JjbV9sb2ciCisjZGVmaW5lIEJDTV9ERVZfTE9HX1BPTExfSU5URVJWQUxfVVMgICAgMTAwMDAKKworc3RhdGljIGludCBkZXZfbG9nX2ZpbGU7CitzdGF0aWMgYmNtb3NfdGFzayBkZXZfbG9nX3JlYWRfdGFzazsKK3N0YXRpYyBpbnQgbWF4X2tlcm5lbF9pZF9pbmRleDsKKy8qCisgKiBJbnRlcm5hbCBoZWxwZXJzCisgKi8KKworLyogcmVhZCBrZXJuZWwgREIgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfZGV2X2xvZ19rZXJuZWxfZGJfcmVhZCh2b2lkKQoreworICAgIGRldl9sb2dfaW9fcGFyYW0gaW9fcGFyYW07CisgICAgaW50IGk7CisKKyAgICBpZiAoaW9jdGwoZGV2X2xvZ19maWxlLCBERVZfTE9HX0NIUkRFVl9EQl9SRUFELCAmaW9fcGFyYW0pID09IC0xKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfSU8sICJDYW4ndCByZWFkIGtlcm5lbCBkYXRhIGJhc2UuIEVycm9yICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIGtlcm5lbCBsb2cgaWRzICovCisgICAgZm9yIChpPTA7IGk8aW9fcGFyYW0uZGJfcmVhZC5udW1faWRzOyBpKyspCisgICAgeworICAgICAgICBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5uYW1lLAorICAgICAgICAgICAgaW9fcGFyYW0uZGJfcmVhZC5pZHNbaV0uZGVmYXVsdF9sZXZlbCwKKyAgICAgICAgICAgIGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLmRlZmF1bHRfdHlwZSk7CisgICAgfQorICAgIG1heF9rZXJuZWxfaWRfaW5kZXggPSBpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIGlkZW50aWZ5IGxvZyBsZXZlbCBieSBsZXZlbCBjaGFyICovCitzdGF0aWMgYmNtX2Rldl9sb2dfbGV2ZWwgX2Rldl9sb2dfbGV2ZWxfYnlfY2hhcihjaGFyIGNsZXZlbCkKK3sKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsZXZlbDsKKworICAgIHN3aXRjaCAoY2xldmVsKQorICAgIHsKKyAgICBjYXNlICdGJzogbGV2ZWwgPSBERVZfTE9HX0xFVkVMX0ZBVEFMOyBicmVhazsKKyAgICBjYXNlICdFJzogbGV2ZWwgPSBERVZfTE9HX0xFVkVMX0VSUk9SOyBicmVhazsKKyAgICBjYXNlICdXJzogbGV2ZWwgPSBERVZfTE9HX0xFVkVMX1dBUk5JTkc7IGJyZWFrOworICAgIGNhc2UgJ0knOiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfSU5GTzsgYnJlYWs7CisgICAgY2FzZSAnRCc6IGxldmVsID0gREVWX0xPR19MRVZFTF9ERUJVRzsgYnJlYWs7CisgICAgZGVmYXVsdDogbGV2ZWwgPSBERVZfTE9HX0xFVkVMX05PX0xPRzsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGxldmVsOworfQorCisvKiByZWFkX2J1ZiB0YXNrIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgX2Rldl9sb2dfcmVhZF9rZXJuZWxfYnVmX2hhbmRsZXIobG9uZyBkYXRhKQoreworICAgIGRldl9sb2dfaW9fcGFyYW0gaW9fcGFyYW0gPSB7fTsKKyAgICB1bnNpZ25lZCBsb25nIGxvZ190aW1lOworICAgIGNoYXIgbGV2ZWxfY2hhcjsKKyAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgIGludCBuOworICAgIGRldl9sb2dfaWQgaWQ7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbGV2ZWw7CisKKyAgICB3aGlsZSAoZGV2X2xvZ19maWxlKQorICAgIHsKKyAgICAgICAgaWYgKGlvY3RsKGRldl9sb2dfZmlsZSwgREVWX0xPR19DSFJERVZfTVNHX1JFQUQsICZpb19wYXJhbSkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiBubyBlbnRyaWVzIC0gc2xlZXAgYW50IHJldHJ5LiBPdGhlcndpc2UgLSBzdG9wICovCisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3VzbGVlcChCQ01fREVWX0xPR19QT0xMX0lOVEVSVkFMX1VTKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiaW9jdGwoKS0+JWQgKCVzKVxuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhcnNlIGtlcm5lbCBtZXNzYWdlICovCisgICAgICAgIG4gPSBzc2NhbmYoaW9fcGFyYW0ubXNnX3JlYWQubXNnLCAiWyVsdTogJWMgJTIwc10iLCAmbG9nX3RpbWUsICZsZXZlbF9jaGFyLCBsb2dfbmFtZSk7CisgICAgICAgIGlmIChuIDwgMykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBwYXJzZSBrZXJuZWwgbG9nOiAlc1xuIiwgaW9fcGFyYW0ubXNnX3JlYWQubXNnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogSWRlbnRpZnkgbG9nX2lkICovCisgICAgICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X25hbWUobG9nX25hbWUpOworICAgICAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGlkZW50aWZ5IGxvZyBpZDogJXNcbiIsIGlvX3BhcmFtLm1zZ19yZWFkLm1zZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElkZW50aWZ5IGxvZ19sZXZlbCAqLworICAgICAgICBsZXZlbCA9IF9kZXZfbG9nX2xldmVsX2J5X2NoYXIobGV2ZWxfY2hhcik7CisgICAgICAgIGlmIChsZXZlbCA9PSBERVZfTE9HX0xFVkVMX05PX0xPRykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBpZGVudGlmeSBsb2cgbGV2ZWw6ICVzXG4iLCBpb19wYXJhbS5tc2dfcmVhZC5tc2cpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBsb2cga2VybmVsIG1lc3NhZ2UgaW4gdXNlci1zcGFjZSBsb2dnZXIuCisgICAgICAgICAqIERvIG5vdCBnZW5lcmF0ZSBoZWFkZXIuIEl0IGlzIGFscmVhZHkgaW4gdGhlIG1lc3NhZ2UKKyAgICAgICAgICovCisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyhpZCwgbGV2ZWwsIEJDTV9MT0dfRkxBR19OT19IRUFERVIgfCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgIiVzIiwgaW9fcGFyYW0ubXNnX3JlYWQubXNnKTsKKyAgICB9CisgICAgQkNNT1NfVFJBQ0VfSU5GTygiS2VybmVsIGxvZ2dlciBkYWVtb24gdGVybWluYXRlZFxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqIExpbnV4LXNwZWNpZmljIGluaXQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2luaXQodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciAqdGFza19uYW1lID0gImtlcm5lbF9sb2ciOworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrcCA9CisgICAgeworICAgICAgICAubmFtZSA9IHRhc2tfbmFtZSwKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9ERVZfTE9HX0tFUk5FTCwKKyAgICAgICAgLmhhbmRsZXIgPSBfZGV2X2xvZ19yZWFkX2tlcm5lbF9idWZfaGFuZGxlcgorICAgIH07CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoZGV2X2xvZ19maWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworCisgICAgLyogUmVhZCBrZXJuZWwgcmVnaXN0cmF0aW9ucyAqLworICAgIGRldl9sb2dfZmlsZSA9IG9wZW4oQkNNX0RFVl9MT0dfRklMRV9OQU1FLCBPX1JEV1IpOworICAgIGlmIChkZXZfbG9nX2ZpbGUgPCAwKQorICAgIHsKKyAgICAgICAgZGV2X2xvZ19maWxlID0gMDsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9FTlQsICJDYW4ndCBvcGVuICVzIGZvciByZWFkL3dyaXRlLiBFcnJvciAlc1xuIiwKKyAgICAgICAgICAgIEJDTV9ERVZfTE9HX0ZJTEVfTkFNRSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICAvKiBSZWFkIGtlcm5lbCBkYXRhIGJhc2UgKi8KKyAgICByYyA9IF9kZXZfbG9nX2tlcm5lbF9kYl9yZWFkKCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgY2xvc2UoZGV2X2xvZ19maWxlKTsKKyAgICAgICAgZGV2X2xvZ19maWxlID0gMDsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhIHRhc2sgdGhhdCB3aWxsIHBvbGwga2VybmVsIGJ1ZmZlciAqLworICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJmRldl9sb2dfcmVhZF90YXNrLCAmdGFza3ApOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGNsb3NlKGRldl9sb2dfZmlsZSk7CisgICAgICAgIGRldl9sb2dfZmlsZSA9IDA7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihyYywgIkNhbid0IGNyZWF0ZSByZWFkX2tlcm5lbF9idWYgdGFza1xuIik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBMaW51eC1zcGVjaWZpYyBjbGVhbnVwICovCit2b2lkIGJjbV9kZXZfbG9nX2xpbnV4X2V4aXQodm9pZCkKK3sKKyAgICBpbnQgZiA9IGRldl9sb2dfZmlsZTsKKyAgICBpZiAoIWRldl9sb2dfZmlsZSkKKyAgICAgICAgcmV0dXJuOworICAgIGRldl9sb2dfZmlsZSA9IDA7CisgICAgY2xvc2UoZik7IC8qIHdpbGwgY2F1c2UgcGVuZGluZyBpb2N0bCB0byB1bmxvY2sgKi8KKyAgICBiY21vc190YXNrX2Rlc3Ryb3koJmRldl9sb2dfcmVhZF90YXNrKTsKK30KKworLyogbm90aWZ5IGRldl9sb2cgaW4ga2VybmVsIHNwYWNlIGFib3V0IGxvZ190eXBlIGNoYW5nZSAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfbGludXhfaWRfc2V0X3R5cGUoZGV2X2xvZ19pZCBsb2dfaWQsIGJjbV9kZXZfbG9nX2lkX3R5cGUgbG9nX3R5cGUpCit7CisgICAgZGV2X2xvZ19pb19wYXJhbSBpb19wYXJhbTsKKyAgICB1aW50MzJfdCBpZHg7CisKKyAgICBpZiAoIWRldl9sb2dfZmlsZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisKKyAgICAvKiBtYXAgdG8gaW5kZXguIGlkIGluIGtlcm5lbCBzcGFjZSBpcyBkaWZmZXJlbnQgKi8KKyAgICBpZHggPSBiY21fZGV2X2xvZ19nZXRfaW5kZXhfYnlfaWQobG9nX2lkKTsKKyAgICBpZiAoaWR4ID09IERFVl9MT0dfSU5WQUxJRF9JTkRFWCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJDYW4ndCBtYXAgbG9nX2lkIHRvIGluZGV4XG4iKTsKKyAgICB9CisKKyAgICAvKiBJZ25vcmUgdGhlIHJlcXVlc3QgaWYgbG9nX2lkIGlzIG5vdCBpbiB0aCBla2VybmVsICovCisgICAgaWYgKGlkeCA+IG1heF9rZXJuZWxfaWRfaW5kZXgpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgaW9fcGFyYW0udHlwZV9zZXQuaW5kZXggPSBpZHg7CisgICAgaW9fcGFyYW0udHlwZV9zZXQudHlwZSA9IGxvZ190eXBlOworICAgIGlmIChpb2N0bChkZXZfbG9nX2ZpbGUsIERFVl9MT0dfQ0hSREVWX1RZUEVfU0VULCAmaW9fcGFyYW0pID09IC0xKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfSU8sICJDYW4ndCBzZXQgdHlwZSBmb3Iga2VybmVsIGxvZyBpZCAlbHUuIEVycm9yICVzXG4iLCBsb2dfaWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIG5vdGlmeSBkZXZfbG9nIGluIGtlcm5lbCBzcGFjZSBhYm91dCBsb2dfbGV2ZWwgY2hhbmdlICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfbGV2ZWwoZGV2X2xvZ19pZCBsb2dfaWQsIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbF9wcmludCwgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsX3NhdmUpCit7CisgICAgdWludDMyX3QgaWR4OworICAgIGRldl9sb2dfaW9fcGFyYW0gaW9fcGFyYW07CisKKyAgICBpZiAoIWRldl9sb2dfZmlsZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisKKyAgICAvKiBtYXAgdG8gaW5kZXguIGlkIGluIGtlcm5lbCBzcGFjZSBpcyBkaWZmZXJlbnQgKi8KKyAgICBpZHggPSBiY21fZGV2X2xvZ19nZXRfaW5kZXhfYnlfaWQobG9nX2lkKTsKKyAgICBpZiAoaWR4ID09IERFVl9MT0dfSU5WQUxJRF9JTkRFWCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJDYW4ndCBtYXAgbG9nX2lkIHRvIGluZGV4XG4iKTsKKyAgICB9CisKKyAgICAvKiBJZ25vcmUgdGhlIHJlcXVlc3QgaWYgbG9nX2lkIGlzIG5vdCBpbiB0aGUga2VybmVsICovCisgICAgaWYgKGlkeCA+IG1heF9rZXJuZWxfaWRfaW5kZXgpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgaW9fcGFyYW0ubGV2ZWxfc2V0LmluZGV4ID0gaWR4OworICAgIGlvX3BhcmFtLmxldmVsX3NldC5sZXZlbF9wcmludCA9IGxvZ19sZXZlbF9wcmludDsKKyAgICBpb19wYXJhbS5sZXZlbF9zZXQubGV2ZWxfc2F2ZSA9IGxvZ19sZXZlbF9zYXZlOworCisgICAgaWYgKGlvY3RsKGRldl9sb2dfZmlsZSwgREVWX0xPR19DSFJERVZfTEVWRUxfU0VULCAmaW9fcGFyYW0pID09IC0xKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfSU8sICJDYW4ndCBzZXQgbGV2ZWwgZm9yIGtlcm5lbCBsb2cgaWQgJWx1LiBFcnJvciAlc1xuIiwgbG9nX2lkLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvYmNtb2x0X2Rldl9sb2dfbGludXguaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2JjbW9sdF9kZXZfbG9nX2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzNmUxMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2JjbW9sdF9kZXZfbG9nX2xpbnV4LmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbV9kZXZfbG9nX2xpbnV4LmgKKyAqCisgKiBMaW51eC1zcGVjaWZpYyBjb2RlLiBVc2VyIHNwYWNlCisgKi8KKworI2lmbmRlZiBCQ01PTFRfREVWX0xPR19MSU5VWF9IXworI2RlZmluZSBCQ01PTFRfREVWX0xPR19MSU5VWF9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyoqIExpbnV4LXNwZWNpZmljIGluaXQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2luaXQodm9pZCk7CisKKy8qKiBMaW51eC1zcGVjaWZpYyBjbGVhbnVwICovCit2b2lkIGJjbV9kZXZfbG9nX2xpbnV4X2V4aXQodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBYnN0cmFjdDogU2V0IGN1cnJlbnQgbG9nIHR5cGUgZm9yIGFuIElECisgKgorICogXHBhcmFtW2luXSAgIGxvZ19pZCAgICAgIExvZyBpZAorICogXHBhcmFtW2luXSAgIGxvZ190eXBlICAgIExvZyB0eXBlCisgKgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfbGludXhfaWRfc2V0X3R5cGUoZGV2X2xvZ19pZCBsb2dfaWQsIGJjbV9kZXZfbG9nX2lkX3R5cGUgbG9nX3R5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWJzdHJhY3Q6IFNldCBjdXJyZW50IGxvZyBsZXZlbCBmb3IgYW4gSUQKKyAqCisgKiBccGFyYW1baW5dICAgbG9nX2lkICAgICAgICAgIExvZyBpZAorICogXHBhcmFtW2luXSAgIGxvZ19sZXZlbF9wcmludCBQcmludCBsZXZlbAorICogXHBhcmFtW2luXSAgIGxvZ19sZXZlbF9zYXZlICBTYXZlIGxldmVsCisgKgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfbGludXhfaWRfc2V0X2xldmVsKGRldl9sb2dfaWQgbG9nX2lkLCBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWxfcHJpbnQsIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbF9zYXZlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlNDE1OAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACisjIGRldl9sb2cgLSBrZXJuZWwgc3VwcG9ydAorIworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gZGV2X2xvZ19rZXJuZWwKK01PRF9UWVBFID0gbGludXhfbGliCisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorCitNT0RfREVGUyA9IC1ERU5BQkxFX0xPRworCitzcmNzID0gYmNtX2Rldl9sb2cuYyBiY21fZGV2X2xvZ190YXNrLmMgYmNtb2x0X2Rldl9sb2dfa2VybmVsLmMgCisKKyMgSWYgY2FsbGVkIGJ5IGxpbnV4IGtlcm5lbCBidWlsZGVyIC0gYWRkIGluY2x1ZGUgcGF0aHMgbWFudWFsbHkuCisjIEl0IGlzIG5vdCBlbGVnYW50LCBidXQgd2UnbGwgbm90IGhhdmUgbWFueSBsaW51eCBtb2R1bGVzCitpZm5lcSAoIiQoS0JVSUxEX1NSQykiLCAiIikKKyAgICAtaW5jbHVkZSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitlbmRpZgorCisjIGlmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorZW5kaWYKKworIyBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2cuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA3Yjc5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2cuYwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2cuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVkMzAxYmQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2cuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWEzMTZhNwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ19jbGkuYwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX2NsaS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmM0NDgwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfY2xpLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ19jbGkuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmM0YThiMmIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFzay5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2suaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOTlhY2Q2ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41NTczODgyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19pb2N0bC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNTM2YwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19pb2N0bC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0RFVl9MT0dfSU9DVExfSF8KKyNkZWZpbmUgQkNNT0xUX0RFVl9MT0dfSU9DVExfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisjZGVmaW5lIERFVl9MT0dfQ0hSREVWX01BWF9LRVJORUxfSURTICAgMzIKKworLyogSUQgZGVzY3JpcHRvciAqLwordHlwZWRlZiBzdHJ1Y3QgZGV2X2xvZ19pZF9pbmZvCit7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgY2hhciBuYW1lW01BWF9ERVZfTE9HX0lEX05BTUUgKyAxXTsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBkZWZhdWx0X2xldmVsOworICAgIGJjbV9kZXZfbG9nX2lkX3R5cGUgZGVmYXVsdF90eXBlOworfSBkZXZfbG9nX2lkX2luZm87CisKKy8qIGlvY3RsIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgdW5pb24gZGV2X2xvZ19pb19wYXJhbQoreworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgaW50IG51bV9pZHM7CisgICAgICAgIGRldl9sb2dfaWRfaW5mbyBpZHNbREVWX0xPR19DSFJERVZfTUFYX0tFUk5FTF9JRFNdOworICAgIH0gZGJfcmVhZDsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgdWludDMyX3QgaW5kZXg7CisgICAgICAgIGJjbV9kZXZfbG9nX2xldmVsIGxldmVsX3ByaW50OworICAgICAgICBiY21fZGV2X2xvZ19sZXZlbCBsZXZlbF9zYXZlOworICAgIH0gbGV2ZWxfc2V0OworCisgICAgc3RydWN0CisgICAgeworICAgICAgICB1aW50MzJfdCBpbmRleDsKKyAgICAgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSB0eXBlOworICAgIH0gdHlwZV9zZXQ7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgY2hhciBtc2dbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUgKyAxXTsKKyAgICB9IG1zZ19yZWFkOworCit9IGRldl9sb2dfaW9fcGFyYW07CisKKy8qIFVzZSAnUycgYXMgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIERFVl9MT0dfQ0hSREVWX0lPQ19NQUdJQyAgJ1MnCisKKyNkZWZpbmUgREVWX0xPR19DSFJERVZfREJfUkVBRCAgICAgICAgICBfSU9SKERFVl9MT0dfQ0hSREVWX0lPQ19NQUdJQywgMSwgZGV2X2xvZ19pb19wYXJhbSkKKyNkZWZpbmUgREVWX0xPR19DSFJERVZfTEVWRUxfU0VUICAgICAgICBfSU9XKERFVl9MT0dfQ0hSREVWX0lPQ19NQUdJQywgMiwgZGV2X2xvZ19pb19wYXJhbSkKKyNkZWZpbmUgREVWX0xPR19DSFJERVZfVFlQRV9TRVQgICAgICAgICBfSU9XKERFVl9MT0dfQ0hSREVWX0lPQ19NQUdJQywgMywgZGV2X2xvZ19pb19wYXJhbSkKKyNkZWZpbmUgREVWX0xPR19DSFJERVZfTVNHX1JFQUQgICAgICAgICBfSU9SKERFVl9MT0dfQ0hSREVWX0lPQ19NQUdJQywgNCwgZGV2X2xvZ19pb19wYXJhbSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtb2x0X2Rldl9sb2dfa2VybmVsLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtb2x0X2Rldl9sb2dfa2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzMzY3NAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4gICAgICAgLyogZXZlcnl0aGluZy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+ICAgIC8qIE9fQUNDTU9ERSAqLworI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGJjbV9kZXZfbG9nX3Rhc2suaD4KKyNpbmNsdWRlIDxiY21vbHRfZGV2X2xvZ19rZXJuZWwuaD4KKyNpbmNsdWRlIDxiY21vbHRfZGV2X2xvZ19pb2N0bC5oPgorCitpbnQgZGV2X2xvZ19jaHJkZXZfbWFqb3IgPSAyMTU7ICAgICAgICAgLyogU2hvdWxkIGNvbXBseSB0aGUgdmFsdWUgaW4gdGFyZ2V0cy9tYWtlRGV2ICovCittb2R1bGVfcGFyYW0oZGV2X2xvZ19jaHJkZXZfbWFqb3IsIGludCwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lXR1JQKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X2xvZ19jaHJkZXZfbWFqb3IsICJkZXZsb2dfbWFqb3IiKTsKKworaW50IGRldl9sb2dfYnVmZmVyX3NpemVfa2IgPSAyMDQ4OyAgICAgIC8qIEJ1ZmZlciBzaXplIGluIGtCICovCittb2R1bGVfcGFyYW0oZGV2X2xvZ19idWZmZXJfc2l6ZV9rYiwgaW50LCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApOworTU9EVUxFX1BBUk1fREVTQyhkZXZfbG9nX2J1ZmZlcl9zaXplX2tiLCAiZGV2bG9nX2J1ZnNpemVfa2IiKTsKKworaW50IGRldl9sb2dfcXVldWVfc2l6ZSA9IDI1NjsgICAgICAgICAgIC8qIFF1ZXVlIHNpemUgKi8KK21vZHVsZV9wYXJhbShkZXZfbG9nX3F1ZXVlX3NpemUsIGludCwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lXR1JQKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X2xvZ19xdWV1ZV9zaXplLCAiZGV2bG9nX3FzaXplIik7CisKK3N0YXRpYyBiY21vc19tdXRleCBkZXZfbG9nX2xvY2s7CitzdGF0aWMgaW50IGRldl9sb2dfbnVtX3VzZXJzOworc3RhdGljIGNoYXIgKmRldl9sb2dfYnVmZmVyOworCisvKgorICogT3BlbiBhbmQgY2xvc2UKKyAqLworc3RhdGljIGludCBkZXZfbG9nX2NocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIEJDTU9TX1RSQUNFX0RFQlVHKCJcbiIpOworICAgIGJjbW9zX211dGV4X2xvY2soJmRldl9sb2dfbG9jayk7CisgICAgaWYgKGRldl9sb2dfbnVtX3VzZXJzID49IDEpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmRldl9sb2dfbG9jayk7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorICAgICsrZGV2X2xvZ19udW1fdXNlcnM7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZkZXZfbG9nX2xvY2spOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGV2X2xvZ19jaHJkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKyAgICBCQ01PU19UUkFDRV9ERUJVRygiXG4iKTsKKyAgICAtLWRldl9sb2dfbnVtX3VzZXJzOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkZXZfbG9nX2NocmRldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKyAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpCit7CisgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgbG9uZyBkZXZfbG9nX2NocmRldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgaW50IGxpbnV4X3JjID0gMDsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBkZXZfbG9nX2lvX3BhcmFtIGlvX3BhcmFtOworICAgIGRldl9sb2dfaWQgaWQ7CisKKyAgICAvKiBkb24ndCBldmVuIGRlY29kZSB3cm9uZyBjbWRzOiBiZXR0ZXIgcmV0dXJuaW5nICBFTk9UVFkgdGhhbiBFRkFVTFQgKi8KKyAgICBpZiAoX0lPQ19UWVBFKGNtZCkgIT0gREVWX0xPR19DSFJERVZfSU9DX01BR0lDKQorICAgICAgICByZXR1cm4gLUVOT1RUWTsKKworICAgIC8qCisgICAgICogdGhlIHR5cGUgaXMgYSBiaXRtYXNrLCBhbmQgVkVSSUZZX1dSSVRFIGNhdGNoZXMgUi9XCisgICAgICogdHJhbnNmZXJzLiBOb3RlIHRoYXQgdGhlIHR5cGUgaXMgdXNlci1vcmllbnRlZCwgd2hpbGUKKyAgICAgKiB2ZXJpZnlfYXJlYSBpcyBrZXJuZWwtb3JpZW50ZWQsIHNvIHRoZSBjb25jZXB0IG9mICJyZWFkIiBhbmQKKyAgICAgKiAid3JpdGUiIGlzIHJldmVyc2VkCisgICAgICovCisgICAgaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpCisgICAgICAgIGxpbnV4X3JjID0gIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworICAgIGVsc2UgaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1dSSVRFKQorICAgICAgICBsaW51eF9yYyA9ICAhYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKTsKKyAgICBpZiAobGludXhfcmMpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworCisgICAgY2FzZSBERVZfTE9HX0NIUkRFVl9EQl9SRUFEOgorICAgIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJjbV9kZXZfbG9nX2dldF9udW1fb2ZfZW50cmllcygpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldl9sb2dfaWRfcGFybSBpZF9wYXJtID0ge307CisKKyAgICAgICAgICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KGkpOworICAgICAgICAgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX2lkX2dldChpZCwgJmlkX3Bhcm0pOworICAgICAgICAgICAgaW9fcGFyYW0uZGJfcmVhZC5pZHNbaV0uaW5kZXggPSBpOworICAgICAgICAgICAgc3RybmNweShpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5uYW1lLCBpZF9wYXJtLm5hbWUsIHNpemVvZihpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5uYW1lKSk7CisgICAgICAgICAgICBpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5kZWZhdWx0X3R5cGUgPSBpZF9wYXJtLmRlZmF1bHRfbG9nX3R5cGU7CisgICAgICAgICAgICBpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5kZWZhdWx0X2xldmVsID0gaWRfcGFybS5kZWZhdWx0X2xvZ19sZXZlbDsKKyAgICAgICAgICAgIC8qIFJlc2V0IHRvIGRlZmF1bHRzIHRvIGtlZXAgaW4gc3luYyB3aXRoIHRoZSB1c2VyIHNwYWNlICovCisgICAgICAgICAgICBiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWxzX2FuZF90eXBlX3RvX2RlZmF1bHQoaWQpOworICAgICAgICB9CisgICAgICAgIGlvX3BhcmFtLmRiX3JlYWQubnVtX2lkcyA9IGk7CisgICAgICAgIGxpbnV4X3JjID0gY29weV90b191c2VyKChjaGFyICopYXJnLCAoY2hhciAqKSZpb19wYXJhbS5kYl9yZWFkLCBzaXplb2YoaW9fcGFyYW0uZGJfcmVhZCkpOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgREVWX0xPR19DSFJERVZfTEVWRUxfU0VUOgorICAgIHsKKyAgICAgICAgbGludXhfcmMgPSBjb3B5X2Zyb21fdXNlcigoY2hhciAqKSZpb19wYXJhbS5sZXZlbF9zZXQsIChjaGFyICopYXJnLCBzaXplb2YoaW9fcGFyYW0ubGV2ZWxfc2V0KSk7CisgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgoaW9fcGFyYW0ubGV2ZWxfc2V0LmluZGV4KTsKKyAgICAgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJsb2dfaWQgaW5kZXggJXUgaXMgaW52YWxpZFxuIiwgaW9fcGFyYW0ubGV2ZWxfc2V0LmluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByYyA9IGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbChpZCwgaW9fcGFyYW0ubGV2ZWxfc2V0LmxldmVsX3ByaW50LCBpb19wYXJhbS5sZXZlbF9zZXQubGV2ZWxfc2F2ZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWwoJWxkLCVkLCVkKS0+JXNcbiIsCisgICAgICAgICAgICAgICAgKGxvbmcpaWQsIChpbnQpaW9fcGFyYW0ubGV2ZWxfc2V0LmxldmVsX3ByaW50LCAoaW50KWlvX3BhcmFtLmxldmVsX3NldC5sZXZlbF9zYXZlLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgbGludXhfcmMgPSAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBERVZfTE9HX0NIUkRFVl9UWVBFX1NFVDoKKyAgICB7CisgICAgICAgIGxpbnV4X3JjID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikmaW9fcGFyYW0udHlwZV9zZXQsIChjaGFyICopYXJnLCBzaXplb2YoaW9fcGFyYW0udHlwZV9zZXQpKTsKKyAgICAgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBNYXAgaW5kZXggdG8gbG9nIGlkICovCisgICAgICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KGlvX3BhcmFtLnR5cGVfc2V0LmluZGV4KTsKKyAgICAgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJsb2dfaWQgaW5kZXggJXUgaXMgaW52YWxpZFxuIiwgaW9fcGFyYW0udHlwZV9zZXQuaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJjID0gYmNtX2Rldl9sb2dfaWRfc2V0X3R5cGUoaWQsIGlvX3BhcmFtLnR5cGVfc2V0LnR5cGUpOworICAgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiYmNtX2Rldl9sb2dfaWRfc2V0X3R5cGUoJWxkLCVkKS0+JXNcbiIsCisgICAgICAgICAgICAgICAgKGxvbmcpaWQsIChpbnQpaW9fcGFyYW0udHlwZV9zZXQudHlwZSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgIGxpbnV4X3JjID0gLUVJTlZBTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgREVWX0xPR19DSFJERVZfTVNHX1JFQUQ6CisgICAgeworICAgICAgICB1aW50MzJfdCBidWZfbGVuID0gc2l6ZW9mKGlvX3BhcmFtLm1zZ19yZWFkLm1zZyk7CisgICAgICAgIGJjbV9kZXZfbG9nX2ZpbGUgKmxvZ19maWxlID0gYmNtX2Rldl9sb2dfZmlsZV9nZXQoMCk7CisKKyAgICAgICAgaWYgKCFsb2dfZmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgbGludXhfcmMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJmlvX3BhcmFtLm1zZ19yZWFkLCAoY2hhciAqKWFyZywgc2l6ZW9mKGlvX3BhcmFtLm1zZ19yZWFkLm9mZnNldCkpOworICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcmMgPSBiY21fZGV2X2xvZ19maWxlX3JlYWQobG9nX2ZpbGUsICZpb19wYXJhbS5tc2dfcmVhZC5vZmZzZXQsIGlvX3BhcmFtLm1zZ19yZWFkLm1zZywgYnVmX2xlbik7CisgICAgICAgIGlmIChyYyA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmMgPT0gMCkKKyAgICAgICAgICAgICAgICBsaW51eF9yYyA9IC1FQUdBSU47CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGludXhfcmMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGludXhfcmMgPSBjb3B5X3RvX3VzZXIoKGNoYXIgKilhcmcsIChjaGFyICopJmlvX3BhcmFtLm1zZ19yZWFkLAorICAgICAgICAgICAgb2Zmc2V0b2YoZGV2X2xvZ19pb19wYXJhbSwgbXNnX3JlYWQubXNnKSArIHJjKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiAgLyogcmVkdW5kYW50LCBhcyBjbWQgd2FzIGNoZWNrZWQgYWdhaW5zdCBNQVhOUiAqLworICAgICAgICByYyA9IC1FTk9UVFk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBsaW51eF9yYzsKK30KKworLyoKKyAqIFRoZSBmb3BzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldl9sb2dfY2hyZGV2X2ZvcHMgPQoreworICAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorICAgIC5vcGVuID0gZGV2X2xvZ19jaHJkZXZfb3BlbiwKKyAgICAucmVsZWFzZSA9IGRldl9sb2dfY2hyZGV2X3JlbGVhc2UsCisgICAgLndyaXRlID0gZGV2X2xvZ19jaHJkZXZfd3JpdGUsCisgICAgLnVubG9ja2VkX2lvY3RsID0gZGV2X2xvZ19jaHJkZXZfaW9jdGwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2RldiBkZXZfbG9nX2NocmRldl9jZGV2Oworc3RhdGljIGludCBpc19jaHJkZXZfcmVnLCBpc19jZGV2X2FkZDsKKworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9sb2dfY2hyZGV2X2luaXQodm9pZCkKK3sKKyAgICBkZXZfdCBkZXYgPSBNS0RFVihkZXZfbG9nX2NocmRldl9tYWpvciwgMCk7CisgICAgaW50IGxpbnV4X3JjOworCisgICAgaXNfY2hyZGV2X3JlZyA9IDA7CisgICAgaXNfY2Rldl9hZGQgPSAwOworICAgIC8qCisgICAgICogUmVnaXN0ZXIgeW91ciBtYWpvciwgYW5kIGFjY2VwdCBhIGR5bmFtaWMgbnVtYmVyLgorICAgICAqLworICAgIGlmICghZGV2X2xvZ19jaHJkZXZfbWFqb3IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBsaW51eF9yYyA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAwLCAiZGV2X2xvZyIpOworICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgInJlZ2lzdGVyX2NocmRldl9yZWdpb24oKS0+JWRcbiIsIGxpbnV4X3JjKTsKKyAgICB9CisgICAgaXNfY2hyZGV2X3JlZyA9IDE7CisKKyAgICBjZGV2X2luaXQoJmRldl9sb2dfY2hyZGV2X2NkZXYsICZkZXZfbG9nX2NocmRldl9mb3BzKTsKKyAgICBsaW51eF9yYyA9IGNkZXZfYWRkKCZkZXZfbG9nX2NocmRldl9jZGV2LCBkZXYsIDEpOworICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgImNkZXZfYWRkKCktPiVkXG4iLCBsaW51eF9yYyk7CisgICAgfQorICAgIGlzX2NkZXZfYWRkID0gMTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBkZXZfbG9nX2NocmRldl9leGl0KHZvaWQpCit7CisgICAgaWYgKGlzX2NkZXZfYWRkKQorICAgICAgICBjZGV2X2RlbCgmZGV2X2xvZ19jaHJkZXZfY2Rldik7CisgICAgaWYgKGlzX2NocmRldl9yZWcpCisgICAgICAgIHVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihkZXZfbG9nX2NocmRldl9tYWpvciwgMCksIDEpOworfQorCitzdGF0aWMgaW50IGRldl9sb2dfdGltZV90b19zdHJfY2IodWludDMyX3QgdGltZV9zdGFtcCwgY2hhciAqdGltZV9zdHIsIGludCB0aW1lX3N0cl9zaXplKQoreworICAgIHJldHVybiBzbnByaW50Zih0aW1lX3N0ciwgdGltZV9zdHJfc2l6ZSwgIiV1IiwgdGltZV9zdGFtcCAvIDEwMDApOyAvKiBDb252ZXJ0IGZyb20gdXNlYyB0byBtc2VjLiAqLworfQorCisvKiogSW5pdGlhbGl6ZSBkZXZfbG9nIGxpbnV4IGtlcm5lbCBzdXBwb3J0ICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pbml0KHZvaWQpCit7CisgICAgdm9pZCAqYWRkcmVzc2VzWzFdOworICAgIHVpbnQzMl90IHNpemVzWzFdID0geyBkZXZfbG9nX2J1ZmZlcl9zaXplX2tiICogMTAyNCB9OworICAgIHVpbnQzMl90IGZsYWdzWzFdID0geyBCQ01fREVWX0xPR19GSUxFX0ZMQUdfV1JBUF9BUk9VTkQgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICghZGV2X2xvZ19xdWV1ZV9zaXplIHx8ICFkZXZfbG9nX2J1ZmZlcl9zaXplX2tiKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgcmMgPSBkZXZfbG9nX2NocmRldl9pbml0KCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICAvKiBJbml0aWFsaXplIGxvZ2dlciAqLworICAgIGRldl9sb2dfYnVmZmVyID0gdm1hbGxvYyhkZXZfbG9nX2J1ZmZlcl9zaXplX2tiICogMTAyNCk7CisgICAgaWYgKCFkZXZfbG9nX2J1ZmZlcikKKyAgICB7CisgICAgICAgIGRldl9sb2dfY2hyZGV2X2V4aXQoKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBhbGxvY2F0ZSBkZXZfbG9nIGJ1ZmZlciAoJWQgYnl0ZXMpXG4iLCBkZXZfbG9nX2J1ZmZlcl9zaXplX2tiICogMTAyNCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBhZGRyZXNzZXNbMF0gPSBkZXZfbG9nX2J1ZmZlcjsKKyAgICByYyA9IGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXIoYWRkcmVzc2VzLCBzaXplcywgZmxhZ3MsIEJDTV9TSVpFT0ZBUlJBWShhZGRyZXNzZXMpLCAweDQwMDAsIFRBU0tfUFJJT1JJVFlfREVWX0xPRywgZGV2X2xvZ19xdWV1ZV9zaXplKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBkZXZfbG9nX2NocmRldl9leGl0KCk7CisgICAgICAgIHZmcmVlKGRldl9sb2dfYnVmZmVyKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIGxvZ2dlci4gRXJyb3IgJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBiY21fZGV2X2xvZ19zZXRfdGltZV90b19zdHJfY2IoZGV2X2xvZ190aW1lX3RvX3N0cl9jYik7CisKKyAgICBiY21vc19tdXRleF9jcmVhdGUoJmRldl9sb2dfbG9jaywgMCwgTlVMTCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIENsZWFuLXVwIGRldl9sb2cgbGludXgga2VybmVsIHN1cHBvcnQgKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbGludXhfZXhpdCh2b2lkKQoreworICAgIGRldl9sb2dfY2hyZGV2X2V4aXQoKTsKKyAgICBpZiAoZGV2X2xvZ19idWZmZXIpCisgICAgeworICAgICAgICB2ZnJlZShkZXZfbG9nX2J1ZmZlcik7CisgICAgfQorICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmRldl9sb2dfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtb2x0X2Rldl9sb2dfa2VybmVsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtb2x0X2Rldl9sb2dfa2VybmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllZTNjMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuaApAQCAtMCwwICsxLDQyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTU9MVF9ERVZfTE9HX0tFUk5FTF9IXworI2RlZmluZSBCQ01PTFRfREVWX0xPR19LRVJORUxfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiogSW5pdGlhbGl6ZSBkZXZfbG9nIGxpbnV4IGtlcm5lbCBzdXBwb3J0ICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pbml0KHZvaWQpOworCisvKiogQ2xlYW4tdXAgZGV2X2xvZyBsaW51eCBrZXJuZWwgc3VwcG9ydCAqLwordm9pZCBiY21fZGV2X2xvZ19saW51eF9leGl0KHZvaWQpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNGYyMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjIEN1cnJlbnQgZGV2aW9jZSBzZWxlY3RvcgorIworTU9EX05BTUUgPSBkZXZpY2Vfc2VsZWN0b3IKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGNvbW1vbl9hcGkgbW9kZWwgY2xpCitzcmNzID0gYmNtb2x0X2Rldl9zZWxlY3Rvci5jCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL2JjbW9sdF9kZXZfc2VsZWN0b3IuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvYmNtb2x0X2Rldl9zZWxlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDUzODMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL2JjbW9sdF9kZXZfc2VsZWN0b3IuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9sdF9kZXZfc2VsZWN0b3IuYworICogU2V0IC8gZ2V0IGN1cnJlbnQgZGV2aWNlIGZvciBhbGwgQ0xJIGNvbW1hbmRzCisgKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfZGV2X3NlbGVjdG9yLmg+CisKKy8qIEN1cnJlbnQgZGV2aWNlLiBFeHRlcm5hbCB2YXJpYWJsZSAqLworCisvKiBEZXZpY2UgY2hhbmdlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IGRldl9zZWxfc3Vic2NyaWJlciBkZXZfc2VsX3N1YnNjcmliZXI7CitzdHJ1Y3QgZGV2X3NlbF9zdWJzY3JpYmVyCit7CisgICAgRl9jdXJyZW50X2RldmljZV9jaGFuZ2VfaW5kIGNiOyAgICAgLyogU3Vic2NyaWJlcidzIGNhbGxiYWNrICovCisgICAgU1RBSUxRX0VOVFJZKGRldl9zZWxfc3Vic2NyaWJlcikgbmV4dDsKK307CisKK3N0YXRpYyBTVEFJTFFfSEVBRChkZXZfc2VsX3N1YnNjcmliZXJfbGlzdCwgZGV2X3NlbF9zdWJzY3JpYmVyKSBzdWJzY3JpYmVyX2xpc3Q7CisKKy8qIEdldC9zZXQgdGhlIGN1cnJlbnQgZGV2aWNlIENMSSBoYW5kbGVyCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfZGV2X3NlbF9kZXZpY2VfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIElmIGN1cnJlbnQgZGV2aWNlIHdhcyBzZXQgLSBub3RpZnkgYWxsIHN1YnNjcmliZXJzLgorICAgICAqIERvIG5vdCBjaGVjayBpZiBpdCBjaGFuZ2VkIGhlcmUuIFNvbWV0aW1lcyBpdCBpcyBnb29kIHRvIGJlIGFibGUKKyAgICAgKiB0byByZWZyZXNoLgorICAgICAqLworICAgIGlmIChucGFybXMpCisgICAgeworICAgICAgICBkZXZfc2VsX3N1YnNjcmliZXIgKnN1YnM7CisKKyAgICAgICAgY3VycmVudF9kZXZpY2UgPSBwYXJtWzBdLnZhbHVlLm51bWJlcjsKKworICAgICAgICAvKiBOb3RpZnkgYWxsIHN1YnNjcmliZXJzICovCisgICAgICAgIFNUQUlMUV9GT1JFQUNIKHN1YnMsICZzdWJzY3JpYmVyX2xpc3QsIG5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1YnMtPmNiKHNlc3Npb24sIGN1cnJlbnRfZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJDdXJyZW50IGRldmljZTogJWxkXG4iLCAobG9uZyljdXJyZW50X2RldmljZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKiBSZWdpc3RlciBmb3IgY3VycmVudCBkZXZpY2UgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKyAqIE11bHRpcGxlIGNsaWVudHMgY2FuIHJlZ2lzdGVyLgorICovCitiY21vc19lcnJubyBiY21vbHRfZGV2X3NlbF9pbmRfcmVnaXN0ZXIoRl9jdXJyZW50X2RldmljZV9jaGFuZ2VfaW5kIGNiKQoreworICAgIGRldl9zZWxfc3Vic2NyaWJlciAqc3VicyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoZGV2X3NlbF9zdWJzY3JpYmVyKSk7CisKKyAgICBpZiAoIXN1YnMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworCisgICAgc3Vicy0+Y2IgPSBjYjsKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnN1YnNjcmliZXJfbGlzdCwgc3VicywgbmV4dCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogSW5pdGlhbGl6ZSBkZXZpY2Ugc2VsZWN0b3IgbW9kdWxlICovCitiY21vc19lcnJubyBiY21vbHRfZGV2X3NlbF9pbml0KGJjbWNsaV9lbnRyeSAqcGFyZW50X2RpcikKK3sKKyAgICBTVEFJTFFfSU5JVCgmc3Vic2NyaWJlcl9saXN0KTsKKworICAgIC8qIEdldC9zZXQgY3VycmVudCBkZXZpY2UgKi8KKyAgICBCQ01DTElfTUFLRV9DTUQocGFyZW50X2RpciwgImRldmljZSIsICJHZXQvU2V0IHRoZSBjdXJyZW50IGRldmljZSIsIF9kZXZfc2VsX2RldmljZV9oYW5kbGVyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgMCwgQkNNVFJfTUFYX09MVFMtMSkpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9iY21vbHRfZGV2X3NlbGVjdG9yLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL2JjbW9sdF9kZXZfc2VsZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2RmYjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9iY21vbHRfZGV2X3NlbGVjdG9yLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9sdF9kZXZfc2VsZWN0b3IuaAorICogU2V0IC8gZ2V0IGN1cnJlbnQgZGV2aWNlIGZvciBhbGwgQ0xJIGNvbW1hbmRzCisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0RFVl9TRUxFQ1RPUl9IXworI2RlZmluZSBfQkNNT0xUX0RFVl9TRUxFQ1RPUl9IXworCisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKy8qIEN1cnJlbnQgZGV2aWNlIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZCAoKkZfY3VycmVudF9kZXZpY2VfY2hhbmdlX2luZCkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9kZXZpZCBkZXYpOworCisvKiBSZWdpc3RlciBmb3IgY3VycmVudCBkZXZpY2UgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKyAqIE11bHRpcGxlIGNsaWVudHMgY2FuIHJlZ2lzdGVyLgorICovCitiY21vc19lcnJubyBiY21vbHRfZGV2X3NlbF9pbmRfcmVnaXN0ZXIoRl9jdXJyZW50X2RldmljZV9jaGFuZ2VfaW5kIGNiKTsKKworLyogSW5pdGlhbGl6ZSBkZXZpY2Ugc2VsZWN0b3IgbW9kdWxlICovCitiY21vc19lcnJubyBiY21vbHRfZGV2X3NlbF9pbml0KGJjbWNsaV9lbnRyeSAqcGFyZW50X2Rpcik7CisKKworI2VuZGlmIC8qIF9CQ01PTFRfREVWX1NFTEVDVE9SX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2xpbmVub2lzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzExZjAzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2xpbmVub2lzZS9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACisjIGxpbmVub2lzZSAtIHNpbXBsZSBsaW5lIGVkaXRpbmcgbGlicmFyeQorIyBzaG91bGQgd29yayBvbiBhbnkgVlQtMTAwLWNvbXBhdGlibGUgdGVybWluYWwKK01PRF9OQU1FID0gbGluZW5vaXNlCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFRlMgPSAtRENPTkZJR19MSU5FTk9JU0UgLURDT05GSUdfRURJVExJTkUKKworc3JjcyA9IGxpbmVub2lzZS5jCisKKyMgVGhlIGZvbGxvd2luZyBkZWZpbmVzIHNob3VsZCBiZSBzZXQgZm9yIE9TIHRoYXQgZG9lc24ndCBoYXZlIHN1cHBvcnQgZm9yIHR0eSBhbmQvb3IgZmlsZSBJTworTElORU5PSVNFX0RJU0FCTEVfSU9DVEwgPz0gbgorTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUyA/PSBuCitMSU5FTk9JU0VfRElTQUJMRV9ISVNUX1NBVkUgPz0gbgorCitpZmVxICgiJChMSU5FTk9JU0VfRElTQUJMRV9JT0NUTCkiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRExJTkVOT0lTRV9ESVNBQkxFX0lPQ1RMCitlbmRpZgoraWZlcSAoIiQoTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUykiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRExJTkVOT0lTRV9ESVNBQkxFX1RFUk1JT1MKK2VuZGlmCitpZmVxICgiJChMSU5FTk9JU0VfRElTQUJMRV9ISVNUX1NBVkUpIiwgInkiKQorICAgIEVYVFJBX0RFRklORVMgKz0gLURMSU5FTk9JU0VfRElTQUJMRV9ISVNUX1NBVkUKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL2xpbmVub2lzZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2xpbmVub2lzZS9saW5lbm9pc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzEyYTFhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2xpbmVub2lzZS9saW5lbm9pc2UuYwpAQCAtMCwwICsxLDEzNTggQEAKKy8qIGxpbmVub2lzZS5jIC0tIGd1ZXJyaWxsYSBsaW5lIGVkaXRpbmcgbGlicmFyeSBhZ2FpbnN0IHRoZSBpZGVhIHRoYXQgYQorICogbGluZSBlZGl0aW5nIGxpYiBuZWVkcyB0byBiZSAyMCwwMDAgbGluZXMgb2YgQyBjb2RlLgorICoKKyAqIFlvdSBjYW4gZmluZCB0aGUgbGF0ZXN0IHNvdXJjZSBjb2RlIGF0OgorICoKKyAqICAgaHR0cDovL2dpdGh1Yi5jb20vYW50aXJlei9saW5lbm9pc2UKKyAqCisgKiBEb2VzIGEgbnVtYmVyIG9mIGNyYXp5IGFzc3VtcHRpb25zIHRoYXQgaGFwcGVuIHRvIGJlIHRydWUgaW4gOTkuOTk5OSUgb2YKKyAqIHRoZSAyMDEwIFVOSVggY29tcHV0ZXJzIGFyb3VuZC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMywgU2FsdmF0b3JlIFNhbmZpbGlwcG8gPGFudGlyZXogYXQgZ21haWwgZG90IGNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzLCBQaWV0ZXIgTm9vcmRodWlzIDxwY25vb3JkaHVpcyBhdCBnbWFpbCBkb3QgY29tPgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICogIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAqICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAtIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC94dGVybS9jdGxzZXFzL2N0bHNlcXMuaHRtbAorICogLSBodHRwOi8vd3d3LjN3YXlsYWJzLmNvbS9udy9XV1cvcHJvZHVjdHMvd2l6Y29uL3Z0MjIwLmh0bWwKKyAqCisgKiBUb2RvIGxpc3Q6CisgKiAtIEZpbHRlciBib2d1cyBDdHJsKzxjaGFyPiBjb21iaW5hdGlvbnMuCisgKiAtIFdpbjMyIHN1cHBvcnQKKyAqCisgKiBCbG9hdDoKKyAqIC0gSGlzdG9yeSBzZWFyY2ggbGlrZSBDdHJsK3IgaW4gcmVhZGxpbmU/CisgKgorICogTGlzdCBvZiBlc2NhcGUgc2VxdWVuY2VzIHVzZWQgYnkgdGhpcyBwcm9ncmFtLCB3ZSBkbyBldmVyeXRoaW5nIGp1c3QKKyAqIHdpdGggdGhyZWUgc2VxdWVuY2VzLiBJbiBvcmRlciB0byBiZSBzbyBjaGVhcCB3ZSBtYXkgaGF2ZSBzb21lCisgKiBmbGlja2VyaW5nIGVmZmVjdCB3aXRoIHNvbWUgc2xvdyB0ZXJtaW5hbCwgYnV0IHRoZSBsZXNzZXIgc2VxdWVuY2VzCisgKiB0aGUgbW9yZSBjb21wYXRpYmxlLgorICoKKyAqIENIQSAoQ3Vyc29yIEhvcml6b250YWwgQWJzb2x1dGUpCisgKiAgICBTZXF1ZW5jZTogRVNDIFsgbiBHCisgKiAgICBFZmZlY3Q6IG1vdmVzIGN1cnNvciB0byBjb2x1bW4gbgorICoKKyAqIEVMIChFcmFzZSBMaW5lKQorICogICAgU2VxdWVuY2U6IEVTQyBbIG4gSworICogICAgRWZmZWN0OiBpZiBuIGlzIDAgb3IgbWlzc2luZywgY2xlYXIgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUKKyAqICAgIEVmZmVjdDogaWYgbiBpcyAxLCBjbGVhciBmcm9tIGJlZ2lubmluZyBvZiBsaW5lIHRvIGN1cnNvcgorICogICAgRWZmZWN0OiBpZiBuIGlzIDIsIGNsZWFyIGVudGlyZSBsaW5lCisgKgorICogQ1VGIChDVXJzb3IgRm9yd2FyZCkKKyAqICAgIFNlcXVlbmNlOiBFU0MgWyBuIEMKKyAqICAgIEVmZmVjdDogbW92ZXMgY3Vyc29yIGZvcndhcmQgb2YgbiBjaGFycworICoKKyAqIFdoZW4gbXVsdGkgbGluZSBtb2RlIGlzIGVuYWJsZWQsIHdlIGFsc28gdXNlIGFuIGFkZGl0aW9uYWwgZXNjYXBlCisgKiBzZXF1ZW5jZS4gSG93ZXZlciBtdWx0aSBsaW5lIGVkaXRpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAqCisgKiBDVVUgKEN1cnNvciBVcCkKKyAqICAgIFNlcXVlbmNlOiBFU0MgWyBuIEEKKyAqICAgIEVmZmVjdDogbW92ZXMgY3Vyc29yIHVwIG9mIG4gY2hhcnMuCisgKgorICogQ1VEIChDdXJzb3IgRG93bikKKyAqICAgIFNlcXVlbmNlOiBFU0MgWyBuIEIKKyAqICAgIEVmZmVjdDogbW92ZXMgY3Vyc29yIGRvd24gb2YgbiBjaGFycy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGNsZWFyIHRoZSBzY3JlZW46IEVTQyBbIEggRVNDIFsgMiBKCisgKiBUaGlzIGlzIGFjdHVhbGx5IGNvbXBvc2VkIG9mIHR3byBzZXF1ZW5jZXM6CisgKgorICogY3Vyc29yaG9tZQorICogICAgU2VxdWVuY2U6IEVTQyBbIEgKKyAqICAgIEVmZmVjdDogbW92ZXMgdGhlIGN1cnNvciB0byB1cHBlciBsZWZ0IGNvcm5lcgorICoKKyAqIEVEMiAoQ2xlYXIgZW50aXJlIHNjcmVlbikKKyAqICAgIFNlcXVlbmNlOiBFU0MgWyAyIEoKKyAqICAgIEVmZmVjdDogY2xlYXIgdGhlIHdob2xlIHNjcmVlbgorICoKKyAqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2lmbmRlZiBMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2VuZGlmCisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX0lPQ1RMCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKyNpbmNsdWRlICJsaW5lbm9pc2UuaCIKKworI2lmbmRlZiBTVERJTl9GSUxFTk8KKyNkZWZpbmUgU1RESU5fRklMRU5PICAwCisjZW5kaWYKKworI2lmbmRlZiBTVERPVVRfRklMRU5PCisjZGVmaW5lIFNURE9VVF9GSUxFTk8gMQorI2VuZGlmCisKKyNkZWZpbmUgTElORU5PSVNFX0RFRkFVTFRfSElTVE9SWV9NQVhfTEVOIDEwMAorI2RlZmluZSBMSU5FTk9JU0VfTUFYX0xJTkUgNDA5NgorCisvKiBUaGUgbGluZW5vaXNlU3RhdGUgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHN0YXRlIGR1cmluZyBsaW5lIGVkaXRpbmcuCisgKiBXZSBwYXNzIHRoaXMgc3RhdGUgdG8gZnVuY3Rpb25zIGltcGxlbWVudGluZyBzcGVjaWZpYyBlZGl0aW5nCisgKiBmdW5jdGlvbmFsaXRpZXMuICovCitzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgeworICAgIGxvbmcgaWZkOyAgICAgICAgICAgLyogVGVybWluYWwgc3RkaW4gZmlsZSBkZXNjcmlwdG9yLiAqLworICAgIGNoYXIgKmJ1ZjsgICAgICAgICAgLyogRWRpdGVkIGxpbmUgYnVmZmVyLiAqLworICAgIGludCBidWZsZW47ICAgICAgICAgLyogRWRpdGVkIGxpbmUgYnVmZmVyIHNpemUuICovCisgICAgY29uc3QgY2hhciAqcHJvbXB0OyAvKiBQcm9tcHQgdG8gZGlzcGxheS4gKi8KKyAgICBpbnQgcGxlbjsgICAgICAgICAgIC8qIFByb21wdCBsZW5ndGguICovCisgICAgaW50IHBvczsgICAgICAgICAgICAvKiBDdXJyZW50IGN1cnNvciBwb3NpdGlvbi4gKi8KKyAgICBpbnQgb2xkcG9zOyAgICAgICAgIC8qIFByZXZpb3VzIHJlZnJlc2ggY3Vyc29yIHBvc2l0aW9uLiAqLworICAgIGludCBsZW47ICAgICAgICAgICAgLyogQ3VycmVudCBlZGl0ZWQgbGluZSBsZW5ndGguICovCisgICAgaW50IGNvbHM7ICAgICAgICAgICAvKiBOdW1iZXIgb2YgY29sdW1ucyBpbiB0ZXJtaW5hbC4gKi8KKyAgICBpbnQgbWF4cm93czsgICAgICAgIC8qIE1heGltdW0gbnVtIG9mIHJvd3MgdXNlZCBzbyBmYXIgKG11bHRpbGluZSBtb2RlKSAqLworICAgIGludCBoaXN0b3J5X2luZGV4OyAgLyogVGhlIGhpc3RvcnkgaW5kZXggd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nLiAqLworfTsKKworLyogU2Vzc2lvbiAqLworc3RydWN0IGxpbmVub2lzZVNlc3Npb24geworICAgIHN0cnVjdCBsaW5lbm9pc2VTZXNzaW9uICpuZXh0OworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSBzdGF0ZTsKKyAgICBsaW5lbm9pc2VTZXNzaW9uSU8gaW87CisgICAgbGluZW5vaXNlQ29tcGxldGlvbkNhbGxiYWNrICpjb21wbGV0aW9uQ2FsbGJhY2s7CisgICAgY2hhciAqcmVhZF9haGVhZF9idWY7CisgICAgaW50IHJlYWRfYWhlYWRfcG9zOworICAgIGludCBoaXN0b3J5X21heF9sZW47CisgICAgaW50IGhpc3RvcnlfbGVuOworICAgIGNoYXIgKipoaXN0b3J5OworICAgIGludCBtbG1vZGU7ICAgICAgICAgLyogTXVsdGkgbGluZSBtb2RlLiBEZWZhdWx0IGlzIHNpbmdsZSBsaW5lLiAqLworICAgIGludCByYXdtb2RlOyAgICAgICAgLyogRm9yIGF0ZXhpdCgpIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHJlc3RvcmUgaXMgbmVlZGVkKi8KKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIHN0cnVjdCB0ZXJtaW9zIG9yaWdfdGVybWlvczsgLyogSW4gb3JkZXIgdG8gcmVzdG9yZSBhdCBleGl0LiovCisjZW5kaWYKKyAgICBpbnQgZHVtYl90ZXJtaW5hbDsKKyAgICBpbnQgZm9yY2VkX2R1bWI7CisgICAgaW50IG5jb2xyZXFzOyAgICAgICAgLyogT3V0c3RhbmRpZ2UgZ2V0IGNvbHVtbnMgcmVxdWVzdHMgKi8KKyAgICB2b2lkICpzZXNzaW9uX2RhdGE7Cit9OworCitlbnVtIEtFWV9BQ1RJT057CisgICAgS0VZX05VTEwgPSAwLAkvKiBOVUxMICovCisgICAgQ1RSTF9BID0gMSwgICAgICAgICAvKiBDdHJsK2EgKi8KKyAgICBDVFJMX0IgPSAyLCAgICAgICAgIC8qIEN0cmwtYiAqLworICAgIENUUkxfQyA9IDMsICAgICAgICAgLyogQ3RybC1jICovCisgICAgQ1RSTF9EID0gNCwgICAgICAgICAvKiBDdHJsLWQgKi8KKyAgICBDVFJMX0UgPSA1LCAgICAgICAgIC8qIEN0cmwtZSAqLworICAgIENUUkxfRiA9IDYsICAgICAgICAgLyogQ3RybC1mICovCisgICAgQ1RSTF9IID0gOCwgICAgICAgICAvKiBDdHJsLWggKi8KKyAgICBLRVlfVEFCID0gOSwgICAgICAgIC8qIFRhYiAqLworICAgIENUUkxfSyA9IDExLCAgICAgICAgLyogQ3RybCtrICovCisgICAgQ1RSTF9MID0gMTIsICAgICAgICAvKiBDdHJsK2wgKi8KKyAgICBLRVlfTEYgPSAxMCwgICAgICAgIC8qIEVudGVyOiBcbiAqLworICAgIEtFWV9DUiA9IDEzLCAgICAgICAgLyogRW50ZXI6IFxyICovCisgICAgQ1RSTF9OID0gMTQsICAgICAgICAvKiBDdHJsLW4gKi8KKyAgICBDVFJMX1AgPSAxNiwgICAgICAgIC8qIEN0cmwtcCAqLworICAgIENUUkxfVCA9IDIwLCAgICAgICAgLyogQ3RybC10ICovCisgICAgQ1RSTF9VID0gMjEsICAgICAgICAvKiBDdHJsK3UgKi8KKyAgICBDVFJMX1cgPSAyMywgICAgICAgIC8qIEN0cmwrdyAqLworICAgIEVTQyA9IDI3LCAgICAgICAgICAgLyogRXNjYXBlICovCisgICAgQkFDS1NQQUNFID0gIDEyNyAgICAvKiBCYWNrc3BhY2UgKi8KK307CisKK3N0YXRpYyB2b2lkIHJlZnJlc2hMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pOworc3RhdGljIHZvaWQgZnJlZUhpc3RvcnkobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7CitzdGF0aWMgaW50IGxpbmVub2lzZVJhdyhsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIGNvbnN0IGNoYXIgKnByb21wdCk7CisKKy8qIERlYnVnZ2luZyBtYWNyby4gKi8KKy8qICNkZWZpbmUgTElORU5PSVNFX0RFQlVHX01PREUgKi8KKworI2lmZGVmIExJTkVOT0lTRV9ERUJVR19NT0RFCisjZGVmaW5lIGxuZGVidWcoZm10LCBhcmdzLi4uKSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczolZCAiIGZtdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyNhcmdzKTtcCisgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgbG5kZWJ1ZyhmbXQsIC4uLikKKyNlbmRpZgorCisKKy8qIFNlc3Npb24gbGlzdC4gVG9EbzogcHJvdGVjdCB1cGRhdGUgKi8KK3N0YXRpYyBsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uczsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT0gTG93IGxldmVsIHRlcm1pbmFsIGhhbmRsaW5nID09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogU2V0IGlmIHRvIHVzZSBvciBub3QgdGhlIG11bHRpIGxpbmUgbW9kZS4gKi8KK3ZvaWQgbGluZW5vaXNlU2V0TXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBtbCkgeworICAgIHNlc3Npb24tPm1sbW9kZSA9IG1sOworfQorCitpbnQgbGluZW5vaXNlR2V0TXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICByZXR1cm4gc2Vzc2lvbi0+bWxtb2RlOworfQorCitpbnQgbGluZW5vaXNlR2V0RHVtYlRlcm1pbmFsKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICByZXR1cm4gc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbDsKK30KKworLyogUmF3IG1vZGU6IDE5NjAgbWFnaWMgc2hpdC4gKi8KK3N0YXRpYyBpbnQgZW5hYmxlUmF3TW9kZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX1RFUk1JT1MKKyAgICBzdHJ1Y3QgdGVybWlvcyByYXc7CisKKyAgICBpZiAodGNnZXRhdHRyKHNlc3Npb24tPnN0YXRlLmlmZCwgJnNlc3Npb24tPm9yaWdfdGVybWlvcykgPT0gLTEpIGdvdG8gZmF0YWw7CisKKyAgICByYXcgPSBzZXNzaW9uLT5vcmlnX3Rlcm1pb3M7ICAvKiBtb2RpZnkgdGhlIG9yaWdpbmFsIG1vZGUgKi8KKyAgICAvKiBpbnB1dCBtb2Rlczogbm8gYnJlYWssIG5vIENSIHRvIE5MLCBubyBwYXJpdHkgY2hlY2ssIG5vIHN0cmlwIGNoYXIsCisgICAgICogbm8gc3RhcnQvc3RvcCBvdXRwdXQgY29udHJvbC4gKi8KKyAgICByYXcuY19pZmxhZyAmPSB+KEJSS0lOVCB8IElHTkJSSyB8IElDUk5MIHwgSU5QQ0sgfCBJU1RSSVAgfCBJWE9OIHwgSVhPRkYpOworCisgICAgLyogb3V0cHV0IG1vZGVzIC0gZGlzYWJsZSBwb3N0IHByb2Nlc3NpbmcgKi8KKyAgICAvKiByYXcuY19vZmxhZyAmPSB+KE9QT1NUKTsgKi8KKworICAgIC8qIGNvbnRyb2wgbW9kZXMgLSBzZXQgOCBiaXQgY2hhcnMgKi8KKyAgICByYXcuY19jZmxhZyB8PSAoQ1M4IC8qIHwgSVNJRyAqLyk7CisKKyAgICAvKiBsb2NhbCBtb2RlcyAtIGVjaG9pbmcgb2ZmLCBjYW5vbmljYWwgb2ZmLCBubyBleHRlbmRlZCBmdW5jdGlvbnMsCisgICAgICogbm8gc2lnbmFsIGNoYXJzICheWixeQykgKi8KKyAgICByYXcuY19sZmxhZyAmPSB+KEVDSE8gfCBJQ0FOT04gfCBJRVhURU4pOworICAgIC8qIGNvbnRyb2wgY2hhcnMgLSBzZXQgcmV0dXJuIGNvbmRpdGlvbjogbWluIG51bWJlciBvZiBieXRlcyBhbmQgdGltZXIuCisgICAgICogV2Ugd2FudCByZWFkIHRvIHJldHVybiBldmVyeSBzaW5nbGUgYnl0ZSwgd2l0aG91dCB0aW1lb3V0LiAqLworICAgIHJhdy5jX2NjW1ZNSU5dID0gMTsgcmF3LmNfY2NbVlRJTUVdID0gMDsgLyogMSBieXRlLCBubyB0aW1lciAqLworCisgICAgLyogcHV0IHRlcm1pbmFsIGluIHJhdyBtb2RlIGFmdGVyIGZsdXNoaW5nICovCisgICAgaWYgKHRjc2V0YXR0cihzZXNzaW9uLT5zdGF0ZS5pZmQsIFRDU0FGTFVTSCwgJnJhdykgPCAwKSBnb3RvIGZhdGFsOworICAgIHNlc3Npb24tPnJhd21vZGUgPSAxOworICAgIHJldHVybiAwOworCitmYXRhbDoKKyAgICBlcnJubyA9IEVOT1RUWTsKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIHNlc3Npb24tPnJhd21vZGUgPSAxOworICAgIHJldHVybiAwOyAvKiBhc3N1bWUgcmF3IG1vZGUgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlUmF3TW9kZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgLyogRG9uJ3QgZXZlbiBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGFzIGl0J3MgdG9vIGxhdGUuICovCisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX1RFUk1JT1MKKyAgICBpZiAoc2Vzc2lvbi0+cmF3bW9kZSAmJiB0Y3NldGF0dHIoc2Vzc2lvbi0+c3RhdGUuaWZkLFRDU0FGTFVTSCwmc2Vzc2lvbi0+b3JpZ190ZXJtaW9zKSAhPSAtMSkKKyAgICAgICAgc2Vzc2lvbi0+cmF3bW9kZSA9IDA7CisjZW5kaWYKK30KKworCisvKiB3cml0ZSBFU0Mgc2VxdWVuY2UgKi8KK3N0YXRpYyBpbnQgd3JpdGVFc2NTZXF1ZW5jZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpzZXEsIGludCBzZXFfbGVuKQoreworICAgIGludCBuOworICAgIGlmICghc2VxX2xlbikKKyAgICAgICAgc2VxX2xlbiA9IHN0cmxlbihzZXEpOworICAgIG4gPSBzZXNzaW9uLT5pby53cml0ZShzZXNzaW9uLT5pby5mZF9vdXQsIHNlcSwgc2VxX2xlbik7CisgICAgcmV0dXJuIG47Cit9CisKKworLyogVHJ5IHRvIGdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGN1cnJlbnQgdGVybWluYWwsIG9yIGFzc3VtZSA4MAorICogaWYgaXQgZmFpbHMuICovCitzdGF0aWMgaW50IGdldENvbHVtbnNSZXF1ZXN0KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX0lPQ1RMCisgICAgc3RydWN0IHdpbnNpemUgd3M7CisgICAgaWYgKGlvY3RsKDEsIFRJT0NHV0lOU1osICZ3cykgPT0gMCAmJiB3cy53c19jb2wgIT0gMCkKKyAgICB7CisgICAgICAgIGwtPmNvbHMgPSB3cy53c19jb2w7CisgICAgfQorI2VuZGlmCisgICAgeworICAgICAgICAvKiA0IHNlcXVlbmNlczogc3RvcmUgcG9zaXRpb24sIGdvIHRvIHJpZ2h0IG1hcmdpbiwgcmVxdWVzdCBwb3NpdGlvbiwgcmVzdG9yZSBwb3NpdGlvbi4gKi8KKyAgICAgICAgaWYgKHdyaXRlRXNjU2VxdWVuY2Uoc2Vzc2lvbiwgIlx4MWIiICI3IiAiXHgxYiIgIls5OTlDIiAiXHgxYiIgIls2biIgIlx4MWIiICI4IiwgMTQpICE9IDE0KQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICsrc2Vzc2lvbi0+bmNvbHJlcXM7CisgICAgfQorICAgIHJldHVybiBsLT5jb2xzOworCitmYWlsZWQ6CisgICAgbG5kZWJ1ZygiZ2V0Q29sdW1uc1JlcXVlc3QgZmFpbGVkOiBjb2xzPTgwXG4iKTsKKyAgICByZXR1cm4gODA7Cit9CisKKy8qIENsZWFyIHRoZSBzY3JlZW4uIFVzZWQgdG8gaGFuZGxlIGN0cmwrbCAqLwordm9pZCBsaW5lbm9pc2VDbGVhclNjcmVlbihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisjaWZuZGVmIExJTkVOT0lTRV9ERUJVR19NT0RFCisgICAgaWYgKHdyaXRlRXNjU2VxdWVuY2Uoc2Vzc2lvbiwgIlx4MWJbSFx4MWJbMkoiLCA3KSA8PSAwKSB7CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8sIGp1c3QgdG8gYXZvaWQgd2FybmluZy4gKi8KKyAgICB9CisjZW5kaWYKK30KKworLyogQmVlcCwgdXNlZCBmb3IgY29tcGxldGlvbiB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGxldGUgb3Igd2hlbiBhbGwKKyAqIHRoZSBjaG9pY2VzIHdlcmUgYWxyZWFkeSBzaG93bi4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUJlZXAodm9pZCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiXHg3Iik7CisgICAgZmZsdXNoKHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgbGluZW5vaXNlRGVmYXVsdFJlYWRDaGFyKGxvbmcgZmRfaW4sIGNoYXIgKmMpCit7CisJaW50IG47CisgICAgZG8geworICAgICAgICBuID0gcmVhZChmZF9pbiwgYywgMSk7CisgICAgfSB3aGlsZSghbiB8fCAobj09MSAmJiAhICpjKSk7CisgICAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgbGluZW5vaXNlRGVmYXVsdFdyaXRlKGxvbmcgZmRfb3V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgcmV0dXJuIHdyaXRlKGZkX291dCwgYnVmLCBsZW4pOworfQorCitpbnQgbGluZW5vaXNlU2Vzc2lvbk9wZW4oY29uc3QgbGluZW5vaXNlU2Vzc2lvbklPICppbywgdm9pZCAqc2Vzc2lvbl9kYXRhLCBsaW5lbm9pc2VTZXNzaW9uICoqc2Vzc2lvbikKK3sKKyAgICBsaW5lbm9pc2VTZXNzaW9uICpzOworICAgIGlmICghaW8gfHwgIXNlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzID0gYmNtb3NfY2FsbG9jKHNpemVvZigqcykpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMtPmhpc3RvcnlfbWF4X2xlbiA9IExJTkVOT0lTRV9ERUZBVUxUX0hJU1RPUllfTUFYX0xFTjsKKyAgICBzLT5pbyA9ICppbzsKKyAgICBzLT5kdW1iX3Rlcm1pbmFsID0gaW8tPmR1bWJfdGVybWluYWw7CisgICAgcy0+c2Vzc2lvbl9kYXRhID0gc2Vzc2lvbl9kYXRhOworICAgICpzZXNzaW9uID0gczsKKyAgICBzLT5uZXh0ID0gc2Vzc2lvbnM7CisgICAgc2Vzc2lvbnMgPSBzOworCisgICAgaWYgKCFzLT5pby5yZWFkX2NoYXIpCisgICAgeworICAgICAgICBzLT5pby5yZWFkX2NoYXIgPSBsaW5lbm9pc2VEZWZhdWx0UmVhZENoYXI7CisgICAgICAgIGlmICghcy0+aW8uZmRfaW4pCisgICAgICAgICAgICBzLT5pby5mZF9pbiA9IFNURElOX0ZJTEVOTzsKKyAgICB9CisgICAgaWYgKCFzLT5pby53cml0ZSkKKyAgICB7CisgICAgICAgIHMtPmlvLndyaXRlID0gbGluZW5vaXNlRGVmYXVsdFdyaXRlOworICAgICAgICBpZiAoIXMtPmlvLmZkX291dCkKKyAgICAgICAgICAgIHMtPmlvLmZkX291dCA9IFNURE9VVF9GSUxFTk87CisgICAgfQorCisgICAgLyogSVQ6IHRlbXAgKi8KKyAgICBzLT5tbG1vZGUgPSAxOworICAgIHMtPnN0YXRlLmlmZCA9IFNURElOX0ZJTEVOTzsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgbGluZW5vaXNlU2Vzc2lvbkNsb3NlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pCit7CisgICAgbGluZW5vaXNlU2Vzc2lvbiAqcyA9IHNlc3Npb25zLCAqcHJldj1OVUxMOworICAgIHdoaWxlIChzICYmIHMgIT0gc2Vzc2lvbikKKyAgICB7CisgICAgICAgIHByZXYgPSBzOworICAgICAgICBzID0gcy0+bmV4dDsKKyAgICB9CisgICAgaWYgKHMpCisgICAgeworICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgIHByZXYtPm5leHQgPSBzLT5uZXh0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXNzaW9ucyA9IHMtPm5leHQ7CisgICAgICAgIGRpc2FibGVSYXdNb2RlKHMpOworICAgICAgICBmcmVlSGlzdG9yeShzKTsKKyAgICAgICAgaWYgKHMtPnJlYWRfYWhlYWRfYnVmKQorICAgICAgICAgICAgYmNtb3NfZnJlZShzLT5yZWFkX2FoZWFkX2J1Zik7CisgICAgICAgIGJjbW9zX2ZyZWUocyk7CisgICAgfQorfQorCit2b2lkICpsaW5lbm9pc2VTZXNzaW9uRGF0YShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgcmV0dXJuIHNlc3Npb24tPnNlc3Npb25fZGF0YTsKK30KKworCit2b2lkIGxpbmVub2lzZVNldER1bWJUZXJtaW5hbChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBpbnQgZHVtYikgeworICAgIGlmICghc2Vzc2lvbi0+aW8uZHVtYl90ZXJtaW5hbCkKKyAgICB7CisgICAgICAgIHNlc3Npb24tPmR1bWJfdGVybWluYWwgPSBkdW1iOworICAgICAgICBzZXNzaW9uLT5mb3JjZWRfZHVtYiA9IGR1bWI7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29tcGxldGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBUaGlzIGlzIGFuIGhlbHBlciBmdW5jdGlvbiBmb3IgbGluZW5vaXNlRWRpdCgpIGFuZCBpcyBjYWxsZWQgd2hlbiB0aGUKKyAqIHVzZXIgdHlwZXMgdGhlIDx0YWI+IGtleSBpbiBvcmRlciB0byBjb21wbGV0ZSB0aGUgc3RyaW5nIGN1cnJlbnRseSBpbiB0aGUKKyAqIGlucHV0LiBJdCBjYW4gY2FsbCBsaW5lbm9pc2VTZXRCdWZmZXIgaW4gb3JkZXIgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBlZGl0IGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBjb21wbGV0ZUxpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbHMgPSAmc2Vzc2lvbi0+c3RhdGU7CisKKyAgICBpZiAoIXNlc3Npb24tPmNvbXBsZXRpb25DYWxsYmFjayhzZXNzaW9uLCBscy0+YnVmLCBscy0+cG9zKSkKKyAgICB7CisgICAgICAgIGxpbmVub2lzZUJlZXAoKTsKKyAgICB9CisgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7Cit9CisKKy8qIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciB0YWItY29tcGxldGlvbi4gKi8KK3ZvaWQgbGluZW5vaXNlU2V0Q29tcGxldGlvbkNhbGxiYWNrKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGxpbmVub2lzZUNvbXBsZXRpb25DYWxsYmFjayAqZm4pIHsKKyAgICBzZXNzaW9uLT5jb21wbGV0aW9uQ2FsbGJhY2sgPSBmbjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyCisgKiBpbiBvcmRlciB0byBhZGQgY29tcGxldGlvbiBvcHRpb25zIGdpdmVuIHRoZSBpbnB1dCBzdHJpbmcgd2hlbiB0aGUKKyAqIHVzZXIgdHlwZWQgPHRhYj4uIFNlZSB0aGUgZXhhbXBsZS5jIHNvdXJjZSBjb2RlIGZvciBhIHZlcnkgZWFzeSB0bworICogdW5kZXJzdGFuZCBleGFtcGxlLiAqLwordm9pZCBsaW5lbm9pc2VTZXRCdWZmZXIobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCBpbnQgcG9zKQoreworICAgIGlmICghc2Vzc2lvbi0+c3RhdGUuYnVmKQorICAgICAgICByZXR1cm47CisgICAgc3RybmNweShzZXNzaW9uLT5zdGF0ZS5idWYsIGJ1Ziwgc2Vzc2lvbi0+c3RhdGUuYnVmbGVuIC0gMSk7CisgICAgc2Vzc2lvbi0+c3RhdGUuYnVmW3Nlc3Npb24tPnN0YXRlLmJ1ZmxlbiAtIDFdID0gMDsKKyAgICBzZXNzaW9uLT5zdGF0ZS5sZW4gPSBzdHJsZW4oc2Vzc2lvbi0+c3RhdGUuYnVmKTsKKyAgICBzZXNzaW9uLT5zdGF0ZS5wb3MgPSAocG9zID49IDAgJiYgcG9zIDwgc2Vzc2lvbi0+c3RhdGUubGVuKSA/IHBvcyA6IHNlc3Npb24tPnN0YXRlLmxlbjsKKyAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09IExpbmUgZWRpdGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogV2UgZGVmaW5lIGEgdmVyeSBzaW1wbGUgImFwcGVuZCBidWZmZXIiIHN0cnVjdHVyZSwgdGhhdCBpcyBhbiBoZWFwCisgKiBhbGxvY2F0ZWQgc3RyaW5nIHdoZXJlIHdlIGNhbiBhcHBlbmQgdG8uIFRoaXMgaXMgdXNlZnVsIGluIG9yZGVyIHRvCisgKiB3cml0ZSBhbGwgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgaW4gYSBidWZmZXIgYW5kIGZsdXNoIHRoZW0gdG8gdGhlIHN0YW5kYXJkCisgKiBvdXRwdXQgaW4gYSBzaW5nbGUgY2FsbCwgdG8gYXZvaWQgZmxpY2tlcmluZyBlZmZlY3RzLiAqLworc3RydWN0IGFidWYgeworICAgIGNoYXIgKmI7CisgICAgaW50IGxlbjsKK307CisKK3N0YXRpYyB2b2lkIGFiSW5pdChzdHJ1Y3QgYWJ1ZiAqYWIpIHsKKyAgICBhYi0+YiA9IE5VTEw7CisgICAgYWItPmxlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGFiQXBwZW5kKHN0cnVjdCBhYnVmICphYiwgY29uc3QgY2hhciAqcywgaW50IGxlbikgeworICAgIGNoYXIgKm5ldyA9IGJjbW9zX2FsbG9jKGFiLT5sZW4rbGVuKTsKKyAgICBpZiAobmV3ID09IE5VTEwpIHJldHVybjsKKyAgICBtZW1jcHkobmV3LGFiLT5iLGFiLT5sZW4pOworICAgIG1lbWNweShuZXcrYWItPmxlbixzLGxlbik7CisgICAgYmNtb3NfZnJlZShhYi0+Yik7CisgICAgYWItPmIgPSBuZXc7CisgICAgYWItPmxlbiArPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGFiRnJlZShzdHJ1Y3QgYWJ1ZiAqYWIpIHsKKyAgICBiY21vc19mcmVlKGFiLT5iKTsKK30KKworLyogU2luZ2xlIGxpbmUgbG93IGxldmVsIGN1cnNvciByZWZyZXNoLgorICovCitzdGF0aWMgdm9pZCByZWZyZXNoQ3Vyc29yU2luZ2xlTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzY0XTsKKyAgICBzaXplX3QgcGxlbiA9IHN0cmxlbihsLT5wcm9tcHQpOworICAgIGNoYXIgKmJ1ZiA9IGwtPmJ1ZjsKKyAgICBzaXplX3QgbGVuID0gbC0+bGVuOworICAgIHNpemVfdCBwb3MgPSBsLT5wb3M7CisgICAgc3RydWN0IGFidWYgYWI7CisKKyAgICB3aGlsZSgocGxlbitwb3MpID49IGwtPmNvbHMpIHsKKyAgICAgICAgYnVmKys7CisgICAgICAgIGxlbi0tOworICAgICAgICBwb3MtLTsKKyAgICB9CisgICAgd2hpbGUgKHBsZW4rbGVuID4gbC0+Y29scykgeworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBhYkluaXQoJmFiKTsKKyAgICAvKiBDdXJzb3IgdG8gbGVmdCBlZGdlICovCisgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OUQiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICBpZiAocG9zK3BsZW4pCisgICAgeworICAgICAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbJWRDIiwgKGludCkocG9zK3BsZW4pKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorICAgIGlmICh3cml0ZUVzY1NlcXVlbmNlKHNlc3Npb24sIGFiLmIsIGFiLmxlbikgPT0gLTEpIHt9IC8qIENhbid0IHJlY292ZXIgZnJvbSB3cml0ZSBlcnJvci4gKi8KKyAgICBhYkZyZWUoJmFiKTsKK30KKworLyogU2luZ2xlIGxpbmUgbG93IGxldmVsIGxpbmUgcmVmcmVzaC4KKyAqCisgKiBSZXdyaXRlIHRoZSBjdXJyZW50bHkgZWRpdGVkIGxpbmUgYWNjb3JkaW5nbHkgdG8gdGhlIGJ1ZmZlciBjb250ZW50LAorICogY3Vyc29yIHBvc2l0aW9uLCBhbmQgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIHRlcm1pbmFsLiAqLworc3RhdGljIHZvaWQgcmVmcmVzaFNpbmdsZUxpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBjaGFyIHNlcVs2NF07CisgICAgc2l6ZV90IHBsZW4gPSBzdHJsZW4obC0+cHJvbXB0KTsKKyAgICBjaGFyICpidWYgPSBsLT5idWY7CisgICAgc2l6ZV90IGxlbiA9IGwtPmxlbjsKKyAgICBzaXplX3QgcG9zID0gbC0+cG9zOworICAgIHN0cnVjdCBhYnVmIGFiOworCisgICAgd2hpbGUoKHBsZW4rcG9zKSA+PSBsLT5jb2xzKSB7CisgICAgICAgIGJ1ZisrOworICAgICAgICBsZW4tLTsKKyAgICAgICAgcG9zLS07CisgICAgfQorICAgIHdoaWxlIChwbGVuK2xlbiA+IGwtPmNvbHMpIHsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgYWJJbml0KCZhYik7CisgICAgLyogQ3Vyc29yIHRvIGxlZnQgZWRnZSAqLworICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYls5OTlEIik7CisgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgLyogV3JpdGUgdGhlIHByb21wdCBhbmQgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnQgKi8KKyAgICBhYkFwcGVuZCgmYWIsbC0+cHJvbXB0LHN0cmxlbihsLT5wcm9tcHQpKTsKKyAgICBhYkFwcGVuZCgmYWIsYnVmLGxlbik7CisgICAgLyogRXJhc2UgdG8gcmlnaHQgKi8KKyAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbMEsiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICAvKiBNb3ZlIGN1cnNvciB0byBvcmlnaW5hbCBwb3NpdGlvbi4gKi8KKyAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbOTk5RCIpOworICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIGlmIChwb3MrcGxlbikKKyAgICB7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEMiLCAoaW50KShwb3MrcGxlbikpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisgICAgaWYgKHdyaXRlRXNjU2VxdWVuY2Uoc2Vzc2lvbiwgYWIuYiwgYWIubGVuKSA9PSAtMSkge30gLyogQ2FuJ3QgcmVjb3ZlciBmcm9tIHdyaXRlIGVycm9yLiAqLworICAgIGFiRnJlZSgmYWIpOworfQorCisvKiBNdWx0aSBsaW5lIGxvdyBsZXZlbCBjdXJzb3IgcG9zaXRpb24gcmVmcmVzaC4KKyAqCisgKiBSZXdyaXRlIHRoZSBjdXJyZW50bHkgZWRpdGVkIGxpbmUgYWNjb3JkaW5nbHkgdG8gdGhlIGJ1ZmZlciBjb250ZW50LAorICogY3Vyc29yIHBvc2l0aW9uLCBhbmQgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIHRlcm1pbmFsLiAqLworc3RhdGljIHZvaWQgcmVmcmVzaEN1cnNvck11bHRpTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzY0XTsKKyAgICBpbnQgcGxlbiA9IHN0cmxlbihsLT5wcm9tcHQpOworICAgIGludCBvbGRfcnBvcyA9IChwbGVuK2wtPm9sZHBvcytsLT5jb2xzKS9sLT5jb2xzOyAvKiBjdXJzb3IgcmVsYXRpdmUgcm93LiAqLworICAgIGludCBuZXdfcnBvcyA9IChwbGVuK2wtPnBvcytsLT5jb2xzKS9sLT5jb2xzOyAvKiBjdXJzb3IgcmVsYXRpdmUgcm93LiAqLworICAgIGludCBvbGRfY3BvcyA9IChwbGVuK2wtPm9sZHBvcyklbC0+Y29sczsgLyogY3Vyc29yIHJlbGF0aXZlIHJvdy4gKi8KKyAgICBpbnQgbmV3X2Nwb3MgPSAocGxlbitsLT5wb3MpJWwtPmNvbHM7IC8qIGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgc3RydWN0IGFidWYgYWI7CisKKyAgICAvKiBVcGRhdGUgbWF4cm93cyBpZiBuZWVkZWQuICovCisgICAgaWYgKG5ld19ycG9zID4gKGludClsLT5tYXhyb3dzKSBuZXdfcnBvcyA9IGwtPm1heHJvd3M7CisKKyAgICBsbmRlYnVnKCJvbGRwPSVkIG5ld3A9JWQgb3I9JWQgbnI9JWQgb2M9JWQgbmM9JWRcblxuIiwgbC0+b2xkcG9zLCBsLT5wb3MsIG9sZF9ycG9zLCBuZXdfcnBvcywgb2xkX2Nwb3MsIG5ld19jcG9zKTsKKworICAgIGFiSW5pdCgmYWIpOworCisgICAgLyogSGFuZGxlIHJvdyAqLworICAgIGlmIChuZXdfcnBvcyA+IG9sZF9ycG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQiIsIG5ld19ycG9zIC0gb2xkX3Jwb3MpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisgICAgZWxzZSBpZiAobmV3X3Jwb3MgPCBvbGRfcnBvcykKKyAgICB7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEEiLCBvbGRfcnBvcyAtIG5ld19ycG9zKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorCisgICAgLyogSGFuZGxlIGNvbHVtbiAqLworICAgIGlmIChuZXdfY3BvcyA+IG9sZF9jcG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQyIsIG5ld19jcG9zIC0gb2xkX2Nwb3MpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisgICAgZWxzZSBpZiAobmV3X2Nwb3MgPCBvbGRfY3BvcykKKyAgICB7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEQiLCBvbGRfY3BvcyAtIG5ld19jcG9zKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorCisgICAgbC0+b2xkcG9zID0gbC0+cG9zOworCisgICAgaWYgKHdyaXRlRXNjU2VxdWVuY2Uoc2Vzc2lvbiwgYWIuYiwgYWIubGVuKSA9PSAtMSkge30gLyogQ2FuJ3QgcmVjb3ZlciBmcm9tIHdyaXRlIGVycm9yLiAqLworICAgIGFiRnJlZSgmYWIpOworfQorCisvKiBNdWx0aSBsaW5lIGxvdyBsZXZlbCBsaW5lIHJlZnJlc2guCisgKgorICogUmV3cml0ZSB0aGUgY3VycmVudGx5IGVkaXRlZCBsaW5lIGFjY29yZGluZ2x5IHRvIHRoZSBidWZmZXIgY29udGVudCwKKyAqIGN1cnNvciBwb3NpdGlvbiwgYW5kIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSB0ZXJtaW5hbC4gKi8KK3N0YXRpYyB2b2lkIHJlZnJlc2hNdWx0aUxpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBjaGFyIHNlcVs2NF07CisgICAgaW50IHBsZW4gPSBzdHJsZW4obC0+cHJvbXB0KTsKKyAgICBpbnQgcm93cyA9IChwbGVuK2wtPmxlbitsLT5jb2xzLTEpL2wtPmNvbHM7IC8qIHJvd3MgdXNlZCBieSBjdXJyZW50IGJ1Zi4gKi8KKyAgICBpbnQgcnBvcyA9IChwbGVuK2wtPm9sZHBvcytsLT5jb2xzKS9sLT5jb2xzOyAvKiBjdXJzb3IgcmVsYXRpdmUgcm93LiAqLworICAgIGludCBycG9zMjsgLyogcnBvcyBhZnRlciByZWZyZXNoLiAqLworICAgIGludCBvbGRfcm93cyA9IGwtPm1heHJvd3M7CisgICAgaW50IHBvczsKKyAgICBpbnQgajsKKyAgICBzdHJ1Y3QgYWJ1ZiBhYjsKKworICAgIC8qIFVwZGF0ZSBtYXhyb3dzIGlmIG5lZWRlZC4gKi8KKyAgICBpZiAocm93cyA+IChpbnQpbC0+bWF4cm93cykgbC0+bWF4cm93cyA9IHJvd3M7CisKKyAgICAvKiBGaXJzdCBzdGVwOiBjbGVhciBhbGwgdGhlIGxpbmVzIHVzZWQgYmVmb3JlLiBUbyBkbyBzbyBzdGFydCBieQorICAgICAqIGdvaW5nIHRvIHRoZSBsYXN0IHJvdy4gKi8KKyAgICBhYkluaXQoJmFiKTsKKyAgICBpZiAob2xkX3Jvd3MtcnBvcyA+IDApIHsKKyAgICAgICAgbG5kZWJ1ZygiZ28gZG93biAlZCIsIG9sZF9yb3dzLXJwb3MpOworICAgICAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbJWRCIiwgb2xkX3Jvd3MtcnBvcyk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKworICAgIC8qIE5vdyBmb3IgZXZlcnkgcm93IGNsZWFyIGl0LCBnbyB1cC4gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgb2xkX3Jvd3MtMTsgaisrKSB7CisgICAgICAgIGxuZGVidWcoImNsZWFyK3VwIik7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYls5OTlEXHgxYlswS1x4MWJbMUEiKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorCisgICAgLyogQ2xlYW4gdGhlIHRvcCBsaW5lLiAqLworICAgIGxuZGVidWcoImNsZWFyIik7CisgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OURceDFiWzBLIik7CisgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisKKyAgICAvKiBXcml0ZSB0aGUgcHJvbXB0IGFuZCB0aGUgY3VycmVudCBidWZmZXIgY29udGVudCAqLworICAgIGFiQXBwZW5kKCZhYixsLT5wcm9tcHQsc3RybGVuKGwtPnByb21wdCkpOworICAgIGFiQXBwZW5kKCZhYixsLT5idWYsbC0+bGVuKTsKKworICAgIC8qIElmIHdlIGFyZSBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIHNjcmVlbiB3aXRoIG91ciBwcm9tcHQsIHdlIG5lZWQgdG8KKyAgICAgKiBlbWl0IGEgbmV3bGluZSBhbmQgbW92ZSB0aGUgcHJvbXB0IHRvIHRoZSBmaXJzdCBjb2x1bW4uICovCisgICAgaWYgKGwtPnBvcyAmJgorICAgICAgICBsLT5wb3MgPT0gbC0+bGVuICYmCisgICAgICAgIChsLT5wb3MrcGxlbikgJSBsLT5jb2xzID09IDApCisgICAgeworICAgICAgICBsbmRlYnVnKCI8bmV3bGluZT4iKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLCJcbiIsMSk7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYls5OTlEIik7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgICAgICByb3dzKys7CisgICAgICAgIGlmIChyb3dzID4gKGludClsLT5tYXhyb3dzKSBsLT5tYXhyb3dzID0gcm93czsKKyAgICB9CisKKyAgICAvKiBNb3ZlIGN1cnNvciB0byByaWdodCBwb3NpdGlvbi4gKi8KKyAgICBycG9zMiA9IChwbGVuK2wtPnBvcytsLT5jb2xzKS9sLT5jb2xzOyAvKiBjdXJyZW50IGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgbG5kZWJ1ZygicnBvczIgJWQiLCBycG9zMik7CisKKyAgICAvKiBHbyB1cCB0aWxsIHdlIHJlYWNoIHRoZSBleHBlY3RlZCBwb3NpdG9uLiAqLworICAgIGlmIChyb3dzLXJwb3MyID4gMCkgeworICAgICAgICBsbmRlYnVnKCJnby11cCAlZCIsIHJvd3MtcnBvczIpOworICAgICAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbJWRBIiwgcm93cy1ycG9zMik7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKworICAgIC8qIFNldCBjb2x1bW4uICovCisgICAgbG5kZWJ1Zygic2V0IGNvbCAlZCIsIDErKChwbGVuKyhpbnQpbC0+cG9zKSAlIChpbnQpbC0+Y29scykpOworICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYls5OTlEIik7CisgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgcG9zID0gKChwbGVuKyhpbnQpbC0+cG9zKSAlIChpbnQpbC0+Y29scyk7CisgICAgaWYgKHBvcykKKyAgICB7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEMiLCBwb3MpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisgICAgbG5kZWJ1ZygiXG4iKTsKKyAgICBsLT5vbGRwb3MgPSBsLT5wb3M7CisKKyAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCBhYi5iLCBhYi5sZW4pID09IC0xKSB7fSAvKiBDYW4ndCByZWNvdmVyIGZyb20gd3JpdGUgZXJyb3IuICovCisgICAgYWJGcmVlKCZhYik7CisKKyAgICBsbmRlYnVnKCIgLSBvdXRcbiIpOworfQorCisvKiBDYWxscyB0aGUgdHdvIGxvdyBsZXZlbCBmdW5jdGlvbnMgcmVmcmVzaEN1cnNvclNpbmdsZUxpbmUoKSBvcgorICogcmVmcmVzaEN1cnNvck11bHRpTGluZSgpIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHJlZnJlc2hDdXJzb3IobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIGlmIChzZXNzaW9uLT5tbG1vZGUpCisgICAgICAgIHJlZnJlc2hDdXJzb3JNdWx0aUxpbmUoc2Vzc2lvbik7CisgICAgZWxzZQorICAgICAgICByZWZyZXNoQ3Vyc29yU2luZ2xlTGluZShzZXNzaW9uKTsKK30KKworLyogQ2FsbHMgdGhlIHR3byBsb3cgbGV2ZWwgZnVuY3Rpb25zIHJlZnJlc2hTaW5nbGVMaW5lKCkgb3IKKyAqIHJlZnJlc2hNdWx0aUxpbmUoKSBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIG1vZGUuICovCitzdGF0aWMgdm9pZCByZWZyZXNoTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgaWYgKHNlc3Npb24tPm1sbW9kZSkKKyAgICAgICAgcmVmcmVzaE11bHRpTGluZShzZXNzaW9uKTsKKyAgICBlbHNlCisgICAgICAgIHJlZnJlc2hTaW5nbGVMaW5lKHNlc3Npb24pOworfQorCisvKiBJbnNlcnQgdGhlIGNoYXJhY3RlciAnYycgYXQgY3Vyc29yIGN1cnJlbnQgcG9zaXRpb24uCisgKgorICogT24gZXJyb3Igd3JpdGluZyB0byB0aGUgdGVybWluYWwgLTEgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSAwLiAqLworc3RhdGljIGludCBsaW5lbm9pc2VFZGl0SW5zZXJ0KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNoYXIgYykgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+bGVuIDwgbC0+YnVmbGVuKSB7CisgICAgICAgIGlmIChsLT5sZW4gPT0gbC0+cG9zKSB7CisgICAgICAgICAgICBpbnQgcGxlbiA9IHN0cmxlbihsLT5wcm9tcHQpOworICAgICAgICAgICAgaW50IHJvd3MgPSAocGxlbitsLT5sZW4rbC0+Y29scykvbC0+Y29sczsKKworICAgICAgICAgICAgbC0+YnVmW2wtPnBvc10gPSBjOworICAgICAgICAgICAgbC0+cG9zKys7CisgICAgICAgICAgICBsLT5sZW4rKzsKKyAgICAgICAgICAgIGwtPmJ1ZltsLT5sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGxuZGVidWcoIiBwbGVuPSVkIGxlbj0lZCBwb3M9JWQgY29scz0lZCBidWY9PCVzPlxuIiwKKyAgICAgICAgICAgICAgICAoaW50KWwtPnBsZW4sIChpbnQpbC0+bGVuLCAoaW50KWwtPnBvcywgKGludClsLT5jb2xzLCBsLT5idWYpOworICAgICAgICAgICAgaWYgKHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgJmMsIDEpID09IC0xKSByZXR1cm4gLTE7CisgICAgICAgICAgICBsLT5vbGRwb3MgPSBsLT5wb3M7CisgICAgICAgICAgICBsLT5tYXhyb3dzID0gcm93czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbW1vdmUobC0+YnVmK2wtPnBvcysxLGwtPmJ1ZitsLT5wb3MsbC0+bGVuLWwtPnBvcyk7CisgICAgICAgICAgICBsLT5idWZbbC0+cG9zXSA9IGM7CisgICAgICAgICAgICBsLT5sZW4rKzsKKyAgICAgICAgICAgIGwtPnBvcysrOworICAgICAgICAgICAgbC0+YnVmW2wtPmxlbl0gPSAnXDAnOworICAgICAgICAgICAgbG5kZWJ1ZygiIHBsZW49JWQgbGVuPSVkIHBvcz0lZCBjb2xzPSVkIGJ1Zj08JXM+XG4iLAorICAgICAgICAgICAgICAgIGwtPnBsZW4sIGwtPmxlbiwgbC0+cG9zLCBsLT5jb2xzLCBsLT5idWYpOworICAgICAgICAgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE1vdmUgY3Vyc29yIG9uIHRoZSBsZWZ0LiAqLworc3RhdGljIHZvaWQgbGluZW5vaXNlRWRpdE1vdmVMZWZ0KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaWYgKGwtPnBvcyA+IDApIHsKKyAgICAgICAgbC0+cG9zLS07CisgICAgICAgIHJlZnJlc2hDdXJzb3Ioc2Vzc2lvbik7CisgICAgfQorfQorCisvKiBNb3ZlIGN1cnNvciBvbiB0aGUgcmlnaHQuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0TW92ZVJpZ2h0KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaWYgKGwtPnBvcyAhPSBsLT5sZW4pIHsKKyAgICAgICAgbC0+cG9zKys7CisgICAgICAgIHJlZnJlc2hDdXJzb3Ioc2Vzc2lvbik7CisgICAgfQorfQorCisvKiBNb3ZlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0TW92ZUhvbWUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+cG9zICE9IDApIHsKKyAgICAgICAgbC0+cG9zID0gMDsKKyAgICAgICAgcmVmcmVzaEN1cnNvcihzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIE1vdmUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0TW92ZUVuZChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGlmIChsLT5wb3MgIT0gbC0+bGVuKSB7CisgICAgICAgIGwtPnBvcyA9IGwtPmxlbjsKKyAgICAgICAgcmVmcmVzaEN1cnNvcihzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIHN0cmR1cCBpbXBsZW1lbnRhdGlvbiAqLworc3RhdGljIGlubGluZSBjaGFyICpsaW5lbm9pc2Vfc3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisgICAgc2l6ZV90IHNpemUgPSBzdHJsZW4ocykgKyAxOworICAgIGNoYXIgKm5ldyA9IGJjbW9zX2FsbG9jKHNpemUpOworICAgIGlmIChuZXcpCisgICAgICAgIG1lbWNweShuZXcsIHMsIHNpemUpOworICAgIHJldHVybiBuZXc7Cit9CisKKy8qIFN1YnN0aXR1dGUgdGhlIGN1cnJlbnRseSBlZGl0ZWQgbGluZSB3aXRoIHRoZSBuZXh0IG9yIHByZXZpb3VzIGhpc3RvcnkKKyAqIGVudHJ5IGFzIHNwZWNpZmllZCBieSAnZGlyJy4gKi8KKyNkZWZpbmUgTElORU5PSVNFX0hJU1RPUllfTkVYVCAwCisjZGVmaW5lIExJTkVOT0lTRV9ISVNUT1JZX1BSRVYgMQorc3RhdGljIHZvaWQgbGluZW5vaXNlRWRpdEhpc3RvcnlOZXh0KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBkaXIpIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaWYgKHNlc3Npb24tPmhpc3RvcnlfbGVuID4gMSkgeworICAgICAgICAvKiBVcGRhdGUgdGhlIGN1cnJlbnQgaGlzdG9yeSBlbnRyeSBiZWZvcmUgdG8KKyAgICAgICAgICogb3ZlcndyaXRlIGl0IHdpdGggdGhlIG5leHQgb25lLiAqLworICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW4gLSAxIC0gbC0+aGlzdG9yeV9pbmRleF0pOworICAgICAgICBzZXNzaW9uLT5oaXN0b3J5W3Nlc3Npb24tPmhpc3RvcnlfbGVuIC0gMSAtIGwtPmhpc3RvcnlfaW5kZXhdID0gbGluZW5vaXNlX3N0cmR1cChsLT5idWYpOworICAgICAgICAvKiBTaG93IHRoZSBuZXcgZW50cnkgKi8KKyAgICAgICAgbC0+aGlzdG9yeV9pbmRleCArPSAoZGlyID09IExJTkVOT0lTRV9ISVNUT1JZX1BSRVYpID8gMSA6IC0xOworICAgICAgICBpZiAobC0+aGlzdG9yeV9pbmRleCA8IDApIHsKKyAgICAgICAgICAgIGwtPmhpc3RvcnlfaW5kZXggPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGwtPmhpc3RvcnlfaW5kZXggPj0gc2Vzc2lvbi0+aGlzdG9yeV9sZW4pIHsKKyAgICAgICAgICAgIGwtPmhpc3RvcnlfaW5kZXggPSBzZXNzaW9uLT5oaXN0b3J5X2xlbi0xOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkobC0+YnVmLHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW4gLSAxIC0gbC0+aGlzdG9yeV9pbmRleF0sbC0+YnVmbGVuKTsKKyAgICAgICAgbC0+YnVmW2wtPmJ1Zmxlbi0xXSA9ICdcMCc7CisgICAgICAgIGwtPmxlbiA9IGwtPnBvcyA9IHN0cmxlbihsLT5idWYpOworICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIERlbGV0ZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIGN1cnNvcgorICogcG9zaXRpb24uIEJhc2ljYWxseSB0aGlzIGlzIHdoYXQgaGFwcGVucyB3aXRoIHRoZSAiRGVsZXRlIiBrZXlib2FyZCBrZXkuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0RGVsZXRlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaWYgKGwtPmxlbiA+IDAgJiYgbC0+cG9zIDwgbC0+bGVuKSB7CisgICAgICAgIG1lbW1vdmUobC0+YnVmK2wtPnBvcyxsLT5idWYrbC0+cG9zKzEsbC0+bGVuLWwtPnBvcy0xKTsKKyAgICAgICAgbC0+bGVuLS07CisgICAgICAgIGwtPmJ1ZltsLT5sZW5dID0gJ1wwJzsKKyAgICAgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7CisgICAgfQorfQorCisvKiBCYWNrc3BhY2UgaW1wbGVtZW50YXRpb24uICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0QmFja3NwYWNlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaWYgKGwtPnBvcyA+IDAgJiYgbC0+bGVuID4gMCkgeworICAgICAgICBtZW1tb3ZlKGwtPmJ1ZitsLT5wb3MtMSxsLT5idWYrbC0+cG9zLGwtPmxlbi1sLT5wb3MpOworICAgICAgICBsLT5wb3MtLTsKKyAgICAgICAgbC0+bGVuLS07CisgICAgICAgIGwtPmJ1ZltsLT5sZW5dID0gJ1wwJzsKKyAgICAgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7CisgICAgfQorfQorCisvKiBEZWxldGUgdGhlIHByZXZpb3N1IHdvcmQsIG1haW50YWluaW5nIHRoZSBjdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICogY3VycmVudCB3b3JkLiAqLworc3RhdGljIHZvaWQgbGluZW5vaXNlRWRpdERlbGV0ZVByZXZXb3JkKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgc2l6ZV90IG9sZF9wb3MgPSBsLT5wb3M7CisgICAgc2l6ZV90IGRpZmY7CisKKyAgICB3aGlsZSAobC0+cG9zID4gMCAmJiBsLT5idWZbbC0+cG9zLTFdID09ICcgJykKKyAgICAgICAgbC0+cG9zLS07CisgICAgd2hpbGUgKGwtPnBvcyA+IDAgJiYgbC0+YnVmW2wtPnBvcy0xXSAhPSAnICcpCisgICAgICAgIGwtPnBvcy0tOworICAgIGRpZmYgPSBvbGRfcG9zIC0gbC0+cG9zOworICAgIG1lbW1vdmUobC0+YnVmK2wtPnBvcyxsLT5idWYrb2xkX3BvcyxsLT5sZW4tb2xkX3BvcysxKTsKKyAgICBsLT5sZW4gLT0gZGlmZjsKKyAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKK30KKworc3RhdGljIGludCBsaW5lbm9pc2VSZWFkQ2hhcihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjaGFyICpjKQoreworICAgIGludCBuOworCisgICAgZG8geworICAgICAgICBpZiAoc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpjID0gc2Vzc2lvbi0+cmVhZF9haGVhZF9idWZbc2Vzc2lvbi0+cmVhZF9haGVhZF9wb3MrK107CisgICAgICAgICAgICBsbmRlYnVnKCJyZWFkIGNoYXIgZnJvbSBidWYgJWQoJWMpXG4iLCAqYywgKmMpOworICAgICAgICAgICAgaWYgKCpjKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5yZWFkX2FoZWFkX2J1Zik7CisgICAgICAgICAgICBzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZiA9IE5VTEw7CisgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgICAgICAgfQorICAgICAgICBuID0gc2Vzc2lvbi0+aW8ucmVhZF9jaGFyKHNlc3Npb24tPmlvLmZkX2luLCBjKTsKKyAgICB9IHdoaWxlICghbiB8fCAobiA9PSAxICYmICEgKmMpKTsKKyAgICBsbmRlYnVnKCJyZWFkIGNoYXIgZnJvbSBpbyAlZCglYykgbj0lZFxuIiwgKmMsICpjLCBuKTsKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBsaW5lbm9pc2VIYW5kbGVFc2NTZXF1ZW5jZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKQoreworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBjaGFyIHNlcVszMl07CisKKyAgICAvKiBSZWFkIHRoZSBuZXh0IHR3byBieXRlcyByZXByZXNlbnRpbmcgdGhlIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgKiBVc2UgdHdvIGNhbGxzIHRvIGhhbmRsZSBzbG93IHRlcm1pbmFscyByZXR1cm5pbmcgdGhlIHR3bworICAgICAqIGNoYXJzIGF0IGRpZmZlcmVudCB0aW1lcy4gKi8KKyAgICBpZiAobGluZW5vaXNlUmVhZENoYXIoc2Vzc2lvbiwgc2VxKSA9PSAtMSkgcmV0dXJuIC0xOworICAgIGlmIChsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCBzZXErMSkgPT0gLTEpIHJldHVybiAtMTsKKyAgICBsbmRlYnVnKCJzZXE9JTAyeCglYykgc2VxMT0lMDJ4KCVjKVxuIiwgc2VxWzBdLCBzZXFbMF0sIHNlcVsxXSwgc2VxWzFdKTsKKworICAgIC8qIEVTQyBbIHNlcXVlbmNlcy4gKi8KKyAgICBpZiAoc2VxWzBdID09ICdbJykgeworICAgICAgICBpZiAoc2VxWzFdID49ICcwJyAmJiBzZXFbMV0gPD0gJzknKSB7CisgICAgICAgICAgICBpbnQgbiA9IDI7CisgICAgICAgICAgICBjaGFyIHRlcm1pbmF0b3IgPSAwOworCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBlc2NhcGUsIHJlYWQgYWRkaXRpb25hbCBieXRlKHMpICovCisgICAgICAgICAgICB3aGlsZSAobGluZW5vaXNlUmVhZENoYXIoc2Vzc2lvbiwgc2VxK24pICE9IC0xICYmIG4gPCBzaXplb2Yoc2VxKSAtIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVybWluYXRvciA9IHNlcVtuKytdOworICAgICAgICAgICAgICAgIGlmICggISh0ZXJtaW5hdG9yID49ICcwJyAmJiB0ZXJtaW5hdG9yIDw9ICc5JykgJiYgdGVybWluYXRvciAhPSAnOycpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VxW25dID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAodGVybWluYXRvciApIHsKKyAgICAgICAgICAgICAgICBjYXNlICd+JzoKKyAgICAgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdERlbGV0ZShzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBjb2w7CisgICAgICAgICAgICAgICAgICAgIC8qIFBvc2l0aW9uIHJlcG9ydCAqLworICAgICAgICAgICAgICAgICAgICBzZXFbbi0xXSA9IDA7IC8qIEN1dCBSICovCisgICAgICAgICAgICAgICAgICAgIHNzY2FuZihzZXErMSwgIiVkOyVkIiwgJnJvdywgJmNvbCk7CisgICAgICAgICAgICAgICAgICAgIGwtPmNvbHMgPSBjb2w7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm5jb2xyZXFzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbG5kZWJ1ZygicG9zaXRpb24gcmVwb3J0IHJvdz0lZCBjb2w9JWRcbiIsIHJvdywgY29sKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2goc2VxWzFdKSB7CisgICAgICAgICAgICBjYXNlICdBJzogLyogVXAgKi8KKyAgICAgICAgICAgICAgICBsaW5lbm9pc2VFZGl0SGlzdG9yeU5leHQoc2Vzc2lvbiwgTElORU5PSVNFX0hJU1RPUllfUFJFVik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdCJzogLyogRG93biAqLworICAgICAgICAgICAgICAgIGxpbmVub2lzZUVkaXRIaXN0b3J5TmV4dChzZXNzaW9uLCBMSU5FTk9JU0VfSElTVE9SWV9ORVhUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOiAvKiBSaWdodCAqLworICAgICAgICAgICAgICAgIGxpbmVub2lzZUVkaXRNb3ZlUmlnaHQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdEJzogLyogTGVmdCAqLworICAgICAgICAgICAgICAgIGxpbmVub2lzZUVkaXRNb3ZlTGVmdChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0gnOiAvKiBIb21lICovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVIb21lKHNlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRic6IC8qIEVuZCovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVFbmQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogRVNDIE8gc2VxdWVuY2VzLiAqLworICAgIGVsc2UgaWYgKHNlcVswXSA9PSAnTycpIHsKKyAgICAgICAgc3dpdGNoKHNlcVsxXSkgeworICAgICAgICBjYXNlICdIJzogLyogSG9tZSAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVIb21lKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0YnOiAvKiBFbmQqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVFbmQoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjb3JlIG9mIHRoZSBsaW5lIGVkaXRpbmcgY2FwYWJpbGl0eSBvZiBsaW5lbm9pc2UuCisgKiBJdCBleHBlY3RzICdmZCcgdG8gYmUgYWxyZWFkeSBpbiAicmF3IG1vZGUiIHNvIHRoYXQgZXZlcnkga2V5IHByZXNzZWQKKyAqIHdpbGwgYmUgcmV0dXJuZWQgQVNBUCB0byByZWFkKCkuCisgKgorICogVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgcHV0IGludG8gJ2J1Zicgd2hlbiB0aGUgdXNlciB0eXBlIGVudGVyLCBvcgorICogd2hlbiBjdHJsK2QgaXMgdHlwZWQuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBidWZmZXIuICovCitzdGF0aWMgaW50IGxpbmVub2lzZUVkaXQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBjb25zdCBjaGFyICpwcm9tcHQpCit7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGludCBucmVhZCA9IDA7CisKKyAgICAvKiBQb3B1bGF0ZSB0aGUgbGluZW5vaXNlIHN0YXRlIHRoYXQgd2UgcGFzcyB0byBmdW5jdGlvbnMgaW1wbGVtZW50aW5nCisgICAgICogc3BlY2lmaWMgZWRpdGluZyBmdW5jdGlvbmFsaXRpZXMuICovCisgICAgbC0+YnVmID0gYnVmOworICAgIGwtPmJ1ZmxlbiA9IGJ1ZmxlbjsKKyAgICBsLT5wcm9tcHQgPSBwcm9tcHQ7CisgICAgbC0+cGxlbiA9IHN0cmxlbihwcm9tcHQpOworICAgIGwtPm9sZHBvcyA9IGwtPnBvcyA9IDA7CisgICAgbC0+bGVuID0gMDsKKyAgICBpZiAoIWwtPmNvbHMpCisgICAgICAgIGwtPmNvbHMgPSA4MDsKKyAgICBnZXRDb2x1bW5zUmVxdWVzdChzZXNzaW9uKTsKKyAgICBsLT5tYXhyb3dzID0gMDsKKyAgICBsLT5oaXN0b3J5X2luZGV4ID0gMDsKKworICAgIC8qIEJ1ZmZlciBzdGFydHMgZW1wdHkuICovCisgICAgbC0+YnVmWzBdID0gJ1wwJzsKKyAgICBsLT5idWZsZW4tLTsgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGFsd2F5cyBzcGFjZSBmb3IgdGhlIG51bHRlcm0gKi8KKworICAgIC8qIFRoZSBsYXRlc3QgaGlzdG9yeSBlbnRyeSBpcyBhbHdheXMgb3VyIGN1cnJlbnQgYnVmZmVyLCB0aGF0CisgICAgICogaW5pdGlhbGx5IGlzIGp1c3QgYW4gZW1wdHkgc3RyaW5nLiAqLworICAgIGxpbmVub2lzZUhpc3RvcnlBZGQoc2Vzc2lvbiwgIiIpOworICAgIGlmIChsLT5wbGVuICYmIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgcHJvbXB0LCBsLT5wbGVuKSA9PSAtMSkgcmV0dXJuIC0xOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgY2hhciBjOworCisgICAgICAgIG5yZWFkID0gbGluZW5vaXNlUmVhZENoYXIoc2Vzc2lvbiwgJmMpOworICAgICAgICBpZiAobnJlYWQgPD0gMCkgZ290byBlZGl0X291dDsKKworICAgICAgICBsbmRlYnVnKCJjPSUwMngoJWMpXG4iLCBjLCBjKTsKKyAgICAgICAgLyogT25seSBhdXRvY29tcGxldGUgd2hlbiB0aGUgY2FsbGJhY2sgaXMgc2V0LiBJdCByZXR1cm5zIDwgMCB3aGVuCisgICAgICAgICAqIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGZyb20gZmQuIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiB0aGUKKyAgICAgICAgICogY2hhcmFjdGVyIHRoYXQgc2hvdWxkIGJlIGhhbmRsZWQgbmV4dC4gKi8KKyAgICAgICAgaWYgKGMgPT0gS0VZX1RBQiAmJiBzZXNzaW9uLT5jb21wbGV0aW9uQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgY29tcGxldGVMaW5lKHNlc3Npb24pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2goYykgeworICAgICAgICBjYXNlIEtFWV9DUjogICAgLyogZW50ZXIgKi8KKyAgICAgICAgY2FzZSBLRVlfTEY6ICAgIC8qIGVudGVyICovCisgICAgICAgICAgICBzZXNzaW9uLT5oaXN0b3J5X2xlbi0tOworICAgICAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5W3Nlc3Npb24tPmhpc3RvcnlfbGVuXSk7CisgICAgICAgICAgICBnb3RvIGVkaXRfb3V0OworICAgICAgICBjYXNlIENUUkxfQzogICAgIC8qIGN0cmwtYyAqLworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIEJBQ0tTUEFDRTogICAvKiBiYWNrc3BhY2UgKi8KKyAgICAgICAgY2FzZSA4OiAgICAgLyogY3RybC1oICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0QmFja3NwYWNlKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9EOiAgICAgLyogY3RybC1kLCByZW1vdmUgY2hhciBhdCByaWdodCBvZiBjdXJzb3IsIG9yIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBsaW5lIGlzIGVtcHR5LCBhY3QgYXMgZW5kLW9mLWZpbGUuICovCisgICAgICAgICAgICBpZiAobC0+bGVuID4gMCkgeworICAgICAgICAgICAgICAgIGxpbmVub2lzZUVkaXREZWxldGUoc2Vzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPmhpc3RvcnlfbGVuLS07CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5W3Nlc3Npb24tPmhpc3RvcnlfbGVuXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9UOiAgICAvKiBjdHJsLXQsIHN3YXBzIGN1cnJlbnQgY2hhcmFjdGVyIHdpdGggcHJldmlvdXMuICovCisgICAgICAgICAgICBpZiAobC0+cG9zID4gMCAmJiBsLT5wb3MgPCBsLT5sZW4pIHsKKyAgICAgICAgICAgICAgICBpbnQgYXV4ID0gYnVmW2wtPnBvcy0xXTsKKyAgICAgICAgICAgICAgICBidWZbbC0+cG9zLTFdID0gYnVmW2wtPnBvc107CisgICAgICAgICAgICAgICAgYnVmW2wtPnBvc10gPSBhdXg7CisgICAgICAgICAgICAgICAgaWYgKGwtPnBvcyAhPSBsLT5sZW4tMSkgbC0+cG9zKys7CisgICAgICAgICAgICAgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0I6ICAgICAvKiBjdHJsLWIgKi8KKyAgICAgICAgICAgIGxpbmVub2lzZUVkaXRNb3ZlTGVmdChzZXNzaW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfRjogICAgIC8qIGN0cmwtZiAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVSaWdodChzZXNzaW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfUDogICAgLyogY3RybC1wICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0SGlzdG9yeU5leHQoc2Vzc2lvbiwgTElORU5PSVNFX0hJU1RPUllfUFJFVik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX046ICAgIC8qIGN0cmwtbiAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdEhpc3RvcnlOZXh0KHNlc3Npb24sIExJTkVOT0lTRV9ISVNUT1JZX05FWFQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVNDOiAgICAvKiBlc2NhcGUgc2VxdWVuY2UgKi8KKyAgICAgICAgICAgIGxpbmVub2lzZUhhbmRsZUVzY1NlcXVlbmNlKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAobGluZW5vaXNlRWRpdEluc2VydChzZXNzaW9uLGMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxuZGVidWcoImVkaXRJbnNlcnQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9VOiAvKiBDdHJsK3UsIGRlbGV0ZSB0aGUgd2hvbGUgbGluZS4gKi8KKyAgICAgICAgICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgICAgICAgICBsLT5wb3MgPSBsLT5sZW4gPSAwOworICAgICAgICAgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0s6IC8qIEN0cmwraywgZGVsZXRlIGZyb20gY3VycmVudCB0byBlbmQgb2YgbGluZS4gKi8KKyAgICAgICAgICAgIGJ1ZltsLT5wb3NdID0gJ1wwJzsKKyAgICAgICAgICAgIGwtPmxlbiA9IGwtPnBvczsKKyAgICAgICAgICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9BOiAvKiBDdHJsK2EsIGdvIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVIb21lKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9FOiAvKiBjdHJsK2UsIGdvIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKyAgICAgICAgICAgIGxpbmVub2lzZUVkaXRNb3ZlRW5kKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9MOiAvKiBjdHJsK2wsIGNsZWFyIHNjcmVlbiAqLworICAgICAgICAgICAgbGluZW5vaXNlQ2xlYXJTY3JlZW4oc2Vzc2lvbik7CisgICAgICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfVzogLyogY3RybCt3LCBkZWxldGUgcHJldmlvdXMgd29yZCAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdERlbGV0ZVByZXZXb3JkKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CitlZGl0X291dDoKKyAgICBsbmRlYnVnKCIgLSBvdXQuIGxlbj0lZCBidWY9PCVzPlxuIiwgbC0+bGVuLCBidWYpOworICAgIHJldHVybiAobnJlYWQgPj0gMCkgPyBsLT5sZW4gOiAtMTsKK30KKworLyogR2V0IHdpdGhvdXQgZWRpdGluZyAqLworc3RhdGljIGludCBsaW5lbm9pc2VOb2VkaXQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKSB7CisgICAgY2hhciBjOworICAgIGludCBsZW4gPSAwOworICAgIGludCBzd2l0Y2hfdG9fc21hcnRfbW9kZSA9IDA7CisgICAgaW50IG5yZWFkID0gMDsKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIGludCBhdHR5X3Rlcm0gPSBpc2F0dHkoU1RESU5fRklMRU5PKTsKKyNlbHNlCisgICAgaW50IGF0dHlfdGVybSA9IDE7CisjZW5kaWYKKworICAgIHdoaWxlICgobnJlYWQgPSBsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCAmYykpICE9IC0xICYmIGxlbiA8IGJ1ZmxlbiAtIDEpCisgICAgeworICAgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBidWZbbGVuKytdID0gYzsKKyAgICAgICAgLyogSWYgYnVmZmVyIGNvbnRhaW5zIEVTQyBzZXF1ZW5jZSAtIHBlcmhhcHMgdGhlIHRlcm1pbmFsIGlzIG5vdCBkdW1iIGFmdGVyIGFsbCAqLworICAgICAgICBpZiAoYyA9PSBFU0MgJiYgIXNlc3Npb24tPmlvLmR1bWJfdGVybWluYWwgJiYgIXNlc3Npb24tPmZvcmNlZF9kdW1iICYmIGF0dHlfdGVybSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoX3RvX3NtYXJ0X21vZGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogRWNobyBoZXJlIGlzIHRlcm1pbmFsIGlzIGluIHJhdyBtb2RlICovCisgICAgICAgIGlmIChzZXNzaW9uLT5yYXdtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLT5pby53cml0ZShzZXNzaW9uLT5pby5mZF9vdXQsICZjLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBidWZbbGVuXSA9IDA7CisgICAgaWYgKHN3aXRjaF90b19zbWFydF9tb2RlKQorICAgIHsKKyAgICAgICAgLyogQ29weSBidWZmZXIgaW50byByZWFkLWFoZWFkIGJ1ZmZlciBhbmQgcmUtcGFyc2UgKi8KKyAgICAgICAgbG5kZWJ1Zygic3dpdGNoaW5nIHRvIHNtYXJ0IG1vZGVcbiIpOworICAgICAgICAvKiBJZiB0aGVyZSBhbHJlYWR5IGlzIHJlYWRfYWhlYWQgYnVmIC0gcmVhbGxvYyBpdCAqLworICAgICAgICBpZiAoc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKm5ld19idWY7CisgICAgICAgICAgICBuZXdfYnVmID0gYmNtb3NfYWxsb2Moc3RybGVuKHNlc3Npb24tPnJlYWRfYWhlYWRfYnVmKSAtIHNlc3Npb24tPnJlYWRfYWhlYWRfcG9zICsgbGVuICsgMSk7CisgICAgICAgICAgICBpZiAoIW5ld19idWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgbWVtY3B5KG5ld19idWYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIHN0cmNweSgmbmV3X2J1ZltsZW5dLCAmc2Vzc2lvbi0+cmVhZF9haGVhZF9idWZbc2Vzc2lvbi0+cmVhZF9haGVhZF9wb3NdKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYpOworICAgICAgICAgICAgc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYgPSBuZXdfYnVmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYgPSBiY21vc19hbGxvYyhsZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICghc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc3RyY3B5KHNlc3Npb24tPnJlYWRfYWhlYWRfYnVmLCBidWYpOworICAgICAgICB9CisgICAgICAgIHNlc3Npb24tPnJlYWRfYWhlYWRfcG9zID0gMDsKKyAgICAgICAgc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCA9IDA7CisgICAgICAgIHNlc3Npb24tPm5jb2xyZXFzID0gMDsKKyAgICAgICAgKmJ1ZiA9IDA7CisgICAgICAgIG5yZWFkID0gbGluZW5vaXNlRWRpdChzZXNzaW9uLCBidWYsIGJ1ZmxlbiwgIiIpOworICAgIH0KKyAgICBsbmRlYnVnKCIgLSBvdXQuIGxlbj0lZCBidWY9PCVzPiBucmVhZD0lZFxuIiwgKGludClzdHJsZW4oYnVmKSwgYnVmLCBucmVhZCk7CisgICAgcmV0dXJuIChucmVhZCA+PTApID8gc3RybGVuKGJ1ZikgOiAtMTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBsaW5lIGVkaXRpbmcgZnVuY3Rpb24gbGluZW5vaXNlRWRpdCgpIHVzaW5nCisgKiB0aGUgU1RESU4gZmlsZSBkZXNjcmlwdG9yIHNldCBpbiByYXcgbW9kZS4gKi8KK3N0YXRpYyBpbnQgbGluZW5vaXNlUmF3KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgY29uc3QgY2hhciAqcHJvbXB0KSB7CisgICAgaW50IHJjID0gMDsKKworICAgIGxuZGVidWcoIlxuIik7CisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX1RFUk1JT1MKKyAgICBpZiAoIWlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisgICAgICAgIC8qIE5vdCBhIHR0eTogcmVhZCBmcm9tIGZpbGUgLyBwaXBlLiAqLworCXJjID0gbGluZW5vaXNlTm9lZGl0KHNlc3Npb24sIGJ1ZiwgYnVmbGVuKTsKKwlpZiAocmMgPj0gMCkKKwkgICAgc2Vzc2lvbi0+aW8ud3JpdGUoc2Vzc2lvbi0+aW8uZmRfb3V0LCAiXG4iLCAxKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICAvKiBJbnRlcmFjdGl2ZSBlZGl0aW5nLiAqLworICAgICAgICBpZiAoZW5hYmxlUmF3TW9kZShzZXNzaW9uKSA9PSAtMSkgcmV0dXJuIC0xOworCisgICAgICAgIGlmICghc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCAmJiBzZXNzaW9uLT5uY29scmVxcyA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlc3Npb24tPmR1bWJfdGVybWluYWwgPSAxOworICAgICAgICAgICAgbG5kZWJ1ZygiZHVtYl90ZXJtaW5hbD0lZFxuIiwgc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlc3Npb24tPmR1bWJfdGVybWluYWwpIHsKKyAgICAgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgcHJvbXB0LCBzdHJsZW4ocHJvbXB0KSk7CisgICAgICAgICAgICByYyA9IGxpbmVub2lzZU5vZWRpdChzZXNzaW9uLCBidWYsIGJ1Zmxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IGxpbmVub2lzZUVkaXQoc2Vzc2lvbiwgYnVmLCBidWZsZW4sIHByb21wdCk7CisgICAgICAgIH0KKworICAgICAgICBkaXNhYmxlUmF3TW9kZShzZXNzaW9uKTsKKyAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgICBzZXNzaW9uLT5pby53cml0ZShzZXNzaW9uLT5pby5mZF9vdXQsICJcbiIsIDEpOworICAgIH0KKyAgICBsbmRlYnVnKCIgLSBvdXQuIGxlbj0lZCBidWY9PCVzPiByYz0lZFxuIiwgKGludClzdHJsZW4oYnVmKSwgYnVmLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBUaGUgaGlnaCBsZXZlbCBmdW5jdGlvbiB0aGF0IGlzIHRoZSBtYWluIEFQSSBvZiB0aGUgbGluZW5vaXNlIGxpYnJhcnkuCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgdGVybWluYWwgaGFzIGJhc2ljIGNhcGFiaWxpdGllcywganVzdCBjaGVja2luZworICogZm9yIGEgYmxhY2tsaXN0IG9mIHN0dXBpZCB0ZXJtaW5hbHMsIGFuZCBsYXRlciBlaXRoZXIgY2FsbHMgdGhlIGxpbmUKKyAqIGVkaXRpbmcgZnVuY3Rpb24gb3IgdXNlcyBkdW1teSBmZ2V0cygpIHNvIHRoYXQgeW91IHdpbGwgYmUgYWJsZSB0byB0eXBlCisgKiBzb21ldGhpbmcgZXZlbiBpbiB0aGUgbW9zdCBkZXNwZXJhdGUgb2YgdGhlIGNvbmRpdGlvbnMuICovCitjaGFyICpsaW5lbm9pc2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqcHJvbXB0LCBjaGFyICpidWYsIHNpemVfdCBzaXplKSB7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgdGVybWluYWwgYXMgZHVtYiBpZiBpdCBkb2Vzbid0IHN1cHBvcnQgYmFzaWMgRVNDIHNlcXVlbmNlcyAqLworICAgIGlmIChzZXNzaW9uLT5pby5kdW1iX3Rlcm1pbmFsIHx8IHNlc3Npb24tPmZvcmNlZF9kdW1iKSB7CisgICAgICAgIGludCByYzsKKworICAgICAgICBzZXNzaW9uLT5pby53cml0ZShzZXNzaW9uLT5pby5mZF9vdXQsIHByb21wdCwgc3RybGVuKHByb21wdCkpOworICAgICAgICByYyA9IGxpbmVub2lzZU5vZWRpdChzZXNzaW9uLCBidWYsIHNpemUpOworICAgICAgICBzZXNzaW9uLT5pby53cml0ZShzZXNzaW9uLT5pby5mZF9vdXQsICJcbiIsIDEpOworICAgICAgICBsbmRlYnVnKCIgLSBvdXQuIGxlbj0lZCBidWY9PCVzPlxuIiwgKGludClzdHJsZW4oYnVmKSwgYnVmKTsKKyAgICAgICAgcmV0dXJuIChyYyA9PSAtMSkgPyBOVUxMIDogYnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsaW5lbm9pc2VSYXcoc2Vzc2lvbiwgYnVmLCBzaXplLCBwcm9tcHQpID09IC0xKSByZXR1cm4gTlVMTDsKKyAgICAgICAgbG5kZWJ1ZygiIC0gb3V0LiBsZW49JWQgYnVmPTwlcz5cbiIsIChpbnQpc3RybGVuKGJ1ZiksIGJ1Zik7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIaXN0b3J5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBGcmVlIHRoZSBoaXN0b3J5LCBidXQgZG9lcyBub3QgcmVzZXQgaXQuIE9ubHkgdXNlZCB3aGVuIHdlIGhhdmUgdG8KKyAqIGV4aXQoKSB0byBhdm9pZCBtZW1vcnkgbGVha3MgYXJlIHJlcG9ydGVkIGJ5IHZhbGdyaW5kICYgY28uICovCitzdGF0aWMgdm9pZCBmcmVlSGlzdG9yeShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgaWYgKHNlc3Npb24tPmhpc3RvcnkpIHsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNlc3Npb24tPmhpc3RvcnlfbGVuOyBqKyspCisgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPmhpc3Rvcnlbal0pOworICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPmhpc3RvcnkpOworICAgICAgICBzZXNzaW9uLT5oaXN0b3J5ID0gTlVMTDsKKyAgICB9Cit9CisKKy8qIFRoaXMgaXMgdGhlIEFQSSBjYWxsIHRvIGFkZCBhIG5ldyBlbnRyeSBpbiB0aGUgbGluZW5vaXNlIGhpc3RvcnkuCisgKiBJdCB1c2VzIGEgZml4ZWQgYXJyYXkgb2YgY2hhciBwb2ludGVycyB0aGF0IGFyZSBzaGlmdGVkIChtZW1tb3ZlZCkKKyAqIHdoZW4gdGhlIGhpc3RvcnkgbWF4IGxlbmd0aCBpcyByZWFjaGVkIGluIG9yZGVyIHRvIHJlbW92ZSB0aGUgb2xkZXIKKyAqIGVudHJ5IGFuZCBtYWtlIHJvb20gZm9yIHRoZSBuZXcgb25lLCBzbyBpdCBpcyBub3QgZXhhY3RseSBzdWl0YWJsZSBmb3IgaHVnZQorICogaGlzdG9yaWVzLCBidXQgd2lsbCB3b3JrIHdlbGwgZm9yIGEgZmV3IGh1bmRyZWQgb2YgZW50cmllcy4KKyAqCisgKiBVc2luZyBhIGNpcmN1bGFyIGJ1ZmZlciBpcyBzbWFydGVyLCBidXQgYSBiaXQgbW9yZSBjb21wbGV4IHRvIGhhbmRsZS4gKi8KK2ludCBsaW5lbm9pc2VIaXN0b3J5QWRkKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmxpbmUpIHsKKyAgICBjaGFyICpsaW5lY29weTsKKworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgICAvKiBJbml0aWFsaXphdGlvbiBvbiBmaXJzdCBjYWxsLiAqLworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeSA9IGJjbW9zX2FsbG9jKHNpemVvZihjaGFyKikqc2Vzc2lvbi0+aGlzdG9yeV9tYXhfbGVuKTsKKyAgICAgICAgaWYgKHNlc3Npb24tPmhpc3RvcnkgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgICAgIG1lbXNldChzZXNzaW9uLT5oaXN0b3J5LDAsKHNpemVvZihjaGFyKikqc2Vzc2lvbi0+aGlzdG9yeV9tYXhfbGVuKSk7CisgICAgfQorCisgICAgLyogRG9uJ3QgYWRkIGR1cGxpY2F0ZWQgbGluZXMuICovCisgICAgaWYgKHNlc3Npb24tPmhpc3RvcnlfbGVuICYmICFzdHJjbXAoc2Vzc2lvbi0+aGlzdG9yeVtzZXNzaW9uLT5oaXN0b3J5X2xlbi0xXSwgbGluZSkpIHJldHVybiAwOworCisgICAgLyogQWRkIGFuIGhlYXAgYWxsb2NhdGVkIGNvcHkgb2YgdGhlIGxpbmUgaW4gdGhlIGhpc3RvcnkuCisgICAgICogSWYgd2UgcmVhY2hlZCB0aGUgbWF4IGxlbmd0aCwgcmVtb3ZlIHRoZSBvbGRlciBsaW5lLiAqLworICAgIGxpbmVjb3B5ID0gbGluZW5vaXNlX3N0cmR1cChsaW5lKTsKKyAgICBpZiAoIWxpbmVjb3B5KSByZXR1cm4gMDsKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeV9sZW4gPT0gc2Vzc2lvbi0+aGlzdG9yeV9tYXhfbGVuKSB7CisgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeVswXSk7CisgICAgICAgIG1lbW1vdmUoc2Vzc2lvbi0+aGlzdG9yeSxzZXNzaW9uLT5oaXN0b3J5KzEsc2l6ZW9mKGNoYXIqKSooc2Vzc2lvbi0+aGlzdG9yeV9tYXhfbGVuLTEpKTsKKyAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeV9sZW4tLTsKKyAgICB9CisgICAgc2Vzc2lvbi0+aGlzdG9yeVtzZXNzaW9uLT5oaXN0b3J5X2xlbl0gPSBsaW5lY29weTsKKyAgICBzZXNzaW9uLT5oaXN0b3J5X2xlbisrOworICAgIHJldHVybiAxOworfQorCisvKiBTZXQgdGhlIG1heGltdW0gbGVuZ3RoIGZvciB0aGUgaGlzdG9yeS4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGV2ZW4KKyAqIGlmIHRoZXJlIGlzIGFscmVhZHkgc29tZSBoaXN0b3J5LCB0aGUgZnVuY3Rpb24gd2lsbCBtYWtlIHN1cmUgdG8gcmV0YWluCisgKiBqdXN0IHRoZSBsYXRlc3QgJ2xlbicgZWxlbWVudHMgaWYgdGhlIG5ldyBoaXN0b3J5IGxlbmd0aCB2YWx1ZSBpcyBzbWFsbGVyCisgKiB0aGFuIHRoZSBhbW91bnQgb2YgaXRlbXMgYWxyZWFkeSBpbnNpZGUgdGhlIGhpc3RvcnkuICovCitpbnQgbGluZW5vaXNlSGlzdG9yeVNldE1heExlbihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBpbnQgbGVuKSB7CisgICAgY2hhciAqKm5ldzsKKworICAgIGlmIChsZW4gPCAxKSByZXR1cm4gMDsKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeSkgeworICAgICAgICBpbnQgdG9jb3B5ID0gc2Vzc2lvbi0+aGlzdG9yeV9sZW47CisKKyAgICAgICAgbmV3ID0gYmNtb3NfYWxsb2Moc2l6ZW9mKGNoYXIqKSpsZW4pOworICAgICAgICBpZiAobmV3ID09IE5VTEwpIHJldHVybiAwOworCisgICAgICAgIC8qIElmIHdlIGNhbid0IGNvcHkgZXZlcnl0aGluZywgZnJlZSB0aGUgZWxlbWVudHMgd2UnbGwgbm90IHVzZS4gKi8KKyAgICAgICAgaWYgKGxlbiA8IHRvY29weSkgeworICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0b2NvcHktbGVuOyBqKyspIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeVtqXSk7CisgICAgICAgICAgICB0b2NvcHkgPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KG5ldywwLHNpemVvZihjaGFyKikqbGVuKTsKKyAgICAgICAgbWVtY3B5KG5ldyxzZXNzaW9uLT5oaXN0b3J5KyhzZXNzaW9uLT5oaXN0b3J5X2xlbi10b2NvcHkpLCBzaXplb2YoY2hhciopKnRvY29weSk7CisgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeSk7CisgICAgICAgIHNlc3Npb24tPmhpc3RvcnkgPSBuZXc7CisgICAgfQorICAgIHNlc3Npb24tPmhpc3RvcnlfbWF4X2xlbiA9IGxlbjsKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeV9sZW4gPiBzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4pCisgICAgICAgIHNlc3Npb24tPmhpc3RvcnlfbGVuID0gc2Vzc2lvbi0+aGlzdG9yeV9tYXhfbGVuOworICAgIHJldHVybiAxOworfQorCitpbnQgbGluZW5vaXNlU2V0UmF3KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCByYXcpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBpZiAocmF3KQorICAgICAgICByYyA9IGVuYWJsZVJhd01vZGUoc2Vzc2lvbik7CisgICAgZWxzZQorICAgICAgICBkaXNhYmxlUmF3TW9kZShzZXNzaW9uKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBsaW5lbm9pc2VHZXRSYXcobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICByZXR1cm4gc2Vzc2lvbi0+cmF3bW9kZTsKK30KKworI2lmbmRlZiBMSU5FTk9JU0VfRElTQUJMRV9ISVNUX1NBVkUKKworLyogU2F2ZSB0aGUgaGlzdG9yeSBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuIE9uIHN1Y2Nlc3MgMCBpcyByZXR1cm5lZAorICogb3RoZXJ3aXNlIC0xIGlzIHJldHVybmVkLiAqLworaW50IGxpbmVub2lzZUhpc3RvcnlTYXZlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwidyIpOworICAgIGludCBqOworCisgICAgaWYgKGZwID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBmb3IgKGogPSAwOyBqIDwgc2Vzc2lvbi0+aGlzdG9yeV9sZW47IGorKykKKyAgICAgICAgZnByaW50ZihmcCwiJXNcbiIsc2Vzc2lvbi0+aGlzdG9yeVtqXSk7CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogTG9hZCB0aGUgaGlzdG9yeSBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QKKyAqIHplcm8gaXMgcmV0dXJuZWQgYW5kIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCisgKgorICogSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCAwIGlzIHJldHVybmVkLCBvdGhlcndpc2UKKyAqIG9uIGVycm9yIC0xIGlzIHJldHVybmVkLiAqLworaW50IGxpbmVub2lzZUhpc3RvcnlMb2FkKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwiciIpOworICAgIGNoYXIgKmJ1ZjsKKworICAgIGlmIChmcCA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgYnVmID0gYmNtb3NfYWxsb2MoTElORU5PSVNFX01BWF9MSU5FKTsKKyAgICBpZiAoIWJ1ZikKKyAgICB7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aGlsZSAoZmdldHMoYnVmLExJTkVOT0lTRV9NQVhfTElORSxmcCkgIT0gTlVMTCkgeworICAgICAgICBjaGFyICpwOworCisgICAgICAgIHAgPSBzdHJjaHIoYnVmLCdccicpOworICAgICAgICBpZiAoIXApIHAgPSBzdHJjaHIoYnVmLCdcbicpOworICAgICAgICBpZiAocCkgKnAgPSAnXDAnOworICAgICAgICBsaW5lbm9pc2VIaXN0b3J5QWRkKHNlc3Npb24sIGJ1Zik7CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgYmNtb3NfZnJlZShidWYpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvbGluZW5vaXNlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL2xpbmVub2lzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODA0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL2xpbmVub2lzZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIGxpbmVub2lzZS5oIC0tIGd1ZXJyaWxsYSBsaW5lIGVkaXRpbmcgbGlicmFyeSBhZ2FpbnN0IHRoZSBpZGVhIHRoYXQgYQorICogbGluZSBlZGl0aW5nIGxpYiBuZWVkcyB0byBiZSAyMCwwMDAgbGluZXMgb2YgQyBjb2RlLgorICoKKyAqIFNlZSBsaW5lbm9pc2UuYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFNhbHZhdG9yZSBTYW5maWxpcHBvIDxhbnRpcmV6IGF0IGdtYWlsIGRvdCBjb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFBpZXRlciBOb29yZGh1aXMgPHBjbm9vcmRodWlzIGF0IGdtYWlsIGRvdCBjb20+CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAqICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAgKiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0xJTkVOT0lTRV9ICisjZGVmaW5lIF9fTElORU5PSVNFX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBsaW5lbm9pc2VTZXNzaW9uSU8KK3sKKyAgICBsb25nIGZkX2luOworICAgIGxvbmcgZmRfb3V0OworICAgIGludCAoKnJlYWRfY2hhcikobG9uZyBmZF9pbiwgY2hhciAqYyk7CisgICAgaW50ICgqd3JpdGUpKGxvbmcgZmRfb3V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworICAgIGludCBkdW1iX3Rlcm1pbmFsOyAvKiAxPWR1bWIgdGVybWluYWwuIGRvIG5vdCB1c2UgZXNjYXBlIHNlcXVlbmNlcyAqLworfSBsaW5lbm9pc2VTZXNzaW9uSU87CisKK3R5cGVkZWYgc3RydWN0IGxpbmVub2lzZVNlc3Npb24gbGluZW5vaXNlU2Vzc2lvbjsKKwordHlwZWRlZiBpbnQgKGxpbmVub2lzZUNvbXBsZXRpb25DYWxsYmFjaykobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqLCBpbnQgcG9zKTsKK2ludCBsaW5lbm9pc2VTZXNzaW9uT3Blbihjb25zdCBsaW5lbm9pc2VTZXNzaW9uSU8gKmlvLCB2b2lkICpzZXNzaW9uX2RhdGEsIGxpbmVub2lzZVNlc3Npb24gKipzZXNzaW9uKTsKK3ZvaWQgbGluZW5vaXNlU2Vzc2lvbkNsb3NlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pOwordm9pZCAqbGluZW5vaXNlU2Vzc2lvbkRhdGEobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7Cit2b2lkIGxpbmVub2lzZVNldENvbXBsZXRpb25DYWxsYmFjayhsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBsaW5lbm9pc2VDb21wbGV0aW9uQ2FsbGJhY2sgKik7Cit2b2lkIGxpbmVub2lzZVNldEJ1ZmZlcihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIGludCBwb3MpOworCitjaGFyICpsaW5lbm9pc2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqcHJvbXB0LCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK2ludCBsaW5lbm9pc2VIaXN0b3J5QWRkKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmxpbmUpOworaW50IGxpbmVub2lzZUhpc3RvcnlTZXRNYXhMZW4obGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IGxlbik7CitpbnQgbGluZW5vaXNlSGlzdG9yeVNhdmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworaW50IGxpbmVub2lzZUhpc3RvcnlMb2FkKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3ZvaWQgbGluZW5vaXNlQ2xlYXJTY3JlZW4obGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7Cit2b2lkIGxpbmVub2lzZVNldE11bHRpTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBpbnQgbWwpOwordm9pZCBsaW5lbm9pc2VTZXREdW1iVGVybWluYWwobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IGR1bWIpOworaW50IGxpbmVub2lzZUdldE11bHRpTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK2ludCBsaW5lbm9pc2VHZXREdW1iVGVybWluYWwobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7CitpbnQgbGluZW5vaXNlU2V0UmF3KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCByYXcpOworaW50IGxpbmVub2lzZUdldFJhdyhsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElORU5PSVNFX0ggKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZmU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAoraWZlcSAoIiQoT1MpIiwgInBvc2l4IikNCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikNCisgICAgTU9EX05BTUUgPSBiY21fcmVtb3RlX2NsaQ0KKyAgICBNT0RfVFlQRSA9IGxpYg0KKyAgICBNT0RfREVQUyA9IGNsaSBhcGlfY2xpDQorICAgIHNyY3MgPSBiY21vbHRfcmVtb3RlX2NsaS5jDQorICAgIFVTRV9MSU5UID0geWVzDQorZW5kaWYNCitlbmRpZg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaS9iY21vbHRfcmVtb3RlX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYTlkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaS9iY21vbHRfcmVtb3RlX2NsaS5jCkBAIC0wLDAgKzEsNTQzIEBACisvKg0KKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZA0KKw0KKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20NCisgICBBbGwgUmlnaHRzIFJlc2VydmVkDQorDQorVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQ0KK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQNCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDINCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwNCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOg0KKw0KKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUNCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQNCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyDQorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudA0KKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLg0KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMNCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucw0KKyAgIG9mIHRoZSBzb2Z0d2FyZS4NCisNCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUNCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQNCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcg0KK3dyaXR0ZW4gY29uc2VudC4NCisNCis6Pg0KKyAqLw0KKw0KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4NCisjaW5jbHVkZSA8YmNtdHJfaW50ZXJmYWNlLmg+DQorI2luY2x1ZGUgPGJjbXRyX2hlYWRlci5oPg0KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+DQorI2luY2x1ZGUgPGJjbV9hcGlfY2xpX2hlbHBlcnMuaD4NCisjaW5jbHVkZSA8YmNtdHJfZGVidWcuaD4NCisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4NCisjaW5jbHVkZSAiYmNtb2x0X3JlbW90ZV9jbGkuaCINCisjaWZkZWYgRU5BQkxFX0xPRw0KKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgUkVNT1RFX0NMSV9CVUZGRVJfTUFYIDY1NjM1IC8qIE1heCByZWFzc2VtYmxlZCBwYWNrZXQgcGx1cyBoZWFkZXIgKi8NCisjZGVmaW5lIFJFTU9URV9DTElfTUVTU0FHRV9RVUVVRV9ERVBUSCBCQ01PU19NU0dfUE9PTF9ERUZBVUxUX1NJWkUNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIFJFTU9URV9DTElfT1BDT0RFX0NMSV9DT01NQU5ELA0KKyAgICBSRU1PVEVfQ0xJX09QQ09ERV9JTkRJQ0FUSU9OLA0KKyAgICBSRU1PVEVfQ0xJX09QQ09ERV9QUk9YWV9SWA0KK30gcmVtb3RlX2NsaV9vcGNvZGU7DQorDQorLyogU3RhdGlzdGljcyAqLw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB1bnNpZ25lZCBsb25nIHJ4X3JlcXVlc3RzOw0KKyAgICB1bnNpZ25lZCBsb25nIHR4X3Jlc3BvbnNlczsNCisgICAgdW5zaWduZWQgbG9uZyBpbmRpY2F0aW9uczsNCisgICAgdW5zaWduZWQgbG9uZyBwcm94eV9yeHM7DQorICAgIHVuc2lnbmVkIGxvbmcgdW5wYWNrX2Vycm9yczsNCisgICAgdW5zaWduZWQgbG9uZyBwYWNrX2Vycm9yczsNCisgICAgdW5zaWduZWQgbG9uZyBjb3JyZWxhdGlvbl9lcnJvcnM7DQorICAgIHVuc2lnbmVkIGxvbmcgdHhfc29ja2V0X2Vycm9yczsNCisgICAgdW5zaWduZWQgbG9uZyByeF9zb2NrZXRfZXJyb3JzOw0KKyAgICB1bnNpZ25lZCBsb25nIG1lc3NhZ2VfZXJyb3JzOw0KK30gcmVtb3RlX2NsaV9zdGF0czsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgYmNtb3NfdGFzayBvdXRwdXRfdGFzazsNCisgICAgYmNtb3NfdGFzayBzb2NrZXRfdGFzazsNCisgICAgc3RydWN0IHNvY2thZGRyX2luIGNsaWVudDsNCisgICAgdWludDE2X3QgcG9ydDsNCisgICAgaW50IGNsaWVudF9zb2NrZXQ7DQorICAgIGJjbW9zX2Jvb2wgaXNfcnVubmluZzsNCisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7DQorICAgIGJjbW9zX2Jvb2wgb3V0cHV0X3BlbmRpbmc7DQorICAgIHVpbnQ4X3QgaW5wdXRfYnVmZmVyW1JFTU9URV9DTElfQlVGRkVSX01BWF07DQorICAgIGNoYXIgKmlucHV0X3N0cjsNCisgICAgdWludDhfdCBvdXRwdXRfYnVmZmVyW1JFTU9URV9DTElfQlVGRkVSX01BWF07DQorICAgIHVpbnQxNl90IG91dHB1dF9jdXJyZW50X2NoYXI7DQorICAgIGJjbW9zX211dGV4IG91dHB1dF9sb2NrOw0KKyAgICBpbnQgY3VycmVudF9jb3JyX3RhZzsNCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247DQorICAgIHJlbW90ZV9jbGlfc3RhdHMgc3RhdHM7DQorfSByZW1vdGVfY2xpX2NvbnRyb2xfYmxvY2s7DQorDQorc3RhdGljIHJlbW90ZV9jbGlfY29udHJvbF9ibG9jayByZW1vdGVfY2xpX2RhdGFbQkNNVFJfTUFYX09MVFNdOw0KKw0KK3N0YXRpYyBiY21vc19lcnJubyByZW1vdGVfY2xpX3N0YXRzX2NtZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQ0KK3sNCisgICAgaW50IGRldmljZSA9IChpbnQpcGFybVswXS52YWx1ZS5udW1iZXI7DQorDQorICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpDQorICAgIHsNCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOw0KKyAgICB9DQorDQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInJ4X3JlcXVlc3RzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucnhfcmVxdWVzdHMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9yZXNwb25zZXMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy50eF9yZXNwb25zZXMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJpbmRpY2F0aW9ucyIsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLmluZGljYXRpb25zKTsNCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAicHJveHlfcnhzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucHJveHlfcnhzKTsNCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAidW5wYWNrX2Vycm9ycyIsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnVucGFja19lcnJvcnMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJwYWNrX2Vycm9ycyIsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzKTsNCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAidHhfc29ja2V0X2Vycm9ycyIsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X3NvY2tldF9lcnJvcnMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJyeF9zb2NrZXRfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucnhfc29ja2V0X2Vycm9ycyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgIm1lc3NhZ2VfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMubWVzc2FnZV9lcnJvcnMpOw0KKyAgICBtZW1zZXQoJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLCAwLCBzaXplb2YocmVtb3RlX2NsaV9zdGF0cykpOw0KKw0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsNCit9DQorDQorc3RhdGljIHZvaWQgc2VuZF9vdXRwdXRfcGFja2V0cyhiY21vbHRfZGV2aWQgZGV2aWNlLCByZW1vdGVfY2xpX29wY29kZSBvcGNvZGUsIHVpbnQxNl90IGNvcnJfdGFnKQ0KK3sNCisgICAgYmNtb2x0X2J1ZiBidWYgPSB7fTsNCisgICAgc3RhdGljIHVpbnQ4X3Qgc2NyYXRjaF9idWZmZXJbUkVNT1RFX0NMSV9CVUZGRVJfTUFYXTsNCisgICAgc3NpemVfdCBsZW47DQorICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOw0KKw0KKyAgICBpZiAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2N1cnJlbnRfY2hhciA9PSAwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIFJFTU9URV9DTElfQlVGRkVSX01BWCwgc2NyYXRjaF9idWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsNCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KCZidWYsICh1aW50OF90KW9wY29kZSk7DQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoJmJ1ZiwgY29ycl90YWcpOw0KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGUoDQorICAgICAgICAmYnVmLA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2J1ZmZlciwNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9jdXJyZW50X2NoYXIpOw0KKw0KKyAgICBpZiAoIW9rKQ0KKyAgICB7DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorDQorICAgIC8qIFNlbmQgdG8gY2xpZW50ICovDQorICAgIGxlbiA9IHNlbmR0bygNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsDQorICAgICAgICBidWYuc3RhcnQsDQorICAgICAgICBiY21vbHRfYnVmX2dldF91c2VkKCZidWYpLA0KKyAgICAgICAgMCwNCisgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50LA0KKyAgICAgICAgc2l6ZW9mKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudCkpOw0KKw0KKyAgICBpZiAobGVuIDw9IDApDQorICAgIHsNCisgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMudHhfc29ja2V0X2Vycm9yczsNCisgICAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NsaV9pbnB1dChiY21vbHRfZGV2aWQgZGV2aWNlKQ0KK3sNCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2spOw0KKyAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfY3VycmVudF9jaGFyID0gMDsNCisgICAgbWVtc2V0KHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9idWZmZXIsIDAsIHNpemVvZihyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfYnVmZmVyKSk7DQorICAgIGJjbWNsaV9wYXJzZShyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zZXNzaW9uLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pbnB1dF9zdHIpOw0KKyAgICBiY21vc19tdXRleF91bmxvY2soJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9sb2NrKTsNCit9DQorDQorc3RhdGljIGludCByZW1vdGVfY2xpX3Nlc3Npb25fd3JpdGVfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkNCit7DQorICAgIGludCBpOw0KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKigoYmNtb2x0X2RldmlkICopYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KHNlc3Npb24pKTsNCisNCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2spOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKQ0KKyAgICB7DQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfYnVmZmVyW3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9jdXJyZW50X2NoYXJdID0gYnVmW2ldOw0KKyAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfY3VycmVudF9jaGFyOw0KKyAgICB9DQorICAgIGJjbW9zX211dGV4X3VubG9jaygmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2spOw0KKw0KKyAgICByZXR1cm4gc2l6ZTsNCit9DQorDQorc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9jbGlfb3Blbl9zZXNzaW9uKGJjbW9sdF9kZXZpZCBkZXZpY2UpDQorew0KKyAgICBiY21vc19lcnJubyByYzsNCisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBzZXNzX3Bhcm0gPSB7fTsNCisgICAgc2Vzc19wYXJtLmFjY2Vzc19yaWdodCA9IEJDTUNMSV9BQ0NFU1NfREVCVUc7DQorICAgIHNlc3NfcGFybS53cml0ZSA9IHJlbW90ZV9jbGlfc2Vzc2lvbl93cml0ZV9jYjsNCisgICAgc2Vzc19wYXJtLnVzZXJfcHJpdiA9IGJjbW9zX2NhbGxvYyhzaXplb2YoZGV2aWNlKSk7DQorICAgIHNlc3NfcGFybS5saW5lX2VkaXRfbW9kZSA9IEJDTUNMSV9MSU5FX0VESVRfRElTQUJMRTsNCisgICAgQlVHX09OKHNlc3NfcGFybS51c2VyX3ByaXYgPT0gTlVMTCk7DQorICAgICooKGJjbW9sdF9kZXZpZCAqKXNlc3NfcGFybS51c2VyX3ByaXYpID0gZGV2aWNlOw0KKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3NfcGFybSwgJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNlc3Npb24pOw0KKw0KKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykNCisgICAgew0KKyAgICAgICAgcGVycm9yKCJDYW4ndCBvcGVuIHNlc3Npb24iKTsNCisjaWZkZWYgRU5BQkxFX0xPRw0KKyAgICAgICAgQkNNX0xPRygNCisgICAgICAgICAgICBFUlJPUiwNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5sb2dfaWQsDQorICAgICAgICAgICAgIkNhbid0IG9wZW4gc2Vzc2lvblxuIik7DQorI2VuZGlmDQorICAgICAgICBzaHV0ZG93bihyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0LCBTSFVUX1JEV1IpOw0KKyAgICB9DQorICAgIHJldHVybiByYzsNCit9DQorDQorc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9jbGlfb3Blbl9zb2NrZXQoYmNtb2x0X2RldmlkIGRldmljZSkNCit7DQorICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYSA9IHt9Ow0KKyAgICAvKiBTdGFydCBsaXN0ZW5pbmcgb24gcG9ydCAqLw0KKyAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOw0KKyAgICBpZiAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCA8IDApDQorICAgIHsNCisgICAgICAgIHBlcnJvcigiQ2FuJ3QgY3JlYXRlIHNvY2tldCIpOw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKA0KKyAgICAgICAgICAgIEVSUk9SLA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICAgICAiQ2FuJ3QgY3JlYXRlIHNvY2tldFxuIik7DQorI2VuZGlmDQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsNCisgICAgfQ0KKw0KKyAgICAvKiBCaW5kIGxvY2FsICovDQorICAgIHNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOw0KKyAgICBzYS5zaW5fcG9ydCA9IChpbl9wb3J0X3QpaHRvbnMocmVtb3RlX2NsaV9kYXRhW2RldmljZV0ucG9ydCk7DQorICAgIHNhLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7DQorICAgIGlmIChiaW5kKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgc2l6ZW9mKHNhKSkgPT0gLTEpDQorICAgIHsNCisgICAgICAgIHBlcnJvcigiQ2FuJ3QgYmluZCB0byBzb2NrZXQiKTsNCisjaWZkZWYgRU5BQkxFX0xPRw0KKyAgICAgICAgQkNNX0xPRygNCisgICAgICAgICAgICBFUlJPUiwNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5sb2dfaWQsDQorICAgICAgICAgICAgIkNhbid0IGJpbmQgc29ja2V0IHRvIHBvcnQgJXVcbiIsDQorICAgICAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ucG9ydCk7DQorI2VuZGlmDQorICAgICAgICBzaHV0ZG93bihyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0LCBTSFVUX1JEV1IpOw0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7DQorICAgIH0NCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHJlbW90ZV9jbGlfaW5kaWNhdGlvbl9jYihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm1zZykNCit7DQorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKShtb2R1bGVfaWQgLSBCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwKTsNCisgICAgYmNtb2x0X21zZyAqaW5kID0gbXNnLT5kYXRhOw0KKw0KKyAgICBiY21vc19tdXRleF9sb2NrKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jayk7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9jdXJyZW50X2NoYXIgPSAwOw0KKyAgICBtZW1zZXQocmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2J1ZmZlciwgMCwgc2l6ZW9mKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9idWZmZXIpKTsNCisNCisgICAgYXBpY2xpX21zZ19kdW1wKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNlc3Npb24sIGluZCk7DQorICAgIGlmIChpbmQtPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQVVUTykNCisgICAgew0KKyAgICAgICAgc2VuZF9vdXRwdXRfcGFja2V0cyhkZXZpY2UsIFJFTU9URV9DTElfT1BDT0RFX0lORElDQVRJT04sIGluZC0+Y29ycl90YWcpOw0KKyAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5pbmRpY2F0aW9uczsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChpbmQtPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgpDQorICAgIHsNCisgICAgICAgIHNlbmRfb3V0cHV0X3BhY2tldHMoZGV2aWNlLCBSRU1PVEVfQ0xJX09QQ09ERV9QUk9YWV9SWCwgaW5kLT5jb3JyX3RhZyk7DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnByb3h5X3J4czsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisjaWZkZWYgRU5BQkxFX0xPRw0KKyAgICAgICAgQkNNX0xPRygNCisgICAgICAgICAgICBFUlJPUiwNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5sb2dfaWQsDQorICAgICAgICAgICAgIlVua25vd24gZ3JvdXAgdHlwZSAldVxuIiwNCisgICAgICAgICAgICBpbmQtPmdyb3VwKTsNCisjZW5kaWYNCisgICAgfQ0KKyAgICBiY21vc19tdXRleF91bmxvY2soJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9sb2NrKTsNCisNCisgICAgYmNtb2x0X21zZ19mcmVlKGluZCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHJlbW90ZV9jbGlfb3V0cHV0X2NiKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnKQ0KK3sNCisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpKG1vZHVsZV9pZCAtIEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjApOw0KKyAgICBwcm9jZXNzX2NsaV9pbnB1dChkZXZpY2UpOw0KKyAgICBzZW5kX291dHB1dF9wYWNrZXRzKGRldmljZSwgUkVNT1RFX0NMSV9PUENPREVfQ0xJX0NPTU1BTkQsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmN1cnJlbnRfY29ycl90YWcpOw0KKyAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfcGVuZGluZyA9IEJDTU9TX0ZBTFNFOw0KKyAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X3Jlc3BvbnNlczsNCit9DQorDQorc3RhdGljIGludCByZW1vdGVfY2xpX3NvY2tldF90YXNrKGxvbmcgZGF0YSkNCit7DQorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7DQorICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZW5kZXI7DQorICAgIHNvY2tsZW5fdCBzZW5kc2l6ZSA9IHNpemVvZihzZW5kZXIpOw0KKyAgICBiY21vbHRfYnVmIGJ1ZjsNCisgICAgc3NpemVfdCBsZW47DQorICAgIHVpbnQ4X3Qgb3Bjb2RlID0gMDsNCisgICAgdWludDE2X3QgY29ycl90YWcgPSAwOw0KKyAgICBiY21vc19ib29sIG9rID0gQkNNT1NfVFJVRTsNCisgICAgYmNtb3NfbXNnIG91dHB1dF9tc2cgPSB7IC5oYW5kbGVyID0gcmVtb3RlX2NsaV9vdXRwdXRfY2IgfTsNCisgICAgYmNtb3NfZXJybm8gcmM7DQorDQorICAgIHJjID0gcmVtb3RlX2NsaV9vcGVuX3NvY2tldChkZXZpY2UpOw0KKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMgIT0gQkNNX0VSUl9PSywgcmMsIC0xKTsNCisgICAgcmMgPSByZW1vdGVfY2xpX29wZW5fc2Vzc2lvbihkZXZpY2UpOw0KKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMgIT0gQkNNX0VSUl9PSywgcmMsIC0xKTsNCisNCisgICAgd2hpbGUgKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlzX3J1bm5pbmcpDQorICAgIHsNCisgICAgICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfcGVuZGluZykNCisgICAgICAgIHsNCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMCk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorDQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jdXJyZW50X2NvcnJfdGFnID0gLTE7DQorICAgICAgICBtZW1zZXQocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfYnVmZmVyLCAwLCBzaXplb2YocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfYnVmZmVyKSk7DQorDQorICAgICAgICBtZW1zZXQoJnNlbmRlciwgMCwgc2l6ZW9mKHNlbmRlcikpOw0KKyAgICAgICAgbGVuID0gcmVjdmZyb20oDQorICAgICAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCwNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pbnB1dF9idWZmZXIsDQorICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X2J1ZmZlciksDQorICAgICAgICAgICAgMCwNCisgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnNlbmRlciwNCisgICAgICAgICAgICAmc2VuZHNpemUpOw0KKyAgICAgICAgaWYgKGxlbiA8IDApDQorICAgICAgICB7DQorICAgICAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwMDApOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5yeF9yZXF1ZXN0czsNCisNCisgICAgICAgIGlmICgocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50LnNpbl9hZGRyLnNfYWRkciAhPSBzZW5kZXIuc2luX2FkZHIuc19hZGRyKSB8fA0KKyAgICAgICAgICAgIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnQuc2luX3BvcnQgIT0gc2VuZGVyLnNpbl9wb3J0KSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnQgPSBzZW5kZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAvKiBVbnBhY2sgcmVjZWl2ZWQgbWVzc2FnZSAqLw0KKyAgICAgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsICh1aW50MzJfdClsZW4sIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X2J1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOw0KKyAgICAgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTgoJmJ1ZiwgJm9wY29kZSk7DQorICAgICAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoJmJ1ZiwgJmNvcnJfdGFnKTsNCisNCisgICAgICAgIGlmICghb2spDQorICAgICAgICB7DQorICAgICAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy51bnBhY2tfZXJyb3JzOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKChyZW1vdGVfY2xpX29wY29kZSlvcGNvZGUgIT0gUkVNT1RFX0NMSV9PUENPREVfQ0xJX0NPTU1BTkQpDQorICAgICAgICB7DQorICAgICAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy51bnBhY2tfZXJyb3JzOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jdXJyZW50X2NvcnJfdGFnICE9IGNvcnJfdGFnKSAmJiAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY3VycmVudF9jb3JyX3RhZyA+PSAwKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLmNvcnJlbGF0aW9uX2Vycm9yczsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X3N0ciA9IChjaGFyICopYmNtb2x0X2J1Zl9zbmFwX2dldCgmYnVmKTsNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X3N0cltiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZSgmYnVmKV0gPSAnXDAnOw0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY3VycmVudF9jb3JyX3RhZyA9IGNvcnJfdGFnOw0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X3BlbmRpbmcgPSBCQ01PU19UUlVFOw0KKyAgICAgICAgcmMgPSBiY21vc19tc2dfc2VuZF90b19tb2R1bGUoDQorICAgICAgICAgICAgYmNtb3NfbW9kdWxlX2lkX2Zvcl9kZXZpY2UoQkNNT1NfTU9EVUxFX0lEX1JFTU9URV9DTElfREVWMCwgZGV2aWNlKSwNCisgICAgICAgICAgICAmb3V0cHV0X21zZywNCisgICAgICAgICAgICBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOw0KKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spDQorICAgICAgICB7DQorICAgICAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5tZXNzYWdlX2Vycm9yczsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBiY21vc19mcmVlKGJjbWNsaV9zZXNzaW9uX3VzZXJfcHJpdihyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zZXNzaW9uKSk7DQorICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNlc3Npb24pOw0KKyAgICBzaHV0ZG93bihyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0LCBTSFVUX1JEV1IpOw0KKyAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zb2NrZXRfdGFzay5kZXN0cm95ZWQgPSBCQ01PU19UUlVFOw0KKyAgICByZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9jbGlfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgcmVtb3RlX2NsaV9wb3J0KQ0KK3sNCisgICAgYmNtb3NfZXJybm8gcmM7DQorICAgIGJjbW9zX3Rhc2tfcGFybSBvdXRwdXRfdGFza19wYXJhbXMgPQ0KKyAgICB7DQorICAgICAgICAubmFtZSA9ICJyZW1vdGVfY2xpX2luZGljYXRpb24iLA0KKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUkVNT1RFX0NMSQ0KKyAgICB9Ow0KKw0KKyAgICBiY21vc190YXNrX3Bhcm0gc29ja2V0X3Rhc2tfcGFyYW1zID0NCisgICAgew0KKyAgICAgICAgLm5hbWUgPSAicmVtb3RlX2NsaV9tYWluIiwNCisgICAgICAgIC5oYW5kbGVyID0gcmVtb3RlX2NsaV9zb2NrZXRfdGFzaywNCisgICAgICAgIC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfVFJBTlNQT1JUX1JFTU9URV9DTEksDQorICAgICAgICAuZGF0YSA9IChsb25nKWRldmljZQ0KKyAgICB9Ow0KKw0KKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0NCisgICAgew0KKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9ICJyZW1vdGVfY2xpIiwgLnNpemUgPSBSRU1PVEVfQ0xJX01FU1NBR0VfUVVFVUVfREVQVEggfQ0KKyAgICB9Ow0KKw0KKyAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5wb3J0ID0gcmVtb3RlX2NsaV9wb3J0Ow0KKyAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jdXJyZW50X2NvcnJfdGFnID0gLTE7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlzX3J1bm5pbmcgPSBCQ01PU19UUlVFOw0KKw0KKyAgICAvKiBDcmVhdGUgdGhyZWFkIGxpc3RlbmluZyBmb3IgaW5jb21pbmcgQVBJcyAqLw0KKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zb2NrZXRfdGFzaywgJnNvY2tldF90YXNrX3BhcmFtcyk7DQorICAgIEJVR19PTihCQ01fRVJSX09LICE9IHJjKTsNCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X3Rhc2ssICZvdXRwdXRfdGFza19wYXJhbXMpOw0KKyAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSByYyk7DQorICAgIGJjbW9zX211dGV4X2NyZWF0ZSgmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2ssIDAsICJyZW1vdGVfY2xpIik7DQorDQorICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZSgNCisgICAgICAgIGJjbW9zX21vZHVsZV9pZF9mb3JfZGV2aWNlKEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjAsIGRldmljZSksDQorICAgICAgICAmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X3Rhc2ssDQorICAgICAgICAmbW9kdWxlX3BhcmFtcyk7DQorICAgIEJVR19PTihCQ01fRVJSX09LICE9IHJjKTsNCisNCisjaWZkZWYgRU5BQkxFX0xPRw0KKyAgICBCQ01fTE9HKA0KKyAgICAgICAgSU5GTywNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICJCQ002ODYyMCByZW1vdGUgY2xpIGZvciBkZXZpY2UgJWQgaXMgbGlzdGVuaW5nIG9uIHBvcnQgJXVcbiIsDQorICAgICAgICAoaW50KWRldmljZSwNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnBvcnQpOw0KKyNlbmRpZg0KKw0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsNCit9DQorDQorLyogQXV0byAvIHByb3h5IG1lc3NhZ2UgaGFuZGxlciAqLw0KK3ZvaWQgYmNtb2x0X3JlbW90ZV9jbGlfYXV0b19yeF9jYihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpDQorew0KKyAgICBiY21vc19lcnJubyBlcnI7DQorICAgIGJjbW9sdF9tc2cgKmluZF9jbG9uZSA9IE5VTEw7DQorDQorICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpDQorICAgIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBpZiAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaXNfcnVubmluZykNCisgICAgew0KKyAgICAgICAgZXJyID0gYmNtb2x0X21zZ19jbG9uZSgmaW5kX2Nsb25lLCBtc2cpOw0KKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQ0KKyAgICAgICAgew0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ubG9nX2lkLCAiSW5kaWNhdGlvbiBjbG9uZSBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsNCisjZW5kaWYNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorDQorICAgICAgICBpbmRfY2xvbmUtPm9zX21zZy5oYW5kbGVyID0gcmVtb3RlX2NsaV9pbmRpY2F0aW9uX2NiOw0KKyAgICAgICAgaW5kX2Nsb25lLT5vc19tc2cuZGF0YSA9IGluZF9jbG9uZTsNCisgICAgICAgIGVyciA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZSgNCisgICAgICAgICAgICBiY21vc19tb2R1bGVfaWRfZm9yX2RldmljZShCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwLCBkZXZpY2UpLA0KKyAgICAgICAgICAgICZpbmRfY2xvbmUtPm9zX21zZywNCisgICAgICAgICAgICAwKTsNCisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLm1lc3NhZ2VfZXJyb3JzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KKw0KK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpyb290LCBiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCByZW1vdGVfY2xpX3BvcnQpDQorew0KKyAgICBiY21jbGlfZW50cnkgKmRpcjsNCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsNCisgICAgfQ0KKw0KKyAgICBpZiAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaXNfcnVubmluZykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsNCisgICAgfQ0KKw0KKyAgICBCQ01fTUVNWkVST19TVFJVQ1QoJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdKTsNCisNCisjaWZkZWYgRU5BQkxFX0xPRw0KKyAgICB7DQorICAgIGNoYXIgbG9nX2lkWzMyXTsNCisgICAgc25wcmludGYobG9nX2lkLCBzaXplb2YobG9nX2lkKSAtIDEsICJyZW1vdGVfY2xpXyVkIiwgKGludClkZXZpY2UpOw0KKyAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5sb2dfaWQgPQ0KKyAgICAgICAgYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX2lkLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsNCisgICAgfQ0KKyNlbHNlDQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCA9IERFVl9MT0dfSU5WQUxJRF9JRDsNCisjZW5kaWYNCisNCisgICAgZGlyID0gYmNtY2xpX2Rpcl9hZGQocm9vdCwgInJlbW90ZV9jbGkiLCAiUmVtb3RlIENMSSIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOw0KKyAgICBpZiAoIWRpcikNCisgICAgew0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5sb2dfaWQsICJDYW4ndCBjcmVhdGUgcmVtb3RlIENMSSBkaXJlY3RvcnlcbiIpOw0KKyNlbmRpZg0KKyAgICAgICAgQlVHKCk7DQorICAgIH0NCisNCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInN0YXQiLCAiUmVtb3RlIENMSSBzdGF0aXN0aWNzIiwgcmVtb3RlX2NsaV9zdGF0c19jbWQsDQorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKA0KKyAgICAgICAgICAgICJkZXZpY2UiLA0KKyAgICAgICAgICAgICJEZXZpY2UgaW5kZXgiLA0KKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX05VTUJFUiwNCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLA0KKyAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgQkNNVFJfTUFYX09MVFMgLSAxKSk7DQorDQorICAgIHJldHVybiByZW1vdGVfY2xpX3N0YXJ0KGRldmljZSwgcmVtb3RlX2NsaV9wb3J0KTsNCit9DQorDQordm9pZCBiY21vbHRfcmVtb3RlX2NsaV9zdG9wKHZvaWQpDQorew0KKyAgICBpbnQgaTsNCisgICAgYmNtb3NfYm9vbCB3YXNfcnVubmluZ1tCQ01UUl9NQVhfT0xUU10gPSB7fTsNCisNCisgICAgZm9yIChpID0gMDsgaSA8IEJDTVRSX01BWF9PTFRTOyBpKyspDQorICAgIHsNCisgICAgICAgIHdhc19ydW5uaW5nW2ldID0gcmVtb3RlX2NsaV9kYXRhW2ldLmlzX3J1bm5pbmc7DQorICAgICAgICBpZiAod2FzX3J1bm5pbmdbaV0pDQorICAgICAgICB7DQorICAgICAgICAgICAgc2h1dGRvd24ocmVtb3RlX2NsaV9kYXRhW2ldLmNsaWVudF9zb2NrZXQsIFNIVVRfUkRXUik7DQorICAgICAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2ldLmlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX09MVFM7IGkrKykNCisgICAgew0KKyAgICAgICAgaWYgKCF3YXNfcnVubmluZ1tpXSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlICghcmVtb3RlX2NsaV9kYXRhW2ldLnNvY2tldF90YXNrLmRlc3Ryb3llZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYmNtb3NfdGFza19kZXN0cm95KCZyZW1vdGVfY2xpX2RhdGFbaV0uc29ja2V0X3Rhc2spOw0KKyAgICAgICAgYmNtb3NfbW9kdWxlX2Rlc3Ryb3koYmNtb3NfbW9kdWxlX2lkX2Zvcl9kZXZpY2UoQkNNT1NfTU9EVUxFX0lEX1JFTU9URV9DTElfREVWMCwgKGJjbW9sdF9kZXZpZClpKSk7DQorICAgICAgICBiY21vc190YXNrX2Rlc3Ryb3koJnJlbW90ZV9jbGlfZGF0YVtpXS5vdXRwdXRfdGFzayk7DQorICAgICAgICBiY21vc19tdXRleF9kZXN0cm95KCZyZW1vdGVfY2xpX2RhdGFbaV0ub3V0cHV0X2xvY2spOw0KKyAgICB9DQorfQ0KKw0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaS9iY21vbHRfcmVtb3RlX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGE2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaS9iY21vbHRfcmVtb3RlX2NsaS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qDQorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkDQorDQorICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQ0KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQNCisNCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlDQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZA0KK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMg0KKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLA0KK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6DQorDQorICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQ0KKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZA0KKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXINCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50DQorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuDQorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcw0KKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zDQorICAgb2YgdGhlIHNvZnR3YXJlLg0KKw0KK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQ0KK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZA0KK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yDQord3JpdHRlbiBjb25zZW50Lg0KKw0KKzo+DQorICovDQorDQorI2lmbmRlZiBfQkNNT0xUX1JFTU9URV9DTElfSF8NCisjZGVmaW5lIF9CQ01PTFRfUkVNT1RFX0NMSV9IXw0KKw0KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4NCisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPg0KKw0KK3ZvaWQgYmNtb2x0X3JlbW90ZV9jbGlfYXV0b19yeF9jYihiY21vbHRfZGV2aWQgb2x0LCBiY21vbHRfbXNnICptc2cpOw0KKw0KK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpyb290LCBiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCByZW1vdGVfY2xpX3BvcnQpOw0KKw0KK3ZvaWQgYmNtb2x0X3JlbW90ZV9jbGlfc3RvcCh2b2lkKTsNCisNCisjZW5kaWYNCisNCisNCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI3YjUwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjIENvbW1vbiBBUEkKKyMKK01PRF9OQU1FID0gdGltZV9tZWFzdXJlbWVudAorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gZGV2X2xvZworCitpZmVxICgiJChFTkFCTEVfTE9HKSIsICJ5IikKKyAgICBzcmNzID0gYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuYworZW5kaWYKKworVVNFX0xJTlQgPSB5ZXMKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L2JjbW9sdF90aW1lX21lYXN1cmVtZW50LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9iY21vbHRfdGltZV9tZWFzdXJlbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk2NjUwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9iY21vbHRfdGltZV9tZWFzdXJlbWVudC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisgCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSAiYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKKyAgICB1aW50MzJfdCBudW1fY3ljbGVzX2Zvcl9hdmVyYWdlOworICAgIEZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfdGlja3NfdG9fbnMgdGlja3NfdG9fbnM7CisgICAgRl9iY21vbHRfdGltZV9tZWFzdXJlbWVudF9hdmdfZG9uZSBhdmdfZG9uZTsKKyAgICB1aW50MzJfdCBjeWNsZV9udW07Cit9IGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2NvbnRleHQ7CisKK3N0YXRpYyBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9jb250ZXh0IHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dCA9IHsgREVWX0xPR19JTlZBTElEX0lELCAwLCBOVUxMLCBOVUxMLCAwIH07CisKK3ZvaWQgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfaW5pdCgKKyAgICBkZXZfbG9nX2lkIGxvZ19pZCwKKyAgICB1aW50MzJfdCBudW1fY3ljbGVzX2Zvcl9hdmVyYWdlLAorICAgIEZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfdGlja3NfdG9fbnMgdGlja3NfdG9fbnMsCisgICAgRl9iY21vbHRfdGltZV9tZWFzdXJlbWVudF9hdmdfZG9uZSBhdmdfZG9uZSkKK3sKKyAgICB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQgPSAoYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfY29udGV4dCkKKyAgICAgICAgeyBsb2dfaWQsIG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2UsIHRpY2tzX3RvX25zLCBhdmdfZG9uZSwgMCB9OworfQorCit2b2lkIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X3NhbXBsZV9lbmQodWludDY0X3QgKnRvdGFsX3RpY2tzLCB1aW50MzJfdCAqbnVtX29mX3NhbXBsZXMsIGNvbnN0IGNoYXIgKm1lYXN1cmVtZW50X25hbWUpCit7CisgICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgaGF2ZW4ndCBydW4gZW5vdWdoIGN5Y2xlcyB0byBwcm9kdWNlIGFuIGF2ZXJhZ2UuICovCisgICAgaWYgKHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5jeWNsZV9udW0gPCAodGltZV9tZWFzdXJlbWVudF9jb250ZXh0Lm51bV9jeWNsZXNfZm9yX2F2ZXJhZ2UgLSAxKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKm51bV9vZl9zYW1wbGVzICE9IDAgJiYgdGltZV9tZWFzdXJlbWVudF9jb250ZXh0LnRpY2tzX3RvX25zICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBDb252ZXJ0IHRoZSBzYW1wbGUgdGltZSBmcm9tIHRpY2tzIHRvIG5zLiAqLworICAgICAgICB1aW50NjRfdCBkdXJhdGlvbl9hdmVyYWdlX25zID0gdGltZV9tZWFzdXJlbWVudF9jb250ZXh0LnRpY2tzX3RvX25zKCp0b3RhbF90aWNrcyAvICpudW1fb2Zfc2FtcGxlcyk7CisKKyAgICAgICAgLyogVGhlICI6IiBpcyB1c2VkIGFzIGRlbGltaXRlciB3aGVuIGltcG9ydGluZyB0byBleGNlbC4gKi8KKyAgICAgICAgQkNNX0xPRygKKyAgICAgICAgICAgIERFQlVHLAorICAgICAgICAgICAgdGltZV9tZWFzdXJlbWVudF9jb250ZXh0LmxvZ19pZCwKKyAgICAgICAgICAgICI6JXM6ICVsbHUuJTAzbGx1IHVzICgldSBoaXRzKVxuIiwKKyAgICAgICAgICAgIG1lYXN1cmVtZW50X25hbWUsCisgICAgICAgICAgICAobG9uZyBsb25nIHVuc2lnbmVkIGludCkoZHVyYXRpb25fYXZlcmFnZV9ucyAvIDEwMDApLAorICAgICAgICAgICAgKGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQpKGR1cmF0aW9uX2F2ZXJhZ2VfbnMgJSAxMDAwKSwKKyAgICAgICAgICAgICpudW1fb2Zfc2FtcGxlcyk7CisgICAgfQorCisgICAgKnRvdGFsX3RpY2tzID0gMDsKKyAgICAqbnVtX29mX3NhbXBsZXMgPSAwOworfQorCit2b2lkIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2N5Y2xlX2VuZCh2b2lkKQoreworICAgIGlmICh0aW1lX21lYXN1cmVtZW50X2NvbnRleHQuY3ljbGVfbnVtID09ICh0aW1lX21lYXN1cmVtZW50X2NvbnRleHQubnVtX2N5Y2xlc19mb3JfYXZlcmFnZSAtIDEpKQorICAgIHsKKyAgICAgICAgaWYgKHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5hdmdfZG9uZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQuYXZnX2RvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFByaW50IGEgZGVsaW1pdGluZyBsaW5lLiAqLworICAgICAgICBCQ01fTE9HKERFQlVHLCB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQubG9nX2lkLCAiXG4iKTsKKyAgICAgICAgdGltZV9tZWFzdXJlbWVudF9jb250ZXh0LmN5Y2xlX251bSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICsrdGltZV9tZWFzdXJlbWVudF9jb250ZXh0LmN5Y2xlX251bTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9iY21vbHRfdGltZV9tZWFzdXJlbWVudC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3RpbWVfbWVhc3VyZW1lbnQvYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYjQxYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3RpbWVfbWVhc3VyZW1lbnQvYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpwcm9wcmlldGFyeTpzdGFuZGFyZAorIAorICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisgCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorIAorMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisgCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgX0JDTU9MVF9USU1FX01FQVNVUkVNRU5UX0hfCisjZGVmaW5lIF9CQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9IXworCisjaW5jbHVkZSA8YmNtb3NfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyogSG93IHRvIHVzZSB0aGUgdGltZSBtZWFzdXJlbWVudCBsaWJyYXJ5OgorICogCisgKiBCZWZvcmUgaW5jbHVkaW5nIGJjbW9sdF90aW1lX21lYXN1cmVtZW50LmgsIHlvdSBtdXN0IGRlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9USU1FU1RBTVAuICBUaGlzIG1hY3JvIG11c3QgYmUKKyAqIGRlZmluZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoaXMgaXMgbGVnYWw6ICJ1aW50MzJfdCB0aW1lc3RhbXBfaW5fdGlja3MgPSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9USU1FU1RBTVAoKSIuICBXZQorICogdXNlIGEgbWFjcm8gaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIG9wdGltaXplIGZvciB0aW1lICh3ZSB3YW50IHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBhIGZ1bmN0aW9uIGNhbGwpLgorICoKKyAqIFlvdSBjYW4gaGF2ZSBhcyBtYW55IG5hbWVkIG1lYXN1cmVtZW50IGNhdGVnb3JpZXMgYXMgZGVzaXJlZC4gIEZvciBlYWNoIGNhdGVnb3J5LCB5b3UgbmVlZCB0byBjYWxsIGVpdGhlcjoKKyAqIC0gQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfU0FNUExFX0RFQ0xfU1RBVElDKCkgLSBpZiB0aGUgbWVhc3VyZW1lbnRzIGFyZSBhbGwgdGFrZW4gaW4gdGhlIHNhbWUgZmlsZQorICogb3I6CisgKiAtIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMKCkgKyBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9TQU1QTEVfREVDTF9FWFRFUk4oKQorICoKKyAqIEF0IGluaXQgdGltZSwgeW91IG11c3QgY2FsbCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9pbml0KCkuCisgKgorICogRm9yIHRoZSBhY3R1YWwgbWVhc3VyZW1lbnRzLCB5b3UgbXVzdCBzdXJyb3VuZCB0aGUgY29kZSB5b3UncmUgdHJ5aW5nIHRvIG1lYXN1cmUgd2l0aCAKKyAqIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19TQU1QTEVfQkVGT1JFKCkgYW5kIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19TQU1QTEVfQUZURVIoKS4gIEF0IHRoZSBlbmQgb2YgYSBmdWxsCisgKiBtZWFzdXJlbWVudCBjeWNsZSwgeW91IG11c3QgY2FsbCBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfU0FNUExFX0VORCgpIGZvciBlYWNoIG5hbWVkIG1lYXN1cmVtZW50IGNhdGVnb3J5LCB0aGVuCisgKiBmaW5hbGx5IGNhbGwgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX0NZQ0xFX0VORCgpLgorICovCisKK3R5cGVkZWYgdWludDY0X3QgKCpGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X3RpY2tzX3RvX25zKSh1aW50NjRfdCB0aWNrcyk7Cit0eXBlZGVmIHZvaWQgKCpGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X2F2Z19kb25lKSh2b2lkKTsKKworLyoqIENhbGxlZCBmb3IgZWFjaCBtZWFzdXJlbWVudCBjYXRlZ29yeSBhdCBjb21waWxlIHRpbWUgKHNlZSBob3ctdG8gYXQgdG9wIG9mIGZpbGUpLiAqLworI2RlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9TQU1QTEVfREVDTF9TVEFUSUMobWVhc3VyZW1lbnRfbmFtZSkgXAorICAgIHN0YXRpYyB1aW50MzJfdCBtZWFzdXJlbWVudF9uYW1lICMjIF9zdGFydF90aWNrOyBcCisgICAgc3RhdGljIHVpbnQ2NF90IG1lYXN1cmVtZW50X25hbWUgIyMgX3RvdGFsX3RpY2tzOyBcCisgICAgc3RhdGljIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX251bV9vZl9zYW1wbGVzOworCisvKiogQ2FsbGVkIGZvciBlYWNoIG1lYXN1cmVtZW50IGNhdGVnb3J5IGF0IGNvbXBpbGUgdGltZSAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMKG1lYXN1cmVtZW50X25hbWUpIFwKKyAgICB1aW50MzJfdCBtZWFzdXJlbWVudF9uYW1lICMjIF9zdGFydF90aWNrOyBcCisgICAgdWludDY0X3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3M7IFwKKyAgICB1aW50MzJfdCBtZWFzdXJlbWVudF9uYW1lICMjIF9udW1fb2Zfc2FtcGxlczsKKworLyoqIENhbGxlZCBmb3IgZWFjaCBtZWFzdXJlbWVudCBjYXRlZ29yeSBhdCBjb21waWxlIHRpbWUgKHNlZSBob3ctdG8gYXQgdG9wIG9mIGZpbGUpLiAqLworI2RlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9TQU1QTEVfREVDTF9FWFRFUk4obWVhc3VyZW1lbnRfbmFtZSkgXAorICAgIGV4dGVybiB1aW50MzJfdCBtZWFzdXJlbWVudF9uYW1lICMjIF9zdGFydF90aWNrOyBcCisgICAgZXh0ZXJuIHVpbnQ2NF90IG1lYXN1cmVtZW50X25hbWUgIyMgX3RvdGFsX3RpY2tzOyBcCisgICAgZXh0ZXJuIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX251bV9vZl9zYW1wbGVzOworCisvKiogQ2FsbGVkIGJlZm9yZSBlYWNoIGJsb2NrIG9mIGNvZGUgdGhhdCBuZWVkcyB0byBiZSB0aW1lZCAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19TQU1QTEVfQkVGT1JFKG1lYXN1cmVtZW50X25hbWUpIFwKKyAgICBkbyBcCisgICAgeyBcCisgICAgICAgIG1lYXN1cmVtZW50X25hbWUgIyMgX3N0YXJ0X3RpY2sgPSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9USU1FU1RBTVAoKTsgXAorICAgIH0gXAorICAgIHdoaWxlICgwKQorCisvKiogQ2FsbGVkIGFmdGVyIGVhY2ggYmxvY2sgb2YgY29kZSB0aGF0IG5lZWRzIHRvIGJlIHRpbWVkIChzZWUgaG93LXRvIGF0IHRvcCBvZiBmaWxlKS4gKi8KKyNkZWZpbmUgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9BRlRFUihtZWFzdXJlbWVudF9uYW1lKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICAvKiBFdmVuIGlmIHRpbWVzdGFtcCBvdmVyZmxvd3Mgd2UgYXJlIHN0aWxsIG9rIC0gdW5zaWduZWQgYXJpdGhtZXRpYyB3aWxsIHN0aWxsIGJlIHZhbGlkLiAqLyBcCisgICAgICAgIG1lYXN1cmVtZW50X25hbWUgIyMgX3RvdGFsX3RpY2tzICs9IEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1RJTUVTVEFNUCgpIC0gbWVhc3VyZW1lbnRfbmFtZSAjIyBfc3RhcnRfdGljazsgXAorICAgICAgICArK21lYXN1cmVtZW50X25hbWUgIyMgX251bV9vZl9zYW1wbGVzOyBcCisgICAgfSBcCisgICAgd2hpbGUgKDApCisKKy8qKiBDYWxsZWQgZm9yIGVhY2ggbWVhc3VyZW1lbnQgY2F0ZWdvcnkgYXQgdGhlIGVuZCBvZiBhIGN5Y2xlIChzZWUgaG93LXRvIGF0IHRvcCBvZiBmaWxlKS4gKi8KKyNkZWZpbmUgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9FTkQobWVhc3VyZW1lbnRfbmFtZSkgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfc2FtcGxlX2VuZCggXAorICAgICAgICAgICAgJm1lYXN1cmVtZW50X25hbWUgIyMgX3RvdGFsX3RpY2tzLCBcCisgICAgICAgICAgICAmbWVhc3VyZW1lbnRfbmFtZSAjIyBfbnVtX29mX3NhbXBsZXMsIFwKKyAgICAgICAgICAgICMgbWVhc3VyZW1lbnRfbmFtZSk7IFwKKyAgICB9IFwKKyAgICB3aGlsZSAoMCkKKworLyoqIENhbGxlZCB3aGVuIHRoZSBlbnRpcmUgbWVhc3VyZW1lbnQgY3ljbGUgaXMgY29tcGxldGUgKHNlZSBob3ctdG8gYXQgdG9wIG9mIGZpbGUpLiAqLworI2RlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfQ1lDTEVfRU5EKCkgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfY3ljbGVfZW5kKCkKKworLyoqIE11c3QgYmUgY2FsbGVkIGF0IGluaXQgdGltZSB0byBpbml0aWFsaXplIHRoZSB0aW1lIG1lYXN1cmVtZW50IGxpYnJhcnkuCisgKiBccGFyYW0gbG9nX2lkICAgICAgICAgICAgICAgICBMb2cgSUQgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGRhdGEgKHdpbGwgdXNlICdERUJVRycgbG9nIGxldmVsKS4KKyAqIFxwYXJhbSBudW1fY3ljbGVzX2Zvcl9hdmVyYWdlIE51bWJlciBvZiBtZWFzdXJlbWVudCBjeWNsZXMgdG8gcnVuIGJlZm9yZSBjYWxjdWxhdGluZyBhbmQgbG9nZ2luZyBhdmVyYWdlcy4KKyAqIFxwYXJhbSB0aWNrc190b19ucyAgICAgICAgICAgIEZ1bmN0aW9uIHRoYXQgdHJhbnNsYXRlcyB0aW1lc3RhbXAgcmVzb2x1dGlvbiAodGlja3MpIGludG8gbmFub3NlY29uZHMuCisgKiBccGFyYW0gYXZnX2RvbmUgICAgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxsIGFmdGVyIGF2ZXJhZ2VzIGhhdmUgYmVlbiBjb21wdXRlZCAoZS5nLiB0byBsb2cgYSBjdXN0b20gaGVhZGVyKS4KKyAqLwordm9pZCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9pbml0KAorICAgIGRldl9sb2dfaWQgbG9nX2lkLAorICAgIHVpbnQzMl90IG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2UsCisgICAgRl9iY21vbHRfdGltZV9tZWFzdXJlbWVudF90aWNrc190b19ucyB0aWNrc190b19ucywKKyAgICBGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X2F2Z19kb25lIGF2Z19kb25lKTsKKworLyoqIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkgLSBjYWxsIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19TQU1QTEVfRU5EKCkgaW5zdGVhZC4gKi8KK3ZvaWQgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfc2FtcGxlX2VuZCh1aW50NjRfdCAqdG90YWxfdGlja3MsIHVpbnQzMl90ICpudW1fb2Zfc2FtcGxlcywgY29uc3QgY2hhciAqbWVhc3VyZW1lbnRfbmFtZSk7CisKKy8qKiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5IC0gY2FsbCBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfQ1lDTEVfRU5EKCkgaW5zdGVhZC4gKi8KK3ZvaWQgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfY3ljbGVfZW5kKHZvaWQpOworCisjZW5kaWYgLyogX0JDTU9MVF9USU1FX01FQVNVUkVNRU5UX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RmNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9NYWtlZmlsZQpAQCAtMCwwICsxLDI4IEBACitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKwlNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGwKKwlNT0RfVFlQRSA9IGFwcAorCU1PRF9ERVBTID0gaG9zdF9hcGkgYXBpX2Rldl9sb2cgYmNtX2JvYXJkIGJjbV91c2VyX2FwcGxfcHMgYmNtX3VzZXJfYXBwbF9lb24gYmNtX3VzZXJfYXBwbF9vbW9uIFwKKyAgICAgICAgICAgICAgICBiY21fdXNlcl9hcHBsX2Vwb25fb2FtIGJjbV91c2VyX2FwcGxfZXBvbl9vYW1fY2xpIHBjaWUgcGNpZV9tb2QgXAorICAgICAgICAgICAgICAgIGJjbV91c2VyX2FwcGxfZXBvbl9oZGUgYmNtX2FwaV9wcm94eSBjb21tb25fZXBvbl9vYW0gY29tbW9uX2dwb24gYmNtX2ltYWdlX3RyYW5zZmVyIGJjbV9zd191cGdyYWRlIFwKKyAgICAgICAgICAgICAgICBkZXZpY2Vfc2VsZWN0b3IgYmNtX3JlbW90ZV9jbGkgYmNtX3VzZXJfYXBwbF9wbGF5YmFjayBiY21fdXNlcl9hcHBsX2Rwb2Vfc2VjCisKK2lmbmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPQliY21fdXNlcl9hcHBsX2dwb25fc3RyZXNzIGJjbV91c2VyX2FwcGxfZ3Bvbl9kc19vbWNpIFwKKyAgICAgICAgICAgICAgICBiY21fdXNlcl9hcHBsX2dwb25fc25fYWNxdWlzaXRpb24gYmNtX3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3MgXAorICAgICAgICAgICAgICAgIGJjbV91c2VyX2FwcGxfZ3Bvbl9tYWNfbGVhcm5pbmcgYmNtX3VzZXJfYXBwbF9ncG9uX3Jzc2kgXAorCQliY21fdXNlcl9hcHBsX29tY2lfc3dkbCBiY21fdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIgYmNtX3VzZXJfYXBwbF9vbnVfdHVuaW5nCitlbmRpZgorCisJTU9EX0lOQ19ESVJTID0gJChUT1ApL2hvc3QvYm9hcmQvd3J4ICQoVE9QKS9jb21tb24vZHJpdmVycy9tYXBsZS9wY2llCisJc3JjcyA9IGJjbW9sdF91c2VyX2FwcGwuYyBiY21vbHRfdXNlcl9hcHBsX2NsaS5jIGJjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmMgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzLmMKKworCWlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCQlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisJZW5kaWYKKwlpZmVxICgkKEVOQUJMRV9LVDIpLCB5KQorCQlNT0RfREVGUyArPSAtREVOQUJMRV9LVDIKKwkJI0VYVFJBX0lOQ0xVREVTICs9IC1JJChUT1BfRElSKS9jb21tb24vY2xpCisJZW5kaWYKKworCU1PRF9ERVBTICs9IHRyYW5zcG9ydAorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5YzMxNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbC5jCkBAIC0wLDAgKzEsNTIwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X2JvYXJkLmg+CisjaW5jbHVkZSA8YmNtb2x0X2JvYXJkX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF91c2VyX2FwcGxfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmg+CisjaWYgZGVmaW5lZChMSU5VWF9LRVJORUxfU1BBQ0UpCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9sb2dfbGludXguaD4KKyNlbmRpZgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfc2VsZWN0b3IuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGlfcHJveHkuaD4KKyNpbmNsdWRlIDxiY21vbHRfcmVtb3RlX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9pbWFnZV90cmFuc2Zlci5oPgorCisjaWZkZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIHN0YXRpYyB2b2lkIHVzaW5nX2luYmFuZF9zZXQoYmNtb3NfYm9vbCB1c2luZ19pbmJhbmQpe30KKyAgICBzdGF0aWMgYmNtb3NfYm9vbCB1c2luZ19pbmJhbmRfZ2V0KHZvaWQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorICAgIGV4dGVybiB1aW50MzJfdCBiY210cl9ob3N0X2lwOworICAgIGV4dGVybiB1aW50MTZfdCBiY210cl9ob3N0X3VkcF9wb3J0OworICAgIGV4dGVybiB1aW50MzJfdCBiY210cl9vbHRfaXBbQkNNVFJfTUFYX09MVFNdOworICAgIGV4dGVybiB1aW50MTZfdCBiY210cl9vbHRfdWRwX3BvcnRbQkNNVFJfTUFYX09MVFNdOworI2Vsc2UKKyAgICAjaW5jbHVkZSA8YmNtdHJfcGx1Z2luLmg+CisjZW5kaWYKKworCisjZGVmaW5lIENMSV9IT1NUX1BST01QVF9GT1JNQVQgIkJDTS4ldT4gIgorCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmN1cnJlbnRfc2Vzc2lvbjsKKworLy8jaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisvL2V4dGVybiB1aW50MzJfdCBiY210cl9ob3N0X2lwOworLy9leHRlcm4gdWludDE2X3QgYmNtdHJfaG9zdF91ZHBfcG9ydDsKKy8vZXh0ZXJuIHVpbnQzMl90IGJjbXRyX29sdF9pcFtCQ01UUl9NQVhfT0xUU107CisvL2V4dGVybiB1aW50MTZfdCBiY210cl9vbHRfdWRwX3BvcnRbQkNNVFJfTUFYX09MVFNdOworLy8jZW5kaWYKKworI2lmZGVmIEVOQUJMRV9MT0cKK3N0YXRpYyBpbnQgbm9sb2dnZXI9MDsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9jbWRfdXNpbmdfaW5iYW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2VzcywgIk1hcGxlIG1hbmFnZW1lbnQgdXNpbmcgJXNcbiIsICh1c2luZ19pbmJhbmRfZ2V0KCkpPyAiSW4tQmFuZCIgOiAiUENJZSIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jbGlfaGVscChjb25zdCBjaGFyICpjbWQpCit7CisgICAgY29uc3QgY2hhciAqcDsKKworICAgIHdoaWxlICgocCA9IHN0cmNocihjbWQsICcvJykpKQorICAgIHsKKyAgICAgICAgY21kID0gcCArIDE7CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiJXMgWy1sIDxsZXZlbD5dIgorI2lmIGRlZmluZWQoU0lNVUxBVElPTl9CVUlMRCkgJiYgZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorICAgICAgICAgICAgIiBbLXAgdWRwX3BvcnRfZGV2aWNlMV0gWy1wIHVkcF9wb3J0X2RldmljZTJdIC4uLlxuIgorICAgICAgICAgICAgIk9SXG4iCisgICAgICAgICAgICAiIFstb2x0IGlwX2RldmljZTE6cG9ydF9kZXZpY2UxXSBbLW9sdCBpcF9kZXZpY2UyOnBvcnRfZGV2aWNlMl0gLi4uXG4iCisgICAgICAgICAgICAiIFstbGlzdGVuIGlwOnBvcnRdXG4iCisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgICAgICAiIFstbmxdXG4iCisjZW5kaWYKKyAgICAgICAgICAgICIgWy1uZV1cbiIKKyAgICAgICAgICAgICIgWy1kZXZdXG4iCisgICAgICAgICAgICAiIFstaWZfbWFzayBtYXNrXVxuIgorICAgICAgICAgICAgIiBbLXByb3h5IHByb3h5X3BvcnRfZGV2aWNlMV0gWy1wcm94eSBwcm94eV9wb3J0X2RldmljZTJdIC4uLlxuIgorICAgICAgICAgICAgIiBbLXVkXVxuIgorICAgICAgICAgICAgIiBbLW9uX3JlYWR5IGNtZF1cbiIsIGNtZCk7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiXHRcdCBsZXZlbCA9PSBndWVzdCB8IGFkbWluIHwgZGVidWdcbiIKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgICAgICAiXHRcdCAtbmwgLSBkaXNhYmxlIGtlcm5lbCBsb2dnZXIgaW50ZWdyYXRpb25cbiIKKyNlbmRpZgorICAgICAgICAgICAgIlx0XHQgLW5lIC0gZGlzYWJsZSBsaW5lIGVkaXRpbmdcbiIKKyAgICAgICAgICAgICJcdFx0IC1kZXYgLSBkZXZpY2UgSUQgdG8gYXV0by1yZWdpc3RlciBmb3IgaW5kaWNhdGlvbnMgYW5kIHJ1biBwcm94eSBvbiAoZGVmYXVsdCAwKVxuIgorICAgICAgICAgICAgIlx0XHQgLWlmX21hc2sgLSBQT04gTkkgbWFzayB0byBhcHBseSB0byBhdXRvLXJlZ2lzdHJhdGlvbiBvZiBpbmRpY2F0aW9uc1xuIgorICAgICAgICAgICAgIlx0XHQgLXByb3h5IC0gcnVuIHRoZSBBUEkgcHJveHkgbGlzdGVuaW5nIG9uIHRoaXMgVURQIHBvcnRcbiIKKyAgICAgICAgICAgICJcdFx0IC11ZCAtIHVzZSBhIHVuaXggZG9tYWluIGNvbm5lY3Rpb24gdG8gYSB1c2VyIHNwYWNlIGRldmljZSBjb250cm9sIgorICAgICAgICAgICAgIlx0XHQgLW9uX3JlYWR5IC0gY29tbWFuZCBmb3IgQVBJIHByb3h5IHRvIGV4ZWN1dGUgYWZ0ZXIgcmVjZWl2aW5nIGRldmljZSByZWFkeSBpbmRpY2F0aW9uXG4iKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworLyogcXVpdCBjb21tYW5kIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgX2NtZF9xdWl0KGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgYmNtY2xpX3N0b3Aoc2Vzcyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2VzcywgIk1hcGxlIENMSSB0ZXJtaW5hdGVkIGJ5ICdRdWl0JyBjb21tYW5kXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoU0lNVUxBVElPTl9CVUlMRCkgJiYgZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorLyogcGFyc2UgaXA6cG9ydCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9wYXJzZV9pcF9wb3J0KGNvbnN0IGNoYXIgKnMsIHVpbnQzMl90ICppcCwgdWludDE2X3QgKnBvcnQpCit7CisgICAgaW50IG47CisgICAgdWludDMyX3QgaXAxLCBpcDIsIGlwMywgaXA0LCBwcDsKKworICAgIG4gPSBzc2NhbmYocywgIiV1LiV1LiV1LiV1OiV1IiwgJmlwMSwgJmlwMiwgJmlwMywgJmlwNCwgJnBwKTsKKyAgICBpZiAobiAhPSA1IHx8IGlwMSA+IDB4ZmYgfHwgaXAyID4gMHhmZiB8fCBpcDMgPiAweGZmIHx8IGlwNCA+IDB4ZmYgfHwgcHAgPiAweGZmZmYpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHBhcnNlICVzLiBNdXN0IGJlIGlwX2FkZHJlc3M6cG9ydFxuIiwgcyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgICppcCA9IChpcDEgPDwgMjQpIHwgKGlwMiA8PCAxNikgfCAoaXAzIDw8IDgpIHwgaXA0OworICAgICpwb3J0ID0gcHA7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworLyogVHJ5IHRvIGxlYXJuIHN5c3RlbSBtb2RlICovCitzdGF0aWMgYmNtb2x0X3N5c3RlbV9tb2RlIF9nZXRfc3lzdGVtX21vZGUoYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBkZXZfY2ZnOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX0NGR19JTklUKCZkZXZfY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGV2X2NmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSk7CisgICAgcmMgPSBiY21vbHRfY2ZnX2dldChkZXYsICZkZXZfY2ZnLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIkRldmljZSAldTogZmFpbGVkIHRvIHJlYWQgc3lzdGVtIG1vZGUgKCVzKS4gV2FpdGluZyBmb3IgY29uZmlndXJhdGlvblxuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZClkZXYsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybiBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRjsKKyAgICB9CisgICAgYmNtb3NfcHJpbnRmKCJEZXZpY2UgJXU6IFN5c3RlbSBtb2RlOiAlc1xuIiwKKyAgICAgICAgKHVuc2lnbmVkKWRldiwgYmNtb2x0X3N5c3RlbV9tb2RlX25hbWUoZGV2X2NmZy5kYXRhLnN5c3RlbV9tb2RlKSk7CisgICAgcmV0dXJuIGRldl9jZmcuZGF0YS5zeXN0ZW1fbW9kZTsKK30KKworI2lmZGVmIEVOQUJMRV9MT0cKK3N0YXRpYyBpbnQgZGV2X2xvZ190aW1lX3RvX3N0cl9jYih1aW50MzJfdCB0aW1lX3N0YW1wLCBjaGFyICp0aW1lX3N0ciwgaW50IHRpbWVfc3RyX3NpemUpCit7CisgICAgcmV0dXJuIHNucHJpbnRmKHRpbWVfc3RyLCB0aW1lX3N0cl9zaXplLCAiJXUiLCB0aW1lX3N0YW1wIC8gMTAwMCk7IC8qIGNvbnZlcnQgZnJvbSB1c2VjIHRvIG1zZWMuICovCit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21faW5pdF9sb2dnZXIodm9pZCkKK3sKKyNkZWZpbmUgREVWX0xPR19TSVpFMSAxPDwxMQorI2RlZmluZSBERVZfTE9HX1NJWkUyIDE8PDEzCisjZGVmaW5lIERFVl9MT0dfUVVFVUVfU0laRSAxMDAwCisKKyAgICBzdGF0aWMgdWludDhfdCBsb2dnZXJfYnVmMVtERVZfTE9HX1NJWkUxXTsKKyAgICBzdGF0aWMgdWludDhfdCBsb2dnZXJfYnVmMltERVZfTE9HX1NJWkUyXTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgdm9pZCAqYWRkcmVzc2VzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtsb2dnZXJfYnVmMSwgbG9nZ2VyX2J1ZjJ9OworICAgIHVpbnQzMl90IHNpemVzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtzaXplb2YobG9nZ2VyX2J1ZjEpLCBzaXplb2YobG9nZ2VyX2J1ZjIpfTsKKyAgICB1aW50MzJfdCBmbGFnc1tERVZfTE9HX01BWF9GSUxFU10gPSB7QkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMLCBCQ01fREVWX0xPR19GSUxFX0ZMQUdfV1JBUF9BUk9VTkR9OworCisgICAgZXJyID0gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcihhZGRyZXNzZXMsIHNpemVzLCBmbGFncywgQkNNX1NJWkVPRkFSUkFZKGFkZHJlc3NlcyksIDB4NDAwMCwgVEFTS19QUklPUklUWV9ERVZfTE9HLCBERVZfTE9HX1FVRVVFX1NJWkUpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihlcnIsIGVyciwgImJjbV9kZXZfbG9nX2luaXRpYWxpemVfZGV2X2xvZ2dlcl9kZWZhdWx0KClcbiIpOworCisgICAgYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlKERFVl9MT0dfTEVWRUxfRkFUQUwsIEJDTV9ERVZfTE9HX1NUWUxFX0JPTEQpOworICAgIGJjbV9kZXZfbG9nX2xldmVsX3NldF9zdHlsZShERVZfTE9HX0xFVkVMX0VSUk9SLCBCQ01fREVWX0xPR19TVFlMRV9CT0xEKTsKKworICAgIGJjbV9kZXZfbG9nX3NldF90aW1lX3RvX3N0cl9jYihkZXZfbG9nX3RpbWVfdG9fc3RyX2NiKTsKKworI2lmIGRlZmluZWQoTElOVVhfS0VSTkVMX1NQQUNFKQorICAgIGlmICghbm9sb2dnZXIpCisgICAgeworICAgICAgICBlcnIgPSBiY21fZGV2X2xvZ19saW51eF9pbml0KCk7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihlcnIsIGVyciwgImJjbV9kZXZfbG9nX2xpbnV4X2luaXQoKVxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICBCQ01fTE9HKElORk8sIGRlZl9sb2dfaWQsICJIZWxsbyBMb2dnZXJcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaGFuZGxlX3N5c3RlbV9tb2RlX2NoYW5nZShiY21vbHRfZGV2aWQgZGV2KQoreworICAgIGJjbWNsaV9lbnRyeSAqY3VyX2RpciA9IGJjbWNsaV9kaXJfZ2V0KGN1cnJlbnRfc2Vzc2lvbik7CisgICAgY2hhciBvbGRfZGlyX25hbWVbMzJdID0gIiI7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXN0ZW1fbW9kZSk7CisgICAgYmNtX2NvbW1vbl9ncG9uX2luaXQoc3lzdGVtX21vZGUpOworCisgICAgaWYgKGRldiA9PSBjdXJyZW50X2RldmljZSkKKyAgICB7CisgICAgICAgIGlmIChjdXJfZGlyKQorICAgICAgICAgICAgc3RybmNweShvbGRfZGlyX25hbWUsIGJjbWNsaV90b2tlbl9uYW1lKGN1cl9kaXIpLCBzaXplb2Yob2xkX2Rpcl9uYW1lKSAtIDEpOworCisgICAgICAgIGFwaV9jbGlfc2V0X2NvbW1hbmRzKGN1cnJlbnRfc2Vzc2lvbik7CisKKyAgICAgICAgLyogUmVzdG9yZSBjdXJyZW50IENMSSBkaXJlY3RvcnkgKi8KKyAgICAgICAgY3VyX2RpciA9IGJjbWNsaV9kaXJfZmluZChOVUxMLCBvbGRfZGlyX25hbWUpOworICAgICAgICBpZiAoY3VyX2RpcikKKyAgICAgICAgICAgIGJjbWNsaV9kaXJfc2V0KGN1cnJlbnRfc2Vzc2lvbiwgY3VyX2Rpcik7CisgICAgfQorCisgICAgYmNtb2x0X3VzZXJfYXBwbF9jbGlfaGFuZGxlX3N5c3RlbV9tb2RlX2NoYW5nZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBjbGlfZ2V0X3Byb21wdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCB1aW50MzJfdCBtYXhfbGVuKQoreworICAgIHNucHJpbnRmKGJ1ZiwgbWF4X2xlbiwgQ0xJX0hPU1RfUFJPTVBUX0ZPUk1BVCwgY3VycmVudF9kZXZpY2UpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gbW9uX3Nlc3Npb25fcGFybTsKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIHVpbnQzMl90IGZwZ2FfdmVyc2lvbjsKKyNlbmRpZgorICAgIGludCBub2VkaXQgPSAwOworICAgIGludCByYzsKKyAgICBpbnQgaTsKKyAgICBiY21vbHRfaG9zdF9pbml0X3BhcmFtcyBwYXJhbXMgPQorICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIC5sb2dnZXJfaW5pdF9jYiA9IGJjbV9pbml0X2xvZ2dlciwKKyNlbmRpZgorICAgICAgICAucnVuX2Rldl9jdHJsID0gQkNNT1NfRkFMU0UKKyAgICB9OworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAwOworICAgIGJjbW9zX2Jvb2wgc3BlY2lmaWNfZGV2aWNlID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfYm9vbCBydW5fcHJveHkgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19ib29sIHJ1bl9yZW1vdGVfY2xpID0gQkNNT1NfRkFMU0U7CisgICAgdWludDMyX3QgcHJveHlfcG9ydFtCQ01UUl9NQVhfT0xUU10gPSB7fTsKKyAgICB1aW50MzJfdCByZW1vdGVfY2xpX3BvcnQgPSAwOworICAgIGludCBjdXJfcHJveHlfZGV2ID0gMDsKKyAgICBjaGFyICpvbl9yZWFkeV9jbWQgPSBOVUxMOworICAgIHN0cnVjdCBiY21vbHRfcnhfY2ZnIHJ4X2NmZyA9CisgICAgeworICAgICAgICAub2JqX3R5cGUgPSBCQ01PTFRfT0JKRUNUX0FOWSwKKyAgICAgICAgLmZsYWdzID0gQkNNT0xUX0FVVE9fRkxBR1NfTk9ORSwKKyAgICB9OworI2lmIGRlZmluZWQoU0lNVUxBVElPTl9CVUlMRCkgJiYgZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorICAgIGludCBjdXJfb2x0ID0gMDsKKyNlbmRpZgorCisgICAgKHZvaWQpbm9lZGl0OyAvKiBwcmV2ZW50IHdhcm5pbmcgKi8KKworICAgIG1lbXNldCgmbW9uX3Nlc3Npb25fcGFybSwgMCwgc2l6ZW9mKG1vbl9zZXNzaW9uX3Bhcm0pKTsKKyAgICBtb25fc2Vzc2lvbl9wYXJtLmdldF9wcm9tcHQgPSBjbGlfZ2V0X3Byb21wdDsKKyAgICBtb25fc2Vzc2lvbl9wYXJtLmFjY2Vzc19yaWdodCA9IEJDTUNMSV9BQ0NFU1NfQURNSU47CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1sIikpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICJhZG1pbiIpKQorICAgICAgICAgICAgICAgIG1vbl9zZXNzaW9uX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19BRE1JTjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgImd1ZXN0IikpCisgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb25fcGFybS5hY2Nlc3NfcmlnaHQgPSBCQ01DTElfQUNDRVNTX0dVRVNUOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiZGVidWciKSkKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbl9wYXJtLmFjY2Vzc19yaWdodCA9IEJDTUNMSV9BQ0NFU1NfREVCVUc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jbGlfaGVscChhcmd2WzBdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbmUiKSkKKyAgICAgICAgeworICAgICAgICAgICAgbm9lZGl0ID0gMTsKKyAgICAgICAgfQorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW5sIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vbG9nZ2VyID0gMTsKKyAgICAgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1wIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJfb2x0ID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiVG9vIG1hbnkgLXAgYW5kL29yIC1vbHQgb3B0aW9uc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpOworICAgICAgICAgICAgYmNtdHJfb2x0X3VkcF9wb3J0W2N1cl9vbHRdID0gc3RydG9sKGFyZ3ZbaV0sIE5VTEwsIDApOworICAgICAgICAgICAgKytjdXJfb2x0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1vbHQiKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cl9vbHQgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJUb28gbWFueSAtcCBhbmQvb3IgLW9sdCBvcHRpb25zXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBpZiAoX3BhcnNlX2lwX3BvcnQoYXJndltpXSwgJmJjbXRyX29sdF9pcFtjdXJfb2x0XSwgJmJjbXRyX29sdF91ZHBfcG9ydFtjdXJfb2x0XSkgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICArK2N1cl9vbHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWxpc3RlbiIpKQorICAgICAgICB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBpZiAoX3BhcnNlX2lwX3BvcnQoYXJndltpXSwgJmJjbXRyX2hvc3RfaXAsICZiY210cl9ob3N0X3VkcF9wb3J0KSAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1kZXYiKSkKKyAgICAgICAgeworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClzdHJ0b3VsKGFyZ3ZbaV0sIE5VTEwsIDApOworICAgICAgICAgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgZGV2aWNlIElEXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50X2RldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIHNwZWNpZmljX2RldmljZSA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWlmX21hc2siKSkKKyAgICAgICAgeworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgcnhfY2ZnLnBvbl9uaV9tYXNrID0gKHVpbnQzMl90KXN0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXByb3h5IikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJfcHJveHlfZGV2ID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiVG9vIG1hbnkgLXByb3h5IG9wdGlvbnNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIHJ1bl9wcm94eSA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICBwcm94eV9wb3J0W2N1cl9wcm94eV9kZXZdID0gKHVpbnQzMl90KXN0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAocHJveHlfcG9ydFtjdXJfcHJveHlfZGV2XSA+IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgcHJveHkgcG9ydCAldVxuIiwgKHVuc2lnbmVkKXByb3h5X3BvcnRbY3VyX3Byb3h5X2Rldl0pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrY3VyX3Byb3h5X2RldjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItcmVtb3RlIikpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIHJ1bl9yZW1vdGVfY2xpID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIHJlbW90ZV9jbGlfcG9ydCA9ICh1aW50MzJfdClzdHJ0b3VsKGFyZ3ZbaV0sIE5VTEwsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi11ZCIpKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZ19pbmJhbmRfc2V0KEJDTU9TX1RSVUUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1vbl9yZWFkeSIpKQorICAgICAgICB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBvbl9yZWFkeV9jbWQgPSBhcmd2W2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jbGlfaGVscChhcmd2WzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gYmNtb2x0X2hvc3RfaW5pdCgmcGFyYW1zKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKworICAgIGlmIChub2VkaXQpCisgICAgeworICAgICAgICBtb25fc2Vzc2lvbl9wYXJtLmxpbmVfZWRpdF9tb2RlID0gQkNNQ0xJX0xJTkVfRURJVF9ESVNBQkxFOworICAgIH0KKyAgICBpZiAoYmNtY2xpX3Nlc3Npb25fb3BlbigmbW9uX3Nlc3Npb25fcGFybSwgJmN1cnJlbnRfc2Vzc2lvbikpCisgICAgeworICAgICAgICBwcmludGYoIkNhbid0IG9wZW4gQ0xJIHNlc3Npb25cbiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBUcnkgdG8gbGVhcm4gc3lzdGVtIG1vZGUgZm9yIGFsbCBkZXZpY2VzICovCisgICAgaWYgKHNwZWNpZmljX2RldmljZSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9zZXQoY3VycmVudF9kZXZpY2UsIF9nZXRfc3lzdGVtX21vZGUoY3VycmVudF9kZXZpY2UpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJDTVRSX01BWF9PTFRTOyBpKyspCisgICAgICAgICAgICBiY21vbHRfc3lzdGVtX21vZGVfc2V0KGksIF9nZXRfc3lzdGVtX21vZGUoaSkpOworICAgIH0KKworICAgIC8qIEluaXQgZGV2aWNlIHNlbGVjdG9yICovCisgICAgcmMgPSBiY21vbHRfZGV2X3NlbF9pbml0KE5VTEwpOworCisgICAgLyogQWRkIE1hcGxlIEFQSSBjb21tYW5kcyAqLworICAgIHJjID0gcmMgPyByYyA6IGFwaV9jbGlfaW5pdChOVUxMLCBjdXJyZW50X3Nlc3Npb24pOworCisgICAgLyogKHgpR1BPTiBpbml0LiBEb2VzIG5vdGhpbmcgaWYgc3lzdGVtIG1vZGUgaXMgbm90ICh4KUdQT04gKi8KKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9fTlVNX09GOworICAgICAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmc3lzdGVtX21vZGUpOworICAgICAgICBiY21fY29tbW9uX2dwb25faW5pdChzeXN0ZW1fbW9kZSk7CisgICAgfQorCisgICAgLyogQWRkIHRyYW5zcG9ydCBjb21tYW5kcyAqLworICAgIHJjID0gcmMgPyByYyA6IGJjbXRyX2NsaV9pbml0KCk7CisKKyAgICAvKiBBZGQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBjb21tYW5kcyAqLworICAgIHJjID0gcmMgPyByYyA6IGJjbXRyX2NsZF9pbml0KGN1cnJlbnRfc2Vzc2lvbik7CisKKyAgICAvKiBJbml0aWFsaXplIGVtYmVkZGVkIENMSSBtb2R1bGUgKi8KKyAgICByYyA9IHJjID8gcmMgOiBiY21fZW1iZWRkZWRfY2xpX2luaXQoKTsKKworICAgIHJjID0gcmMgPyByYyA6IGJjbW9zX2NsaV9pbml0KE5VTEwpOworCisgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X3VzZXJfYXBwbF9jbGlfaW5pdChOVUxMKTsKKworICAgIHJjID0gcmMgPyByYyA6IGJjbW9sdF91c2VyX2FwcGxfZXhfY2xpX2luaXQoKTsKKworCisjaWYgZGVmaW5lZChMSU5VWF9LRVJORUxfU1BBQ0UpCisgICAgcmMgPSByYyA/IHJjIDogYmNtX2JvYXJkX2luaXQoKTsKKyAgICByYyA9IHJjID8gcmMgOiBiY21fYm9hcmRfY2xpX2luaXQoTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAvKiBsb2dnZXIgQ0xJIGRpcmVjdG9yeSAqLworICAgIGJjbV9kZXZfbG9nX2NsaV9pbml0KE5VTEwpOworI2VuZGlmCisKKyAgICBpZiAocnVuX3Byb3h5KQorICAgIHsKKyAgICAgICAgLyogSWYgZXhlY3V0aW5nIGZvciBzcGVjaWZpYyBkZXZpY2UsIHJ1biBvbmx5IDEgcHJveHkgaW5zdGFuY2UuCisgICAgICAgICAqIE90aGVyd2lzZSwgY3JlYXRlIGFzIG1hbnkgaW5zdGFuY2VzIGFzIHJlcXVlc3RlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNwZWNpZmljX2RldmljZSkKKyAgICAgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbW9sdF9hcGlfcHJveHlfaW5pdChOVUxMLCBkZXZpY2UsIHByb3h5X3BvcnRbMF0sIG9uX3JlYWR5X2NtZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cl9wcm94eV9kZXY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IHJjID8gcmMgOiBiY21vbHRfYXBpX3Byb3h5X2luaXQoTlVMTCwgaSwgcHJveHlfcG9ydFtpXSwgb25fcmVhZHlfY21kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChydW5fcmVtb3RlX2NsaSkKKyAgICB7CisgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbW9sdF9yZW1vdGVfY2xpX2luaXQoTlVMTCwgZGV2aWNlLCByZW1vdGVfY2xpX3BvcnQpOworICAgIH0KKworICAgIC8qIEFkZCBvdGhlciBjb21tYW5kcywgZS5nLiwgYWNjZXNzIHRvIGVtYmVkZGVkIENMSSAqLworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcnhfY2ZnLnJ4X2NiID0gYmNtb2x0X3VzZXJfYXBwbF9pbmRpY2F0aW9uX2NiOworICAgIHJjID0gYmNtb2x0X2F1dG9fcnhfY2Jfc2V0KGRldmljZSwgJnJ4X2NmZyk7CisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gcmMpOworICAgIHJ4X2NmZy5yeF9jYiA9IGJjbW9sdF91c2VyX2FwcGxfcHJveHlfcnhfY2I7CisgICAgcmMgPSBiY21vbHRfcHJveHlfcnhfY2Jfc2V0KGRldmljZSwgJnJ4X2NmZyk7CisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gcmMpOworCisgICAgYmNtb2x0X3VzZXJfbWZ0cF9pbml0KCk7CisKKyAgICBzbV9jaGFuZ2VfY2IgPSBoYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShOVUxMLCAicXVpdCIsICJRdWl0IiwgX2NtZF9xdWl0KTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKE5VTEwsICJ1c2luZ19pbmJhbmQiLCAiVXNpbmcgSW4gQmFuZCIsIF9jbWRfdXNpbmdfaW5iYW5kKTsKKworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgYmNtX2JvYXJkX2ZwZ2FfdmVyc2lvbl9nZXQoJmZwZ2FfdmVyc2lvbik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoY3VycmVudF9zZXNzaW9uLCAiRlBHQSB2ZXJzaW9uOiAlZFxuIiwgZnBnYV92ZXJzaW9uKTsKKyNlbmRpZgorCisgICAgLyogUHJvY2VzcyB1c2VyIGlucHV0IHVudGlsIEVPRiBvciBxdWl0IGNvbW1hbmQgKi8KKyAgICBiY21jbGlfZHJpdmVyKGN1cnJlbnRfc2Vzc2lvbik7CisKKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkKKyAgICBiY21fYm9hcmRfdW5pbml0KCk7CisjZW5kaWYKKyAgICBiY210cl9leGl0KCk7CisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoY3VycmVudF9zZXNzaW9uKTsKKyAgICBiY21jbGlfdG9rZW5fZGVzdHJveShOVUxMKTsKKworICAgIGlmIChydW5fcHJveHkpCisgICAgeworICAgICAgICBiY21vbHRfYXBpX3Byb3h5X3N0b3AoKTsKKyAgICB9CisKKyAgICBpZiAocnVuX3JlbW90ZV9jbGkpCisgICAgeworICAgICAgICBiY21vbHRfcmVtb3RlX2NsaV9zdG9wKCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2MjFkYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaS5oPgorI2luY2x1ZGUgPGJjbV9hcGlfZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZ19wYWNrLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wc19jbGkuaCIKKyNpZm5kZWYgUkVMRUFTRV9CVUlMRAorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb21jaV9zd2RsX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb21jaV9zd2RsLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX21hY19sZWFybmluZ19jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fbWFjX2xlYXJuaW5nLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0cmVzc19jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RyZXNzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3NuX2FjcXVpc2l0aW9uX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zbl9hY3F1aXNpdGlvbi5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9kc19vbWNpX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9kc19vbWNpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3MuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fcnNzaV9jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fcnNzaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlcl9jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmgiCisjZW5kaWYgLyogTm90IFJFTEVBU0VfQlVJTEQgKi8KKyNpbmNsdWRlICJiY21vbHRfZW9uLmgiCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25faGRlLmgiCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyNpbmNsdWRlICJvbW9uLmgiCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9jdHJsX2lvY3RsLmg+CisjaW5jbHVkZSA8YmNtdHJfcGNpZS5oPgorI2VuZGlmIC8qICNlbmRpZiBTSU1VTEFUSU9OX0JVSUxEICovCisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaV9wcm94eS5oIgorI2luY2x1ZGUgImJjbW9sdF9yZW1vdGVfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgiCisjaW5jbHVkZSAiYmNtb2x0X2ltYWdlX3RyYW5zZmVyX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF9zd191cGdyYWRlX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcGxheWJhY2suaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmgiCisKKyNpZmRlZiBFTkFCTEVfTE9HCitzdGF0aWMgdWludDMyX3QgKmJjbWxjbGlfcGNpX2R1bXBwdHI7CitzdGF0aWMgZGV2X2xvZ19pZCB1c2VyX2FwcGxfbG9nX2lkOworc3RhdGljIGRldl9sb2dfaWQgaW5kX2xvZ19pZFtCQ01UUl9NQVhfSU5TVEFOQ0VTXTsKK3N0YXRpYyBiY21jbGlfZW50cnkgKnVzZXJfZGlyOworc3RhdGljIGJjbW9zX2Jvb2wgc3lzX21vZGVfc2V0W0JDTVRSX01BWF9PTFRTXSA9IHt9OworCitzdGF0aWMgdm9pZCB1c2VyX2FwcGxfYXBpX21zZ19kdW1wKGNvbnN0IGNoYXIgKnRpdGxlLCBiY21vbHRfbXNnICptc2cpCit7CisgICAgdWludDhfdCBpbnN0ID0gYmNtb2x0X21zZ19pbnN0YW5jZShtc2cpOworICAgIGluc3QgPSAoaW5zdCA+IEJDTVRSX01BWF9JTlNUQU5DRVMpID8gMCA6IGluc3Q7CisgICAgYmNtb2x0X21zZ19sb2coaW5kX2xvZ19pZFtpbnN0XSwgbXNnKTsKK30KKworI2lmbmRlZiBSRUxFQVNFX0JVSUxECitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9wcm9jZXNzX2V4Y2VwdGlvbl9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICBzd2l0Y2ggKGluZC0+aGRyLm9ial90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVWSUNFOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FUlJPUjoKKyAgICAgICAgICAgIC8qIFN0b3AgYWxsIHVzZXIgYXBwbGljYXRpb24gdGFza3MuICovCisgICAgICAgICAgICBpZiAoYmNtb2x0X2dwb25fbWFjX2xlYXJuaW5nX2FwcGxfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX21hY19sZWFybmluZ19hcHBsX3N0b3AoZGV2aWNlX2lkKTsKKyAgICAgICAgICAgIGlmIChiY21vbHRfZ3Bvbl9zdHJlc3NfYXBwbF9pc19ydW5uaW5nKGRldmljZV9pZCkpCisgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fc3RyZXNzX2FwcGxfc3RvcChkZXZpY2VfaWQpOworICAgICAgICAgICAgaWYgKGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2FwcGxfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2FwcGxfc3RvcChkZXZpY2VfaWQpOworICAgICAgICAgICAgaWYgKGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zdGF0aXN0aWNzX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19zdG9wKGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2dwb25fZHNfb21jaV9hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9kc19vbWNpX2FwcGxfc3RvcChkZXZpY2VfaWQpOworICAgICAgICAgICAgaWYgKGJjbW9sdF9ncG9uX3Jzc2lfYXBwbF9pc19ydW5uaW5nKGRldmljZV9pZCkpCisgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fcnNzaV9hcHBsX3N0b3AoZGV2aWNlX2lkKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9pbmRpY2F0aW9uX2NiKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICB1aW50OF90IGluc3RhbmNlICA9IGJjbW9sdF9tc2dfaW5zdGFuY2UobXNnKTsKKyAgICBiY21vbHRfYXV0byAqaW5kID0gKGJjbW9sdF9hdXRvICopbXNnOworICAgIGJjbW9sdF9wc19wb24gcHNfcG9uID0geyBkZXZpY2VfaWQsIGluc3RhbmNlIH07CisKKyAgICB1c2VyX2FwcGxfYXBpX21zZ19kdW1wKCJJbmRpY2F0aW9uIiwgbXNnKTsKKyAgICBiY21vbHRfcHNfcHJvY2Vzc19pbmQoJnBzX3BvbiwgaW5kKTsKKworI2lmbmRlZiBSRUxFQVNFX0JVSUxECisgICAgYmNtb2x0X3VzZXJfYXBwbF9wcm9jZXNzX2V4Y2VwdGlvbl9pbmQoZGV2aWNlX2lkLCBpbmQpOworICAgIC8qIEZvcndhcmQgdGhlIGluZGljYXRpb24gdG8gZWFjaCB1c2VyIGFwcGxpY2F0aW9uLiAgVGhlc2UgYXBwbGljYXRpb25zIHdpbGwgaWdub3JlIGluZGljYXRpb25zIHRoYXQgYXJlbid0CisgICAgICogcmVsZXZhbnQgYW5kIGVycm9ycyB3aWxsIGJlIHByaW50ZWQgdG8gZGVkaWNhdGVkIGxvZyBJRHMgcGVyIGFwcGxpY2F0aW9uLiAqLworICAgIGJjbW9sdF9ncG9uX21hY19sZWFybmluZ19wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X2dwb25fc3RyZXNzX3Byb2Nlc3NfaW5kKGRldmljZV9pZCwgaW5kKTsKKyAgICBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfcHJvY2Vzc19pbmQoZGV2aWNlX2lkLCBpbmQpOworICAgIGJjbW9sdF9ncG9uX2RzX29tY2lfcHJvY2Vzc19pbmQoZGV2aWNlX2lkLCBpbmQpOworICAgIGJjbW9sdF9ncG9uX3Jzc2lfcHJvY2Vzc19pbmQoZGV2aWNlX2lkLCBpbmQpOworICAgIGJjbW9sdF9vbnVfdHVuaW5nX3Byb2Nlc3NfaW5kKGRldmljZV9pZCwgaW5kKTsKKyNlbmRpZiAvKiBOb3QgUkVMRUFTRV9CVUlMRCAqLworCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21vbHRfdXNlcl9hcHBsX29tb25faGFuZGxlX2luZChkZXZpY2VfaWQsIGluc3RhbmNlLCBpbmQpOworI2VuZGlmCisKKyAgICBiY21vbHRfYXBpX3Byb3h5X2F1dG9fcnhfY2IoZGV2aWNlX2lkLCBtc2cpOworICAgIGJjbW9sdF9yZW1vdGVfY2xpX2F1dG9fcnhfY2IoZGV2aWNlX2lkLCBtc2cpOworCisgICAgLyogRnJlZSB0aGUgaW5kaWNhdGlvbiBzaW5jZSB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgaXQgKi8KKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX3Byb3h5X3J4X2NiKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfcHJveHlfcnggKnByb3h5X3J4ID0gKGJjbW9sdF9wcm94eV9yeCAqKW1zZzsKKworI2lmbmRlZiBSRUxFQVNFX0JVSUxECisgICAgYmNtb2x0X29tY2lfc3dkbF9wcm9jZXNzX3Byb3h5X3J4KGRldmljZV9pZCwgcHJveHlfcngpOworCisgICAgLyogRHVtcCBSWCBwYWNrZXQgaWYgT01DSSBTV0RMIGlzIE5vdCBydW5uaW5nKi8KKyAgICBpZiAoIWJjbW9sdF9vbWNpX3N3ZGxfYXBwbF9pc19ydW5uaW5nKGRldmljZV9pZCkpCisgICAgeworICAgICAgICB1c2VyX2FwcGxfYXBpX21zZ19kdW1wKCJQcm94eSBSeCIsIG1zZyk7CisgICAgfQorI2Vsc2UKKyAgICB1c2VyX2FwcGxfYXBpX21zZ19kdW1wKCJQcm94eSBSeCIsIG1zZyk7CisjZW5kaWYgLyogTm90IFJFTEVBU0VfQlVJTEQgKi8KKworICAgIGJjbW9sdF9hcGlfcHJveHlfYXV0b19yeF9jYihkZXZpY2VfaWQsIG1zZyk7CisgICAgYmNtb2x0X3JlbW90ZV9jbGlfYXV0b19yeF9jYihkZXZpY2VfaWQsIG1zZyk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lb25fcHJvY2Vzc19yeChkZXZpY2VfaWQsIHByb3h5X3J4KTsKKyAgICBiY21vbHRfZXBvbl9oZGVfcHJvY2Vzc19yeChkZXZpY2VfaWQsIGJjbW9sdF9tc2dfaW5zdGFuY2UobXNnKSwgcHJveHlfcngpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4KGRldmljZV9pZCwgcHJveHlfcngsIE5VTEwpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfcHJvY2Vzc19wcm94eV9yeChkZXZpY2VfaWQsIHByb3h5X3J4KTsKKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworLyogZXhhbXBsZSBvbiBob3cgdG8gcmVhZCB0aGUgZW1iZWRkZWQgbG9nZ2VyIGZyb20gdGhlIGhvc3QgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3JlYWRfZW1iZWRkZWRfbG9nZ2VyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgIGNmZzsKKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7LmZpbGVfaWQgPSBwYXJtWzBdLnZhbHVlLnVudW1iZXIsIC5yZXNlcnZlZCA9IDB9OworICAgIGludCByYzsKKworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgdXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIiVzIiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBiY21fZGV2X2xvZ19sb2coCisgICAgICAgIHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICAgICAgICJ8IGRldmljZSAldSBsb2dnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iLCBjdXJyZW50X2RldmljZSk7CisgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICIlcyIsICJ8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiIpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgYnVmZmVyKTsKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2dldChjdXJyZW50X2RldmljZSwgJmNmZy5oZHIpOworICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wcmludGYoImdldCBvYmogZXJyb3IgJWRcbiIsIHJjKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19wcmludGYoIiVzIiwgY2ZnLmRhdGEuYnVmZmVyLmJ1ZmYpOworICAgICAgICBpZiAoY2ZnLmRhdGEuYnVmZmVyLm1zZ190b19yZWFkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBleGFtcGxlIG9uIGhvdyB0byByZWFkIGFsbCB0aGUgZW1iZWRkZWQgbG9nIGVudHJpZXMgZnJvbSB0aGUgaG9zdCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZ2V0X2FsbF9sb2dfZW50cmllcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnICBjZmc7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0gey5sb2dfaWQgPSAwLCAucmVzZXJ2ZWQ9MH07CisgICAgaW50IHJjOworCisgICAgY2hhciAqX2xvZ19sZXZlbFtdID0KKyAgICB7CisgICAgICAgICJOT19MT0ciLAorICAgICAgICAiRkFUQUwiLAorICAgICAgICAiRVJST1IiLAorICAgICAgICAiV0FSTklORyIsCisgICAgICAgICJJTkZPIiAsCisgICAgICAgICJERUJVRyIKKyAgICB9OworCisgICAgY2hhciAqX2xvZ190eXBlW10gPQorICAgIHsKKyAgICAgICAgIk5PTkUiLAorICAgICAgICAiUFJJTlQiLAorICAgICAgICAiU0FWRSIsCisgICAgICAgICJCT1RIIgorICAgIH07CisKKyAgICBjaGFyICpfbG9nX3N0eWxlW10gPQorICAgIHsKKyAgICAgICAgIk5PUk1BTCIsCisgICAgICAgICJCT0xEIiwKKyAgICAgICAgIlVOREVSTElORSIsCisgICAgICAgICJCTElLIiwKKyAgICAgICAgIlJFVkVSU0VfVklERU8iCisgICAgfTsKKworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgdXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIiVzIiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBiY21fZGV2X2xvZ19sb2coCisgICAgICAgIHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICIlcyIsICJ8IExPRyBJRCB8ICAgICAgICBMT0cgTkFNRSAgICAgICB8IExPRyBsZXZlbCBwcmludCB8IExPRyBsZXZlbCBzYXZlICB8IGxvZyB0eXBlIHwgICAgbG9nIHN0eWxlICAgIHxcbiIpOworICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiJXMiLCAifC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2dldChjdXJyZW50X2RldmljZSwgJmNmZy5oZHIpOworICAgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSIHwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsCisgICAgICAgICAgICAifCUtOGR8JS0yM3N8JS0xN3N8JS0xN3N8JS0xMHN8JS0xN3N8XG4iLAorICAgICAgICAgICAga2V5LmxvZ19pZCwKKyAgICAgICAgICAgIGNmZy5kYXRhLmxvZ19uYW1lLnN0ciwKKyAgICAgICAgICAgIF9sb2dfbGV2ZWxbY2ZnLmRhdGEubG9nX2xldmVsX3ByaW50XSwKKyAgICAgICAgICAgIF9sb2dfbGV2ZWxbY2ZnLmRhdGEubG9nX2xldmVsX3NhdmVdLAorICAgICAgICAgICAgX2xvZ190eXBlW2NmZy5kYXRhLmxvZ190eXBlXSwKKyAgICAgICAgICAgIF9sb2dfc3R5bGVbY2ZnLmRhdGEubG9nX3N0eWxlXSk7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAgICAgIiVzIiwgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7CisgICAgICAgIGtleS5sb2dfaWQrKzsKKworICAgIH0KKyAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIiVzIiwgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2luZGljYXRpb25faGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHN0cnVjdCBiY21vbHRfcnhfY2ZnIHJ4X2NmZyA9CisgICAgeworICAgICAgICAub2JqX3R5cGUgPSBCQ01PTFRfT0JKRUNUX0FOWSwKKyAgICAgICAgLnJ4X2NiID0gYmNtb2x0X3VzZXJfYXBwbF9pbmRpY2F0aW9uX2NiLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19OT05FLAorICAgICAgICAucG9uX25pX21hc2sgPSBwYXJtWzBdLnZhbHVlLnVudW1iZXIKKyAgICB9OworICAgIHJldHVybiBiY21vbHRfYXV0b19yeF9jYl9zZXQoY3VycmVudF9kZXZpY2UsICZyeF9jZmcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9wcm94eV9yeF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgc3RydWN0IGJjbW9sdF9yeF9jZmcgcnhfY2ZnID0KKyAgICB7CisgICAgICAgIC5vYmpfdHlwZSA9IEJDTU9MVF9PQkpFQ1RfQU5ZLAorICAgICAgICAucnhfY2IgPSBiY21vbHRfdXNlcl9hcHBsX3Byb3h5X3J4X2NiLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19OT05FLAorICAgICAgICAucG9uX25pX21hc2sgPSBwYXJtWzBdLnZhbHVlLnVudW1iZXIKKyAgICB9OworICAgIHJldHVybiBiY21vbHRfcHJveHlfcnhfY2Jfc2V0KGN1cnJlbnRfZGV2aWNlLCAmcnhfY2ZnKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3BjaXN0YXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDhfdCBzdGFydDsKKyAgICBiY21fcGNpZWRfc3RhdCAqc3RhdDsKKworICAgIHN0YXJ0ID0gMDsKKyAgICBpZiAobl9wYXJtcyA+IDApCisgICAgeworICAgICAgICBpZiAoIXN0cm5jbXAocGFybVswXS52YWx1ZS5zdHJpbmcsICJ5ZXMiLCBzdHJsZW4oInllcyIpKSkKKyAgICAgICAgICAgIHN0YXJ0ID0gMTsKKyAgICB9CisKKyAgICByYyA9IGJjbV9ib2FyZF9wY2lfZGVidWcoMCwgTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX1NUQVQsIHN0YXJ0LCAwLCBiY21sY2xpX3BjaV9kdW1wcHRyKTsKKyAgICBzdGF0ID0gKGJjbV9wY2llZF9zdGF0ICopYmNtbGNsaV9wY2lfZHVtcHB0cjsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX3BjaV9kZWJ1ZygpIGZhaWxlZFxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlY2VpdmVkICAgICA6ICVkXG4iLCBzdGF0LT5yeF9jb3VudGVyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiU2VuZCAgICAgICAgIDogJWRcbiIsIHN0YXQtPnR4X2NvdW50ZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSeCBEb25lIElzciAgOiAlZFxuIiwgc3RhdC0+cnhfZG9uZV9pc3JfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJ4IEVyciBJc3IgICA6ICVkXG4iLCBzdGF0LT5yeF9lcnJfaXNyX2NvdW50ZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUeCBEb25lIElzciAgOiAlZFxuIiwgc3RhdC0+dHhfZG9uZV9pc3JfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlR4IEVyciBJc3IgICA6ICVkXG4iLCBzdGF0LT50eF9lcnJfaXNyX2NvdW50ZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSeCBlbXB0eSAgICAgOiAlZFxuIiwgc3RhdC0+cnhfcGNpZV9lbXB0eV9jb3VudGVyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiVHggZnVsbCAgICAgIDogJWRcblxuIiwgc3RhdC0+dHhfcGNpZV9mdWxsX2NvdW50ZXIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9wY2lkdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IGNvbW1hbmQ7CisgICAgaW50MzJfdCBzdGFydCwgaG93bWFueTsKKworICAgIHN0YXJ0ID0gLTE7CisgICAgaG93bWFueSA9IDE7CisKKyAgICBpZiAobl9wYXJtcyA+IDEpCisgICAgeworICAgICAgICBzdGFydCA9IHBhcm1bMV0udmFsdWUubnVtYmVyOworICAgICAgICBob3dtYW55ID0gMTsKKyAgICAgICAgaWYgKG5fcGFybXMgPiAyKQorICAgICAgICAgICAgaG93bWFueSA9IHBhcm1bMl0udmFsdWUubnVtYmVyOworICAgIH0KKyAgICBpZiAoIXN0cm5jbXAocGFybVswXS52YWx1ZS5zdHJpbmcsICJ0eCIsIHN0cmxlbigidHgiKSkpCisgICAgeworICAgICAgICBjb21tYW5kID0gTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX0RVTVBfVFg7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJuY21wKHBhcm1bMF0udmFsdWUuc3RyaW5nLCAicngiLCBzdHJsZW4oInJ4IikpKQorICAgIHsKKyAgICAgICAgY29tbWFuZCA9IE1BUExFX0RFVl9DVFJMX0lPQ1RMX09QX1BDSV9EVU1QX1JYOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3IgLSB3cm9uZyBjb21tYW5kOiAlc1xuIiwgcGFybVswXS52YWx1ZS5zdHJpbmcpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHJjID0gYmNtX2JvYXJkX3BjaV9kZWJ1ZygwLCBjb21tYW5kLCBzdGFydCwgaG93bWFueSwgYmNtbGNsaV9wY2lfZHVtcHB0cik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbV9ib2FyZF9wY2lfZGVidWcoKSBmYWlsZWRcbiIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlcyIsIChjaGFyICopYmNtbGNsaV9wY2lfZHVtcHB0cik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBiY21vbHRfdXNlcl9hcHBsX2NsaV9zdGFydF9lcG9uKHZvaWQpCit7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9pbml0KCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vvbl9pbml0KCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lb25fY2xpX2luaXQodXNlcl9kaXIpOworCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21vbHRfZXBvbl9vbW9uX2FwcGxfaW5pdCgpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vbW9uX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2luaXQoKTsKKyAgICBiY21vbHRfZXBvbl9oZGVfYXBwbF9jbGlfaW5pdCh1c2VyX2Rpcik7CisjZW5kaWYKKworICAgIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfaW5pdCgpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfY2xpX2luaXQodXNlcl9kaXIpOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfdXNlcl9hcHBsX2NsaV9zdGFydF9ncG9uKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2luaXQodXNlcl9kaXIpOworCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKyAgICBiY21vbHRfZ3Bvbl9tYWNfbGVhcm5pbmdfYXBwbF9pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX21hY19sZWFybmluZ19jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfZ3Bvbl9zdHJlc3NfYXBwbF9pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0cmVzc19jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc25fYWNxdWlzaXRpb25fY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zdGF0aXN0aWNzX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX2RzX29tY2lfYXBwbF9pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX2RzX29tY2lfY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X29tY2lfc3dkbF9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX29tY2lfc3dkbF9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfZ3Bvbl9yc3NpX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9yc3NpX2NsaV9pbml0KHVzZXJfZGlyKTsKKyNlbmRpZiAvKiBOb3QgUkVMRUFTRV9CVUlMRCAqLworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfdXNlcl9hcHBsX2NsaV9zdGFydF94Z3BvbihiY21vbHRfZGV2aWQgZGV2KQoreworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19pbml0KHVzZXJfZGlyKTsKKworI2lmbmRlZiBSRUxFQVNFX0JVSUxECisKKyAgICBiY21vbHRfZ3Bvbl9zdHJlc3NfYXBwbF9pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0cmVzc19jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc25fYWNxdWlzaXRpb25fY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zdGF0aXN0aWNzX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX2RzX29tY2lfYXBwbF9pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX2RzX29tY2lfY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X2dwb25fcnNzaV9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fcnNzaV9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfb251X3R1bmluZ19hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpX2luaXQodXNlcl9kaXIpOworI2VuZGlmIC8qIE5vdCBSRUxFQVNFX0JVSUxEICovCit9CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9jbGlfaGFuZGxlX3N5c3RlbV9tb2RlX2NoYW5nZShiY21vbHRfZGV2aWQgZGV2KQoreworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXNfbW9kZTsKKworICAgIGlmIChzeXNfbW9kZV9zZXRbZGV2XSA9PSBCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuOyAvKiBvbmx5IHJ1biBvbmNlICovCisgICAgfQorCisgICAgc3lzX21vZGVfc2V0W2Rldl0gPSBCQ01PU19UUlVFOworICAgICh2b2lkKWJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoZGV2LCAmc3lzX21vZGUpOworICAgIHN3aXRjaCAoc3lzX21vZGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRzoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRzoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRzoKKyAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3RhcnRfZXBvbigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzhfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X2dwb24oZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0c6CisgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X3hncG9uKGRldik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0Y6IC8qIHVuY29uZmlndXJlZCAqLworICAgICAgICBzeXNfbW9kZV9zZXRbZGV2XSA9IEJDTU9TX0ZBTFNFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWxjbGlfcGNpX2R1bXBwdHIgPSBiY21vc19hbGxvYygxMDI0KjUpOworICAgIHVpbnQ4X3QgaW5zdDsKKworICAgIGlmICghYmNtbGNsaV9wY2lfZHVtcHB0cikKKyAgICB7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighYmNtbGNsaV9wY2lfZHVtcHB0ciwgQkNNX0VSUl9OT01FTSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05VTEw7CisgICAgfQorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGVudW1fdGFibGVfZmlsZV9pZFtdID0KKyAgICB7CisgICAgICAgIHsgLm5hbWUgPSAiU1JBTSIsIC52YWwgPSBCQ01PTFRfTE9HX0ZJTEVfSURfU1JBTSB9LAorICAgICAgICB7IC5uYW1lID0gIkREUiIsIC52YWwgPSBCQ01PTFRfTE9HX0ZJTEVfSURfRERSIH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgYmNtb2x0X21zZ19sb2dfaW5pdCgpOyAvKiBpbml0aWFsaXplIEFQSS9sb2dnZXIgaW50ZWdyYXRpb24gKi8KKyAgICB1c2VyX2FwcGxfbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInVzZXJfYXBwbCIsIERFVl9MT0dfTEVWRUxfREVCVUcsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBmb3IgKGluc3QgPSAwOyBpbnN0IDwgQkNNVFJfTUFYX0lOU1RBTkNFUzsgaW5zdCsrKQorICAgIHsKKyAgICAgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICAgICAgc3ByaW50Zihsb2dfbmFtZSwgImluZF9tc2cldSIsIGluc3QpOworICAgICAgICBpbmRfbG9nX2lkW2luc3RdID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfREVCVUcsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9CisjZW5kaWYKKyAgICB1c2VyX2RpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsICJ1c2VyIiwgIlVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIXVzZXJfZGlyLCBCQ01fRVJSX05PTUVNKTsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgQkNNQ0xJX01BS0VfQ01EKHVzZXJfZGlyLCAicmVnaXN0ZXJfaW5kaWNhdGlvbl9oYW5kbGVyIiwgIlJlZ2lzdGVyIGluZGljYXRpb24gaGFuZGxlciIsIF9hcGljbGlfaW5kaWNhdGlvbl9oYW5kbGVyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgicG9uX25pX21hc2siLCAiUE9OX05JIGludGVyZmFjZSBiaXRtYXNrLiAwPWFsbCIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDAsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQodXNlcl9kaXIsICJyZWdpc3Rlcl9wcm94eV9yeF9oYW5kbGVyIiwgIlJlZ2lzdGVyIFByb3h5IFJ4IGhhbmRsZXIiLCBfYXBpY2xpX3Byb3h5X3J4X2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fREVGVkFMKCJwb25fbmlfbWFzayIsICJQT05fTkkgaW50ZXJmYWNlIGJpdG1hc2suIDA9YWxsIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCwgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRCh1c2VyX2RpciwgInJlYWRfZW1iZWRkZWRfbG9nZ2VyIiwgIlJlYWQgZW1iZWRkZWQgbG9nZ2VyIiwgX2FwaWNsaV9yZWFkX2VtYmVkZGVkX2xvZ2dlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJmaWxlX2lkIiwgImZpbGVfaWQiLCBlbnVtX3RhYmxlX2ZpbGVfaWQsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0odXNlcl9kaXIsICJnZXRfYWxsX2xvZ19lbnRyaWVzIiwgIkdldCBhbGwgZW1iZWRkZWQgbG9nIGVudHJpZXMiLCBfYXBpY2xpX2dldF9hbGxfbG9nX2VudHJpZXMpOworI2VuZGlmCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIEJDTUNMSV9NQUtFX0NNRCh1c2VyX2RpciwgInBjaXN0YXQiLCAiUHJpbnQgUENJZSBzdGF0aXN0aWNzIiwgX2FwaWNsaV9wY2lzdGF0LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJjbGVhciIsICJjbGVhciIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworICAgIEJDTUNMSV9NQUtFX0NNRCh1c2VyX2RpciwgInBjaWR1bXAiLCAiUHJpbnQgUENJZSByaW5nIiwgX2FwaWNsaV9wY2lkdW1wLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJkaXIiLCAiZGlyZWN0aW9uOiB0eCBvciByeCIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZyb20iLCAic3RhcnQgaW5kZXgiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJob3dtYW55IiwgImhvd21hbnkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyNlbmRpZgorCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2luaXQoKTsKKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2NsaV9pbml0KHVzZXJfZGlyKTsKKyNlbmRpZgorCisgICAgZXJyID0gYmNtb2x0X3VzZXJfYXBwbF9jbGlfaW1hZ2VfdHJhbnNmZXJfaW5pdCh1c2VyX2Rpcik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKGVyciAhPSBCQ01fRVJSX09LLCBlcnIpOworCisgICAgZXJyID0gYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3dfdXBncmFkZV9pbml0KHVzZXJfZGlyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7CisKKyAgICBiY21vbHRfcHNfYXBwbF9pbml0KCk7CisgICAgZXJyID0gYmNtb2x0X3VzZXJfYXBwbF9wc19jbGlfaW5pdCh1c2VyX2Rpcik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKGVyciAhPSBCQ01fRVJSX09LLCBlcnIpOworCisgICAgYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFja19pbml0KCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFja19jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2NsaV9oYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGN1cnJlbnRfZGV2aWNlKTsKKworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhMTA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuaApAQCAtMCwwICsxLDQ1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX0NMSV9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9DTElfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X21zZyAqbXNnKTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX3Byb3h5X3J4X2NiKGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9tc2cgKm1zZyk7CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9jbGlfaGFuZGxlX3N5c3RlbV9tb2RlX2NoYW5nZShiY21vbHRfZGV2aWQgZGV2KTsKKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YWMwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmMKQEAgLTAsMCArMSw3NzEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuaCIKKworI2lmZGVmIEVOQUJMRV9MT0cKK3N0YXRpYyBkZXZfbG9nX2lkIHVzZXJfYXBwbF9leF9sb2dfaWQ7CisKK3N0YXRpYyB2b2lkIHVzZXJfYXBwbF9nZW5lcmFsX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiWy0tIERldiAldTogSW5kaWNhdGlvbiBSZWNlaXZlZCAtLV1cbiIsIG9sdCk7CisgICAgc3dpdGNoIChtc2ctPm9ial90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFQlVHOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChtc2ctPnN1Ymdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqaW5kID0gKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQqKW1zZzsKKyAgICAgICAgICAgICAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9leF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRGV2ICV1OiBwb24gbmkgc3RhdGUgY2hhbmdlZCBuZXdfc3RhdGUgJWQsIHByZXYgc3RhdGUgJWQsIHJlc3VsdCAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvbHQsIGluZC0+ZGF0YS5uZXdfc3RhdGUsIGluZC0+ZGF0YS5wcmV2aW91c19zdGF0ZSwgaW5kLT5kYXRhLnJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiAuLi4gKi8KKyAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX09OVToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIC4uLiAqLworICAgIH0KKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworc3RhdGljIHZvaWQgdXNlcl9hcHBsX3Bvbl9uaV9pbmRpY2F0aW9uX2NiKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2V4X2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIlstLSBEZXYgJXU6IFBvbiBOSSBJbmRpY2F0aW9uIFJlY2VpdmVkIC0tXVxuIiwgb2x0KTsKKyAgICBzd2l0Y2ggKG1zZy0+b2JqX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT5zdWJncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKmluZCA9IChiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKiltc2c7CisgICAgICAgICAgICAgICAgICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRldiAldTogcG9uIG5pIHN0YXRlIGNoYW5nZWQgbmV3X3N0YXRlICVkLCBwcmV2IHN0YXRlICVkLCByZXN1bHQgJWQgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb2x0LCBpbmQtPmRhdGEubmV3X3N0YXRlLCBpbmQtPmRhdGEucHJldmlvdXNfc3RhdGUsIGluZC0+ZGF0YS5yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2V4X2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgICAgICAgICAiWy0tIERldiAldTogc29tZSBvdGhlciBpbmRpY2F0aW9uICAtLV1cbiIsIG9sdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogLi4uICovCisgICAgfQorICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCitzdGF0aWMgdm9pZCB1c2VyX2FwcGxfZGV2aWNlX2xvZ2dlcl9pbmRpY2F0aW9uX2NiKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBpZiAobXNnLT5zdWJncm91cCA9PSBCQ01PTFRfREVCVUdfQVVUT19JRF9DTElfT1VUUFVUKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXQgKmluZCA9IChiY21vbHRfZGVidWdfY2xpX291dHB1dCAqKW1zZzsKKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9leF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICAgICAiRGV2ICV1OiBbZGV2aWNlIGxvZ2dlcl0gJXNcbiIsIG9sdCwgaW5kLT5kYXRhLmRhdGEudmFsKTsKKyAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9pbmRpY2F0aW9uX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfcnhfY2ZnIHJ4X2NmZzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJ4X2NmZy5vYmpfdHlwZSA9IEJDTU9MVF9PQkpfSURfREVCVUc7CisgICAgcnhfY2ZnLnJ4X2NiID11c2VyX2FwcGxfZGV2aWNlX2xvZ2dlcl9pbmRpY2F0aW9uX2NiOworICAgIHJ4X2NmZy5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkU7CisgICAgcmMgPSBiY21vbHRfYXV0b19yeF9jYl9zZXQoY3VycmVudF9kZXZpY2UsICZyeF9jZmcpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJ4X2NmZy5vYmpfdHlwZSA9IEJDTU9MVF9PQkpfSURfR1BPTl9OSTsKKyAgICByeF9jZmcucnhfY2IgPSB1c2VyX2FwcGxfcG9uX25pX2luZGljYXRpb25fY2I7CisgICAgcnhfY2ZnLmZsYWdzID0gQkNNT0xUX0FVVE9fRkxBR1NfTk9ORTsKKyAgICByYyA9IGJjbW9sdF9hdXRvX3J4X2NiX3NldChjdXJyZW50X2RldmljZSwgJnJ4X2NmZyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcnhfY2ZnLm9ial90eXBlID0gQkNNT0xUX09CSkVDVF9BTlk7CisgICAgcnhfY2ZnLnJ4X2NiID0gdXNlcl9hcHBsX2dlbmVyYWxfaW5kaWNhdGlvbl9jYjsKKyAgICByeF9jZmcuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19OT05FOworICAgIHJldHVybiBiY21vbHRfYXV0b19yeF9jYl9zZXQoY3VycmVudF9kZXZpY2UsICZyeF9jZmcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2xvZ19lbnRyeV9zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0gey5sb2dfaWQ9IDB9OyAvKio8IGRlY2xhcmUga2V5ICovCisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsIEJDTU9MVF9MT0dfTEVWRUxfSU5GTyk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlLCBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHKTsKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fbmlfZGlzYWJsZV9pbmRpY2F0aW9uIChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZyBjZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0gey5wb25fbmk9IDB9OyAvKio8IGRlY2xhcmUga2V5ICovCisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9uaSwga2V5KTsKKworICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCBCQ01PU19GQUxTRSk7CisgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgQkNNT1NfRkFMU0UpOworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldCgwLCAmY2ZnLmhkcik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9yZWRpcmVjdF9kZXZpY2VfbG9nZ2VyIChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9kZWJ1Z19jZmcgY2ZnOworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0ge307CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgY29uc29sZV9yZWRpcmVjdGlvbiwgQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fQ0xPTkUpOworICAgIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fZGV2aWNlX2luaXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBjZmc7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsucmVzZXJ2ZWQgPSAwfTsKKyAgICBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBubmlfc3BlZWQgPSB7fTsgLyoqPCBEZXZpY2UgbmV0d29yayBpbnRlcmZhY2Ugc3BlZWQgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdCBvcGVyOworCisgICAgbm5pX3NwZWVkLmZpcnN0X2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKKyAgICBubmlfc3BlZWQuc2Vjb25kX2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fMTZfWCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCwgNSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UsIDUpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQsIG5uaV9zcGVlZCk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBjb25uZWN0LCBrZXkpOworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blci5oZHIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfdHJ4KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7LnBvbl9uaSA9IDB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsIEJDTU9MVF9UUlhfVFlQRV9TT1VSQ0VfUEhPVE9OSUNTKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fc2V0X2ludGVyd29ya2luZ19tb2RlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7LnBvbl9uaSA9IDB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGl3Zl9tb2RlLCBCQ01PTFRfSVdGX01PREVfUEVSX0ZMT1dfTU9ERSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKKworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fc2V0X21hY190YWJsZV9jb25maWcoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZ19pd2Y7CisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXlfaXdmID0gey5wb25fbmkgPSAwfTsKKyAgICBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb247CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYWdpbmdfdGltZSA9IDEwMDAwOworICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfYWdpbmcgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbGVhcm5pbmcgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX3N0YXRpY19tb2RlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5kZWZhdWx0X2Zsb3dfaWQgPSA2MDA7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSA9IEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9OT1JNQUw7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayA9IEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19ERUZBVUxUX0ZMT1c7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZ19pd2YsIGdwb25faXdmLCBrZXlfaXdmKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfaXdmLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIG1hY190YWJsZV9jb25maWd1cmF0aW9uKTsKKyAgICAvKiBtdXN0IHNldCB0aGUgSVdGIHRvIHBlciBmb3cgZm9yIG1hYyB0YWJsZSBtYXBwaW5nIHRvIHdvcmsgKi8KKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfaXdmLCBncG9uX2l3ZiwgaXdmX21vZGUsIEJDTU9MVF9JV0ZfTU9ERV9QRVJfRkxPV19NT0RFKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZ19pd2YuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2FjdGl2YXRlX3BvbihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgb3Blcl9uaTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5X25pID0gey5wb25fbmkgPSAwfTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXJfbmksIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleV9uaSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXJfbmksIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkcpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoMCwgJm9wZXJfbmkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX3N0YXJ0X3NuX2FjcXVpc2l0aW9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIGNmZ19uaTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5X25pID0gey5wb25fbmkgPSAwfTsKKyAgICBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBzbl9hY3F1aXNpdGlvbjsKKworICAgIHNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgc25fYWNxdWlzaXRpb24uaW50ZXJ2YWwgPSA3NzAwMDsKKyAgICBzbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9ESVNBQkxFOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmdfbmksIGdwb25fbmksIGtleV9uaSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX25pLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgc25fYWNxdWlzaXRpb24pOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnX25pLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9uaV9nZXRfc3RhdHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0IHN0YXQ7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0ge307IC8qKjwgZGVjbGFyZSBrZXkgKi8KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX25pLCBrZXkpOworICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgcmV0dXJuIGJjbW9sdF9zdGF0X2dldCgwLCAmc3RhdC5oZHIsIEJDTU9TX1RSVUUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fb251X2NvbmZpZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0gey5wb25fbmkgPSAwLCAub251X2lkID0gMn07CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlciA9IHsudmVuZG9yX2lkID0gezB4MDAsMHgwMCwweDAwLCAweDAwfSwgLnZlbmRvcl9zcGVjaWZpYyA9IHsweDAwLDB4MDAsMHgwMCwgMHgwMn19OworICAgIGJjbW9sdF9hcnJfdThfMTAgcGFzc3dvcmQgPSB7LmFyciA9IHsweDAwLDB4MDAsMHgwMCwgMHgwMCwgMHgwMCwweDAwLDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9fTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCBzZXJpYWxfbnVtYmVyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCwgcGFzc3dvcmQpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcsIEJDTU9TX1RSVUUpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHVzX2ZlYywgQkNNT1NfRkFMU0UpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCwgMik7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgNTAwMCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2FjdGl2YXRlX29udShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC5vbnVfaWQgPSAyfTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkUpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoMCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2FsbG9jX2lkX2NvbmZpZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLmFsbG9jX2lkID0gMzIwfTsKKworICAgIGJjbW9sdF9wb25fYWxsb2Nfc2xhIHNsYTsgLyoqPCBBbGxvYyBJRCBTTEEuICovCisKKyAgICBzbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTl9BU1NVUkVEOworICAgIHNsYS5jYnJfcnRfYncgPSAwOworICAgIHNsYS5jYnJfbnJ0X2J3ID0gMTQwMDAwMDAwOworICAgIHNsYS5ndWFyYW50ZWVkX2J3ID0gMTQwMDAwMDAwOworICAgIHNsYS5tYXhpbXVtX2J3ID0gMTQwMDAwMDAwOworICAgIHNsYS5hbGxvY190eXBlID0gQkNNT0xUX0FMTE9DX1RZUEVfTlNSOworICAgIHNsYS5jYnJfcnRfY29tcGVuc2F0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgc2xhLmNicl9ucnRfYXBfaW5kZXggPSAwOworICAgIHNsYS5jYnJfcnRfYXBfaW5kZXggPSAwOworICAgIHNsYS53ZWlnaHQgPSAwOworICAgIHNsYS5wcmlvcml0eSA9IDA7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIG9udV9pZCwgMik7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEsIHNsYSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworLyogQ29uZmlndXJlIGEgR0VNIC0gZm9yIERTIG9yIGJpZGlyZWN0aW9uYWwgdHJhZmZpYyAqLworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2dlbV9wb3J0X2NvbmZpZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLmdlbV9wb3J0X2lkID0gMzIwfTsKKworICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSB7LmRpcmVjdGlvbiA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fQklESVJFQ1RJT05BTCwgLnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9VTklDQVNUfTsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgMik7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fREFUQSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sLCBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9kc19nZW1fcG9ydF9tb2RpZnkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICAvKiB0aGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBQRVIgZmxvdyBtb2RlICovCisgICAgLyogc2V0IERTIHBvcnQgbWFwcGluZyBpbml0aWFsIEdFTSAzMDAsIGZpbmFsIEdFTSAzMjAgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLmZsb3dfaWQgPSAzMDB9OworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0LCAzMjApOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfZHNfcGVyX3ZsYW5fbWFwcGluZ19tZXRob2QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICAvKiBXaGVuIHdvcmtpbmcgd2l0aCBwZXIgZmxvdyBtb2RlIHRoZSB1c2VyIG11c3QgYWRkIGFuIGVudHJ5IGZvciBlYWNoIFZJRCAoZmxvdykgdGhpcyB3YXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC52bGFuX2lkID0gMzAwfTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9WSUQpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZywgQkNNT0xUX01BUFBJTkdfVEFHX01FVEhPRF9PVVRFUl9WSUQpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbiwgQkNNT0xUX0RTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fc2VuZF9vbWNpX3BhY2tldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0gey5wb25fbmkgPSAwLCAub251X2lkID0gMn07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyOworICAgIHVpbnQ4X3QgY3B1X2J1ZlsxMDBdOworICAgIGJ1ZmZlci5sZW4gPSA0ODsKKyAgICBidWZmZXIudmFsID0gY3B1X2J1ZjsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywga2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCBCQ01PTFRfUEFDS0VUX1RZUEVfT01DSSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgQkNNT1NfVFJVRSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cywgMSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgNDgpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCBidWZmZXIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICByZXR1cm4gYmNtb2x0X3Byb3h5X3NlbmQoMCwgJnByb3h5Lmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZW5kX2NwdV9wYWNrZXRzX292ZXJfZ2VtX3BvcnRzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHMgcHJveHk7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0gey5wb25fbmkgPSAwfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9pZCBnZW1fcG9ydF9pZF9hcnJheVsxMF07CisgICAgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IGdlbV9wb3J0X2xpc3Q7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlcjsKKyAgICB1aW50OF90IGNwdV9idWZbMTAwXTsKKyAgICBidWZmZXIubGVuID0gOTY7CisgICAgYnVmZmVyLnZhbCA9IGNwdV9idWY7CisKKyAgICBnZW1fcG9ydF9saXN0LmxlbiA9IDEwOworICAgIGdlbV9wb3J0X2xpc3QudmFsID0gZ2VtX3BvcnRfaWRfYXJyYXk7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywga2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIEJDTU9MVF9QQUNLRVRfVFlQRV9DUFUpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgQkNNT1NfVFJVRSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGdlbV9wb3J0X2xpc3QsIGdlbV9wb3J0X2xpc3QpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIGJ1ZmZlcik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIHJldHVybiBiY21vbHRfcHJveHlfc2VuZCgwLCAmcHJveHkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2FkZF9tYWNfZW50cnkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICAvKiB0aGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBwZXIgZmxvdyBtb2RlLiAqLworICAgIC8qIEluIG9yZGVyIHRvIHBhc3MgdHJhZmZpYyB5b3UgbXVzdCBhbHNvIGFkZCBhbiBlbnRyeSB0byBJV0YgaW5ncmVzcyBwb3J0IGFzIGRlc2NyaWJlZCBpbiBfZ3Bvbl9zZXRfcGVyX3ZsYW5fbWFwcGluZ19tZXRob2QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0gey5wb25fbmkgPSAwLCAubWFjX2FkZHJlc3MudTggPSB7MHgwMCwweDAwLDB4MDAsIDB4MDAsIDB4MDAsMHgwMH0sIC52bGFuID0gMzIwfTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsIDMyMCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2R1bXBfbWFjX3RhYmxlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgdWludDE2X3QgbWF4X21zZ3NfcGVyX2NhbGwgPSAxMDsKKyAgICBjb25zdCBiY21vbHRfZGV2aWQgZGV2aWNlID0gMDsKKyAgICBjb25zdCB1aW50MTZfdCBwb24gPSAwOworCisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0OworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGZpbHRlcjsKKyAgICB1aW50MTZfdCBpOworICAgIHVpbnQxNl90IGNvdW50ID0gMDsKKworICAgIC8qIGEga2V5IG9mIGFsbCBGcyBtZWFucyAic3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IHdpbGRjYXJkX2tleSA9CisgICAgICAgIHsgLnBvbl9uaSA9IHBvbiwgLm1hY19hZGRyZXNzLnU4ID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH0sIC52bGFuID0gMHhGRkZGIH07CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZXMgKi8KKyAgICBlcnIgPSBiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzX3Blcl9jYWxsLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBmaWx0ZXIgc3RydWN0dXJlIGFuZCBhc2sgdG8gcmVhZCB0aGUgZmxvdyBJRCAvIHN0YXRpYyBmbGFnICovCisgICAgQkNNT0xUX0NGR19JTklUKCZmaWx0ZXIsIGdwb25faXdmX21hY190YWJsZSwgd2lsZGNhcmRfa2V5KTsKKyAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQpOworICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCk7CisKKyAgICAvKiBmaWx0ZXIgdG8gb25seSBpbmNsdWRlIG5vbi1zdGF0aWMgZW50cmllcyAoeW91IGNvdWxkIGFsc28gZmlsdGVyIG9uIGZsb3cgSUQsIG9yIG9taXQgdGhpcyB0byBpbmNsdWRlIGFsbCkgKi8KKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZmaWx0ZXIsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCwgQkNNT1NfRkFMU0UpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGNhbGwgZ2V0IG11bHRpcGxlIG9iamVjdHMgQVBJIGZ1bmN0aW9uICovCisgICAgICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZSwgJmZpbHRlci5oZHIsIEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIHJldHVybmVkIGVycm9yOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcmludCBlYWNoIGtleS9jb25maWcgc3RydWN0dXJlIHRoYXQgd2FzIHJlY2VpdmVkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtc2dfc2V0LT5udW1faW5zdGFuY2VzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnICpjZmcgPSAoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgKiltc2dfc2V0LT5tc2dbaV07CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICJlbnRyeVslZF0gTUFDOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKyAgICAgICAgICAgICAgICBjb3VudCwKKyAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFswXSwKKyAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFsxXSwKKyAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFsyXSwKKyAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFszXSwKKyAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFs0XSwKKyAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFs1XSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiZW50cnlbJWRdIFZJRDogJWRcbiIsIGNvdW50LCBjZmctPmtleS52bGFuKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJlbnRyeVslZF0gZmxvdyBJRDogJWRcbiIsIGNvdW50LCBjZmctPmRhdGEuZmxvd19pZCk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiZW50cnlbJWRdIHN0YXRpYzogJXNcbiIsIGNvdW50LCBjZmctPmRhdGEuc3RhdCA/ICJ5ZXMiIDogIm5vIik7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBrZXkgZm9yIG5leHQgY2FsbCAqLworICAgICAgICBmaWx0ZXIua2V5ID0gKigoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKiltc2dfc2V0LT5uZXh0X2tleSk7CisKKyAgICAvKiBrZWVwIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHVudGlsIHdlIGhhdmUgcmV0cmlldmVkIGFsbCBlbnRyaWVzICovCisgICAgfSB3aGlsZSAobXNnX3NldC0+bW9yZSk7CisKKyAgICBiY21vbHRfbXNnX3NldF9mcmVlKG1zZ19zZXQpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fc2V0X3VzX2Zsb3dfY29uZmlndXJhdGlvbihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLmdlbV9wb3J0X2lkID0gMzIwfTsKKyAgICBiY21vbHRfdmxhbl90YWcgdmxhbl90YWc7CisKKyAgICAvKiB2bGFkIHRhZyBwYXJhbWV0ZXJzIGZvciB0aGUgYWRkIHZsYW4gKi8KKyAgICB2bGFuX3RhZy5wYml0ID0gOTsKKyAgICB2bGFuX3RhZy52bGFuX2lkID0gMzAwOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCAzMjApOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCBCQ01PU19GQUxTRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX0FERCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZywgdmxhbl90YWcpOworICAgIC8qIHdoYXQgaXMgdGhlIHRwaWQgaW5kZXggKi8KKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgsIDApOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9jb25maWd1cmVfYW5kX2FjdGl2YXRlX3BvbihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIFRSWCBhbmQgUE9OIExpbmsgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzICsgUE9OIGNvbnRyb2wgb3BlcmF0aW9uICovCisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleV9uaSA9IHsucG9uX25pID0gMH07CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIGNmZ19uaTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXJfbmk7CisKKyAgICBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBzbl9hY3F1aXNpdGlvbiA9IHsuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRSwgLmludGVydmFsID0gMTAwMDAsIC5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FfTsKKyAgICBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgZHJpZnRfY29udHJvbCA9IHsuZHJpZnRfaW50ZXJ2YWwgPSAxMDAwLCAuZHJpZnRfbGltaXQgPSA0LCAudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgPSA4fTsKKyAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIGJlcl9tb25pdG9yID0gey51c19iZXJfaW50ZXJ2YWwgPSAxMDAwLCAuc2RfdGhyZXNob2xkID0gNSwgLnNmX3RocmVzaG9sZCA9IDN9OworICAgIGJjbW9sdF9ncG9uX3RyeF9rZXkga2V5X3RyeCA9IHsucG9uX25pID0gMH07CisgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmdfdHJ4OworICAgIGJjbW9sdF90cnhfZGVsaW1pdGVyIGRlbGltaXRlciA9IHt9OworCisgICAgLyogb3ZlcmlkZSBvbmx5IHRoZSByZWxldmFudCBwYXJhbWV0ZXJzICovCisgICAgZGVsaW1pdGVyLnBhdHRlcm5bMF0gPSAweDBCOworICAgIGRlbGltaXRlci5wYXR0ZXJuWzFdID0gMHg1OTsKKyAgICBkZWxpbWl0ZXIucGF0dGVyblsyXSA9IDB4ODM7CisgICAgZGVsaW1pdGVyLnNpemUgPSAzOworICAgIGRlbGltaXRlci53aW5kb3dfc2l6ZSA9IDEyNDsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnX3RyeCwgZ3Bvbl90cngsIGtleV90cngpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ190cngsIGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCBCQ01PTFRfVFJYX1RZUEVfU09VUkNFX1BIT1RPTklDUyk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX3RyeCwgZ3Bvbl90cngsIGRlbGltaXRlciwgZGVsaW1pdGVyKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfc2V0KDAsICZjZmdfdHJ4Lmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2V4X2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIkVycm9yIGluIHNldCB0cnggJWQiLCByYyk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIFBPTiAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnX25pLCBncG9uX25pLCBrZXlfbmkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19uaSwgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHNuX2FjcXVpc2l0aW9uKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfbmksIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wsIGRyaWZ0X2NvbnRyb2wpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19uaSwgZ3Bvbl9uaSwgYmVyX21vbml0b3IsIGJlcl9tb25pdG9yKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfbmksIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsIDEwMDApOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19uaSwgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5LCAwKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfc2V0KDAsICZjZmdfbmkuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyX25pLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXlfbmkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyX25pLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KDAsICZvcGVyX25pLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBncG9uX2FkZF9hY3RpdmF0ZV9vbnUgKGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9ncG9uX25pIHBvbl9uaSwgYmNtb2x0X2dwb25fb251X2lkIG9udV9pZCwgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcikKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIG9udV9jZmc7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBvbnVfa2V5ID0gey5wb25fbmkgPSBwb25fbmksIC5vbnVfaWQgPSBvbnVfaWR9OworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9udV9vcGVyOworICAgIGJjbW9sdF9hcnJfdThfMTAgcGFzc3dvcmQgPSB7LmFyciA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fX07CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnIGdlbV9jZmc7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGdlbV9rZXkgPSB7LnBvbl9uaSA9IHBvbl9uaSwgLmdlbV9wb3J0X2lkID0gb251X2lkfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmb251X2NmZywgZ3Bvbl9vbnUsIG9udV9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJm9udV9jZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCBzZXJpYWxfbnVtYmVyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgcGFzc3dvcmQsIHBhc3N3b3JkKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZywgQkNNT1NfVFJVRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmb251X2NmZywgZ3Bvbl9vbnUsIHVzX2ZlYywgQkNNT1NfVFJVRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmb251X2NmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCwgMik7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmb251X2NmZywgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsIDUwMDApOworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoZGV2LCAmb251X2NmZy5oZHIpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmdlbV9jZmcsIGdwb25fZ2VtX3BvcnQsIGdlbV9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmdlbV9jZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEUpOworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoZGV2LCAmZ2VtX2NmZy5oZHIpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvbnVfb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9rZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFKTsKKyAgICByYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXYsICZvbnVfb3Blci5oZHIpOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2NvbmZpZ19hbmRfYWN0aXZhdGVfb251IChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHNlcmlhbF9udW1iZXIgPSB7LnZlbmRvcl9pZCA9IHsweDAwLDB4MDAsMHgwMCwgMHgwMH0sIC52ZW5kb3Jfc3BlY2lmaWMgPSB7MHgwMCwweDAwLDB4MDAsIDB4MDJ9fTsKKyAgICByZXR1cm4gZ3Bvbl9hZGRfYWN0aXZhdGVfb251KDAsIDAsIDIsIHNlcmlhbF9udW1iZXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2Vwb25fZ2V0X2FsbF9saW5rX2FsYXJtcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgdWludDE2X3QgbWF4X21zZ3NfcGVyX2NhbGwgPSAxMDsKKyAgICBjb25zdCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gMDsKKyAgICBjb25zdCB1aW50MTZfdCBwb24gPSAwOworICAgIC8qIGNvbmZpZ3VyZSBmaWx0ZXIgdG8gc2VsZWN0IG9ubHkgbGlua3Mgd2hpY2ggZG8gTk9UIGhhdmUgYWxsIGFsYXJtcyBvZmYgKi8KKyAgICBjb25zdCBiY21vbHRfZmlsdGVyX2ZsYWdzIGZsYWdzID0gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OOworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGVfZmlsdGVyID0KKyAgICAgICAgeworICAgICAgICAgICAgLmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQgPSBCQ01PTFRfU1RBVFVTX09GRiwKKyAgICAgICAgICAgIC5rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IEJDTU9MVF9TVEFUVVNfT0ZGLAorICAgICAgICAgICAgLm1wY3BfcmVwb3J0X3RpbWVvdXQgPSBCQ01PTFRfU1RBVFVTX09GRiwKKyAgICAgICAgICAgIC5vYW1fa2VlcGFsaXZlX3RpbWVvdXQgPSBCQ01PTFRfU1RBVFVTX09GRiwKKyAgICAgICAgfTsKKworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQ7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgZmlsdGVyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IHdpbGRjYXJkX2tleTsKKyAgICB1aW50MTZfdCBpOworCisgICAgLyogcmV0cmlldmUgdGhlIEVQT04gTkkgTUFDIGFkZHJlc3MgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgcG9uX2NmZzsKKyAgICBiY21vbHRfZXBvbl9uaV9rZXkgcG9uX2tleSA9IHsgLmVwb25fbmkgPSBwb24gfTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmcG9uX2NmZywgZXBvbl9uaSwgcG9uX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmcG9uX2NmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MpOworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJnBvbl9jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRmFpbGVkIHRvIHJldHJpZXZlIEVQT04gTkkgTUFDIGFkZHJlc3MhXG4iKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBhIGtleSB3aXRoIHRoZSBFUE9OIE5JIE1BQyBhZGRyZXNzIG1lYW5zICJzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmciICovCisgICAgd2lsZGNhcmRfa2V5LmVwb25fbmkgPSBwb247CisgICAgd2lsZGNhcmRfa2V5Lm1hY19hZGRyZXNzID0gcG9uX2NmZy5kYXRhLm1hY19hZGRyZXNzOworCisgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSByZXR1cm4gdmFsdWVzICovCisgICAgZXJyID0gYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNnc19wZXJfY2FsbCwgJm1zZ19zZXQpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHJldHVybiFcbiIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgdGhlIGZpbHRlciBzdHJ1Y3R1cmUgYW5kIGFzayB0byByZWFkIHRoZSBhbGFybSBzdGF0ZSAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmZmlsdGVyLCBlcG9uX2xpbmssIHdpbGRjYXJkX2tleSk7CisgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSk7CisKKyAgICAvKiBhcHBseSBmaWx0ZXIgKi8KKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZmaWx0ZXIsIGVwb25fbGluaywgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlX2ZpbHRlcik7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogY2FsbCBnZXQgbXVsdGlwbGUgb2JqZWN0cyBBUEkgZnVuY3Rpb24gKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmZmlsdGVyLmhkciwgZmxhZ3MsIG1zZ19zZXQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSByZXR1cm5lZCBlcnJvcjogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogcHJpbnQgZWFjaCBrZXkvY29uZmlnIHRoYXQgd2FzIHJlY2VpdmVkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtc2dfc2V0LT5udW1faW5zdGFuY2VzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnICpjZmcgPSAoYmNtb2x0X2Vwb25fbGlua19jZmcqKW1zZ19zZXQtPm1zZ1tpXTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJMaW5rOiBOSSAldSwgTUFDICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+a2V5LmVwb25fbmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkubWFjX2FkZHJlc3MudThbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkubWFjX2FkZHJlc3MudThbNV0pOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlx0SW52YWxpZCBNUENQIFJlcG9ydCBSZWNlaXZlZDogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmRhdGEuYWxhcm1fc3RhdGUuaW52YWxpZF9tcGNwX3JlcG9ydF9yZWNlaXZlZCk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHRLZXkgRXhjaGFuZ2UgZmFpbHVyZTogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmRhdGEuYWxhcm1fc3RhdGUua2V5X2V4Y2hhbmdlX2ZhaWx1cmUpOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlx0TVBDUCBSZXBvcnQgVGltZW91dDogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmRhdGEuYWxhcm1fc3RhdGUubXBjcF9yZXBvcnRfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHRPQU0gS2VlcGFsaXZlIFRpbWVvdXQ6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5kYXRhLmFsYXJtX3N0YXRlLm9hbV9rZWVwYWxpdmVfdGltZW91dCk7CisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgdGhlIGtleSBmb3IgbmV4dCBjYWxsICovCisgICAgICAgIGZpbHRlci5rZXkgPSAqKChiY21vbHRfZXBvbl9saW5rX2tleSopbXNnX3NldC0+bmV4dF9rZXkpOworCisgICAgICAgIC8qIGtlZXAgY2FsbGluZyB0aGUgZnVuY3Rpb24gdW50aWwgd2UgaGF2ZSByZXRyaWV2ZWQgYWxsIGVudHJpZXMgKi8KKyAgICB9IHdoaWxlIChtc2dfc2V0LT5tb3JlKTsKKworICAgIGJjbW9sdF9tc2dfc2V0X2ZyZWUobXNnX3NldCk7CisgICAgcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2V4X2NsaV9pbml0KHZvaWQpCit7CisgICAgYmNtY2xpX2VudHJ5ICpwYXJlbnQgPSBiY21jbGlfZGlyX2ZpbmQoTlVMTCwgInVzZXIiKTsKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICB1c2VyX2FwcGxfZXhfbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInVzZXJfYXBwbF9leCIsIERFVl9MT0dfTEVWRUxfREVCVUcsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyNlbmRpZgorCisgICAgZGlyID0gYmNtY2xpX2Rpcl9hZGQocGFyZW50LCAiZXhhbXBsZSIsICJVc2VyIGFwcGxpY2F0aW9uIiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFkaXIsIEJDTV9FUlJfTk9NRU0pOworI2lmZGVmIEVOQUJMRV9MT0cKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9kZXZpY2VfaW5pdCIsICJncG9uIGRldmljZSBpbml0IiwgdXNlcl9hcHBsX2dwb25fZGV2aWNlX2luaXQpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiaW5kaWNhdGlvbl9oYW5kbGVyIiwgImluZGljYXRpb24gaGFuZGxlciIsIHVzZXJfYXBwbF9pbmRpY2F0aW9uX2hhbmRsZXIpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAibG9nX2VudHJ5X3NldCIsICJsb2cgZW5ydHkgc2V0IiwgdXNlcl9hcHBsX2xvZ19lbnRyeV9zZXQpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAicmVkaXJlY3RfZGV2aWNlX2xvZ2dlciIsICJyZWRpcmVjdCBkZXZpY2UgbG9nZ2VyIiwgdXNlcl9hcHBsX3JlZGlyZWN0X2RldmljZV9sb2dnZXIpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9uaV9kaXNhYmxlX2luZGljYXRpb24iLCAiZ3Bvbl9uaV9kaXNhYmxlX2luZGljYXRpb24iLCB1c2VyX2FwcGxfZ3Bvbl9uaV9kaXNhYmxlX2luZGljYXRpb24pOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9uaV9nZXRfc3RhdHMiLCAiZ3Bvbl9uaV9nZXRfc3RhdHMiLCB1c2VyX2FwcGxfZ3Bvbl9uaV9nZXRfc3RhdHMpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9zdGFydF9zbl9hY3F1aXNpdGlvbiIsICJncG9uIHN0YXJ0IHNuIGFjcXVpc2l0aW9uIiwgdXNlcl9hcHBsX2dwb25fc3RhcnRfc25fYWNxdWlzaXRpb24pOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9zZXRfbWFjX3RhYmxlX2NvbmZpZyIsICJncG9uIHNldCBtYWMgdGFibGUgY29uZmlnIiwgdXNlcl9hcHBsX2dwb25fc2V0X21hY190YWJsZV9jb25maWcpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9zZXRfaW50ZXJ3b3JraW5nX21vZGUiLCAiZ3BvbiBzZXQgaW50ZXJ3b3JraW5nIG1vZGUiLCB1c2VyX2FwcGxfZ3Bvbl9zZXRfaW50ZXJ3b3JraW5nX21vZGUpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9zZXRfdHJ4IiwgImdwb24gc2V0IHRyeCIsIHVzZXJfYXBwbF9ncG9uX3NldF90cngpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9hY3RpdmF0ZV9wb24iLCAiZ3BvbiBhY3RpdmF0ZSBwb24iLCB1c2VyX2FwcGxfZ3Bvbl9hY3RpdmF0ZV9wb24pOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9vbnVfY29uZmlnIiwgImdwb24gb251IGNvbmZpZyIsIHVzZXJfYXBwbF9ncG9uX29udV9jb25maWcpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9hY3RpdmF0ZV9vbnUiLCAiZ3BvbiBhY3RpdmF0ZSBvbnUiLCB1c2VyX2FwcGxfZ3Bvbl9hY3RpdmF0ZV9vbnUpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9hbGxvY19pZF9jb25maWciLCAiZ3BvbiBhbGxvYyBjb25maWciLCB1c2VyX2FwcGxfZ3Bvbl9hbGxvY19pZF9jb25maWcpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9nZW1fcG9ydF9jb25maWciLCAiZ3BvbiBnZW0gcG9ydCBjb25maWciLCB1c2VyX2FwcGxfZ3Bvbl9nZW1fcG9ydF9jb25maWcpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9hZGRfbWFjX2VudHJ5IiwgImdwb24gYWRkIG1hYyBlbnRyeSIsIHVzZXJfYXBwbF9ncG9uX2FkZF9tYWNfZW50cnkpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9kdW1wX21hY190YWJsZSIsICJwcmludCBlbnRpcmUgR1BPTiBNQUMgdGFibGUiLCB1c2VyX2FwcGxfZ3Bvbl9kdW1wX21hY190YWJsZSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2RzX2dlbV9wb3J0X21vZGlmeSIsICIgZ3BvbiBkcyBnZW0gcG9ydCBtb2RpZnkiLCB1c2VyX2FwcGxfZ3Bvbl9kc19nZW1fcG9ydF9tb2RpZnkpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9zZXRfcGVyX3ZsYW5fbWFwcGluZ19tZXRob2QiLCAiZ3BvbiBzZXQgcGVyIHZsYW4gbWFwcGluZyBtZXRob2QiLCB1c2VyX2FwcGxfZ3Bvbl9zZXRfZHNfcGVyX3ZsYW5fbWFwcGluZ19tZXRob2QpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9zZXRfdXNfZmxvd19jb25maWd1cmF0aW9uIiwgImdwb24gc2V0IHVzIGZsb3cgY29uZmlndXJhdGlvbiIsIHVzZXJfYXBwbF9ncG9uX3NldF91c19mbG93X2NvbmZpZ3VyYXRpb24pOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9zZW5kX29tY2lfcGFja2V0IiwgImFwcGwgZ3BvbiBzZW5kIG9tY2kgcGFja2V0IiwgdXNlcl9hcHBsX2dwb25fc2VuZF9vbWNpX3BhY2tldCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NlbmRfY3B1X3BhY2tldHNfb3Zlcl9nZW1fcG9ydHMiLCAiZ3BvbiBzZW5kIGNwdSBwYWNrZXRzIG92ZXIgZ2VtIHBvcnRzIiwgdXNlcl9hcHBsX2dwb25fc2VuZF9jcHVfcGFja2V0c19vdmVyX2dlbV9wb3J0cyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2NvbmZpZ3VyZV9hbmRfYWN0aXZhdGVfcG9uIiwgImNvbmZpZ3VyZSBhbmQgYWN0aXZhdGUgcG9uIiwgdXNlcl9hcHBsX2dwb25fY29uZmlndXJlX2FuZF9hY3RpdmF0ZV9wb24pOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZ3Bvbl9jb25maWdfYW5kX2FjdGl2YXRlX29udSIsICJjb25maWcgYW5kIGFjdGl2YXRlIG9udSIsIHVzZXJfYXBwbF9ncG9uX2NvbmZpZ19hbmRfYWN0aXZhdGVfb251KTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImVwb25fZ2V0X2FsbF9saW5rX2FsYXJtcyIsICJyZXRyaWV2ZSBhbGwgbGluayBhbGFybXMiLCB1c2VyX2FwcGxfZXBvbl9nZXRfYWxsX2xpbmtfYWxhcm1zKTsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuaApAQCAtMCwwICsxLDM4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX0VYX0NMSV9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9FWF9DTElfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9leF9jbGlfaW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhkNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHMuYwpAQCAtMCwwICsxLDc2OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaS5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oIgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfc2VsZWN0b3IuaD4KKworc3RhdGljIGJjbWNsaV9lbnRyeSAqZ3Bvbl91dGlsc19jbGlfZGlyOworc3RhdGljIGJjbWNsaV9lbnRyeSAqZ3Bvbl91dGlsc19jbGlfdG9wX2RpcjsKK3N0YXRpYyBiY21vc19ib29sIGdwb25fdXRpbHNfaXNfcmVnaXN0ZXJlZDsKKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19jcmVhdGUoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2RlZmluZSBNQVhfR0VNX1BPUlRTX0ZPUl9TRU5EICAgICA2NAorI2RlZmluZSBNQVhfT05VU19GT1JfU0VORCAgICAgICAgICA2NAorI2RlZmluZSBNQVhfUEFDS0VUX1NJWkUgICAgICAgICAgICAyMDQ4CisKK3R5cGVkZWYgZW51bQoreworICAgIEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9CWVRFX0NZQ0xFLAorICAgIEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9XT1JEX0NZQ0xFLAorICAgIEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9DT05TVAorfSBnZW5lcmF0ZWRfcGFja2V0X3BhdHRlcm47CisKK3R5cGVkZWYgZW51bQoreworICAgIFBPTl9NT0RFX0dQT04sCisgICAgUE9OX01PREVfWEdQT04sCisgICAgUE9OX01PREVfSU5WQUxJRAorfSBwb25fbW9kZTsKKworc3RhdGljIHVpbnQ4X3Qgc2F2ZWRfcGFja2V0W01BWF9QQUNLRVRfU0laRV07CitzdGF0aWMgYmNtb2x0X3BhY2tldF90eXBlIHNhdmVkX3BhY2tldF90eXBlOworc3RhdGljIGJjbW9zX2Jvb2wgc2F2ZWRfcGFja2V0X2NhbGNfY3JjOworc3RhdGljIHVpbnQxNl90IHNhdmVkX3BhY2tldF9sZW4gPSAwOworCitzdGF0aWMgdm9pZCBncG9uX3V0aWxzX2NsaV9kaXJfY2xpX2Rlc3Ryb3kodm9pZCkKK3sKKyAgICBpZiAoZ3Bvbl91dGlsc19jbGlfZGlyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koZ3Bvbl91dGlsc19jbGlfZGlyKTsKKyAgICAgICAgZ3Bvbl91dGlsc19jbGlfZGlyID0gTlVMTDsKKyAgICB9Cit9CisKKy8qIEN1cnJlbnQgZGV2aWNlIGNoYW5nZSBpbmRpY2F0aW9uICovCitzdGF0aWMgdm9pZCBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfZGV2aWNlX2NoYW5nZV9pbmQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworICAgIGJjbW9zX2Vycm5vIGVyciA9IGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoZGV2LCAmc3lzdGVtX21vZGUpOworCisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yIGRldmljZSBJZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1ggfHwKKyAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzhfWCB8fAorICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fNF9YIHx8CisgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1ggfHwKKyAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWCB8fAorICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRyB8fAorICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJCdWlsZGluZyBncG9uX3V0aWxzIENMSSBmb3IgZGV2aWNlICVkXG4iLCBkZXYpOworCisgICAgICAgIGVyciA9IGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19jcmVhdGUoZ3Bvbl91dGlsc19jbGlfdG9wX2Rpcik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJFcnJvciBidWlsZGluZyBncG9uX3V0aWxzIENMSVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ3Bvbl91dGlsc19jbGlfZGlyX2NsaV9kZXN0cm95KCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHBvbl9tb2RlIHBvbl9tb2RlX2dldChiY21vbHRfcG9uX25pIHBvbl9pZCkKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChjdXJyZW50X2RldmljZSwgJnN5c3RlbV9tb2RlKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gUE9OX01PREVfSU5WQUxJRDsKKyAgICB9CisKKyAgICBpZiAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UpCisgICAgeworICAgICAgICAvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgOHggR1BPTiAvIDR4IFhHUE9OIGNvLWV4aXN0ZW5jZSBtb2RlICovCisgICAgICAgIHJldHVybiBwb25faWQgPCA4ID8gUE9OX01PREVfWEdQT04gOiBQT05fTU9ERV9HUE9OOworICAgIH0KKyAgICBlbHNlIGlmIChiY21vbHRfb2JqX3RhZ192YWxpZF9mb3Jfc3lzdGVtX21vZGUoc3lzdGVtX21vZGUsIEJDTU9MVF9PQkpfVEFHX0dQT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBPTl9NT0RFX0dQT047CisgICAgfQorICAgIGVsc2UgaWYgKGJjbW9sdF9vYmpfdGFnX3ZhbGlkX2Zvcl9zeXN0ZW1fbW9kZShzeXN0ZW1fbW9kZSwgQkNNT0xUX09CSl9UQUdfWEdQT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBPTl9NT0RFX1hHUE9OOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUE9OX01PREVfSU5WQUxJRDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBidWlsZF9wYWNrZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9wYWNrZXRfdHlwZSB0eXBlKQoreworICAgIHVpbnQxNl90IGk7CisgICAgYmNtb3NfYm9vbCBjYWxjX2NyYyA9IChiY21vc19ib29sKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGNfY3JjIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDE2X3QgcGFja2V0X3NpemUgPSAodWludDE2X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NpemUiKS0+dmFsdWUudW51bWJlcjsKKyAgICBnZW5lcmF0ZWRfcGFja2V0X3BhdHRlcm4gcGF0dGVybiA9IAorICAgICAgICAoZ2VuZXJhdGVkX3BhY2tldF9wYXR0ZXJuKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhdHRlcm4iKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50OF90IGNvbnN0X3ZhbHVlID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uc3RfdmFsdWUiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MTZfdCBkYXRhX29mZnNldDsKKyAgICAKKyAgICAvKiBzYXZlIHBhY2tldCB0eXBlIC8gc2l6ZSAvIENSQyBmbGFnICovCisgICAgc2F2ZWRfcGFja2V0X3R5cGUgPSB0eXBlOworICAgIHNhdmVkX3BhY2tldF9sZW4gPSBwYWNrZXRfc2l6ZTsKKyAgICBzYXZlZF9wYWNrZXRfY2FsY19jcmMgPSBjYWxjX2NyYzsKKworICAgIGlmICh0eXBlID09IEJDTU9MVF9QQUNLRVRfVFlQRV9DUFUpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBldGhfZGEgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJldGhfZGEiKS0+dmFsdWUubWFjOworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBldGhfc2EgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJldGhfc2EiKS0+dmFsdWUubWFjOworCisgICAgICAgIC8qIGNvcHkgZGVzdGluYXRpb24gTUFDICovCisgICAgICAgIG1lbWNweShzYXZlZF9wYWNrZXQsICZldGhfZGEsIDYpOworCisgICAgICAgIC8qIGNvcHkgc291cmNlIE1BQyAqLworICAgICAgICBtZW1jcHkoJnNhdmVkX3BhY2tldFs2XSwgJmV0aF9zYSwgNik7CisKKyAgICAgICAgLyogd3JpdGUgRXRoZXJUeXBlIG9mIDAwMDAgKi8KKyAgICAgICAgbWVtc2V0KCZzYXZlZF9wYWNrZXRbMTJdLCAwLCAyKTsKKworICAgICAgICAvKiBkYXRhIHN0YXJ0cyBhZnRlciBFdGhlclR5cGUgKi8KKyAgICAgICAgZGF0YV9vZmZzZXQgPSAxNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogZmlsbCB0aGUgZW50aXJlIHBhY2tldCAqLworICAgICAgICBkYXRhX29mZnNldCA9IDA7CisgICAgfQorCisgICAgLyogZmlsbCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgZGF0YSBwYXR0ZXJuICovCisgICAgc3dpdGNoIChwYXR0ZXJuKQorICAgIHsKKyAgICBjYXNlIEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9CWVRFX0NZQ0xFOgorICAgICAgICBjb25zdF92YWx1ZSA9IDA7CisgICAgICAgIGZvciAoaSA9IGRhdGFfb2Zmc2V0OyBpIDwgcGFja2V0X3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZWRfcGFja2V0W2ldID0gY29uc3RfdmFsdWUrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9XT1JEX0NZQ0xFOgorICAgICAgICAvKiBmaXJzdCA0IGJ5dGVzID0gMDAwMDAwMDAsIG5leHQgNCA9IDExMTExMTExLCBuZXh0IDQgPSAyMjIyMjIyMiwgZXRjICovCisgICAgICAgIGNvbnN0X3ZhbHVlID0gMDsKKyAgICAgICAgZm9yIChpID0gZGF0YV9vZmZzZXQ7IGkgPCBwYWNrZXRfc2l6ZTsgaSArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBqOworICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IGkgKyA0ICYmIGogPCBwYWNrZXRfc2l6ZTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhdmVkX3BhY2tldFtqXSA9IGNvbnN0X3ZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3RfdmFsdWUgPSAoY29uc3RfdmFsdWUgPT0gMHhGRikgPyAwIDogY29uc3RfdmFsdWUgKyAweDExOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0NPTlNUOgorICAgICAgICBmb3IgKGkgPSBkYXRhX29mZnNldDsgaSA8IHBhY2tldF9zaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhdmVkX3BhY2tldFtpXSA9IGNvbnN0X3ZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIEludmFsaWQgcGF0dGVybjogJXVcbiIsIHBhdHRlcm4pOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJ1aWxkX2NwdV9wYWNrZXRfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYnVpbGRfcGFja2V0KHNlc3Npb24sIEJDTU9MVF9QQUNLRVRfVFlQRV9DUFUpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJDUFUgcGFja2V0IGJ1ZmZlciBzYXZlZCBzdWNjZXNzZnVsbHlcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSBzYXZpbmcgQ1BVIHBhY2tldCBidWZmZXI6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJ1aWxkX29tY2lfcGFja2V0X2NiKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IGJ1aWxkX3BhY2tldChzZXNzaW9uLCBCQ01PTFRfUEFDS0VUX1RZUEVfT01DSSk7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk9NQ0kgcGFja2V0IGJ1ZmZlciBzYXZlZCBzdWNjZXNzZnVsbHlcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSBzYXZpbmcgT01DSSBwYWNrZXQgYnVmZmVyOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBzZW5kX3BhY2tldF90b19ncG9uX2dlbV9saXN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCB1aW50MTZfdCBnZW1fY291bnQsIGJjbW9sdF9ncG9uX2dlbV9pZCAqZ2VtcykKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDE7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBnZW1faWR4OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkgcG9uX25pX2tleSA9IHsgLnBvbl9uaSA9IHBvbl9uaSB9OworICAgIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBnZW1fcG9ydF9saXN0OworICAgIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzIHByb3h5OworICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXIgPSB7IC5sZW4gPSBzYXZlZF9wYWNrZXRfbGVuLCAudmFsID0gc2F2ZWRfcGFja2V0IH07CisKKyAgICBpZiAoc2F2ZWRfcGFja2V0X2xlbiA9PSAwKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0geW91IG11c3QgYnVpbGQvc2F2ZSBhIHBhY2tldCBiZWZvcmUgeW91IGNhbiBzZW5kIGl0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY291bnQiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY291bnQgPSAodWludDE2X3QpcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgIlNlbmRpbmcgJXUgcHJveHkgcGFja2V0JXMgdG8gJXUgR0VNIHBvcnQlcy4uLlxuIiwKKyAgICAgICAgY291bnQsCisgICAgICAgIGNvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgZ2VtX2NvdW50LAorICAgICAgICBnZW1fY291bnQgPT0gMSA/ICIiIDogInMiKTsKKworICAgIC8qIGJ1aWxkIHRoZSBwcm94eSBBUEkgbWVzc2FnZSwgZXhjZXB0IHRoZSBHRU0gcG9ydCBsaXN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgcG9uX25pX2tleSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCBzYXZlZF9wYWNrZXRfdHlwZSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBzYXZlZF9wYWNrZXRfY2FsY19jcmMpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIGJ1ZmZlcik7CisKKyAgICAvKiBjYWxsIHRoZSBwcm94eSBBUEkgPGNvdW50PiB0aW1lcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgLyogd2UgbWF5IG5lZWQgdG8gc3BsaXQgdGhpcyB1cCBpbnRvIG11bHRpcGxlIEFQSSBjYWxscyAob25seSAxNiBHRU0gcG9ydHMgYXJlIGFsbG93ZWQgcGVyIHByb3h5IEFQSSkgKi8KKyAgICAgICAgZm9yIChnZW1faWR4ID0gMDsgZ2VtX2lkeCA8IGdlbV9jb3VudDsgZ2VtX2lkeCArPSAxNikKKyAgICAgICAgeworICAgICAgICAgICAgZ2VtX3BvcnRfbGlzdC5sZW4gPSBNSU4oMTYsIGdlbV9jb3VudCAtIGdlbV9pZHgpOworICAgICAgICAgICAgZ2VtX3BvcnRfbGlzdC52YWwgPSAmZ2Vtc1tnZW1faWR4XTsKKyAgICAgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBnZW1fcG9ydF9saXN0LCBnZW1fcG9ydF9saXN0KTsKKworICAgICAgICAgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlLCAmcHJveHkuaGRyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIltFcnJvcl0gcHJveHkgc2VuZDogcGFja2V0IGluZGV4ICV1IEdFTSBpbmRleCAldTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgIGdlbV9pZHgsCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXUgcHJveHkgcGFja2V0JXMgc2VudCBzdWNjZXNzZnVsbHkhXG4iLCBjb3VudCwgY291bnQgPT0gMSA/ICIiIDogInMiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNlbmRfcGFja2V0X3RvX3hncG9uX2dlbV9saXN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCB1aW50MTZfdCBnZW1fY291bnQsIGJjbW9sdF94Z3Bvbl9nZW1faWQgKmdlbXMpCit7CisgICAgdWludDE2X3QgY291bnQgPSAxOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3QgZ2VtX2lkeDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9sdF9wb25fbmkgcG9uX25pID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3hncG9uX25pX2tleSBwb25fbmlfa2V5ID0geyAucG9uX25pID0gcG9uX25pIH07CisgICAgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBnZW1fcG9ydF9saXN0OworICAgIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTsKKyAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyID0geyAubGVuID0gc2F2ZWRfcGFja2V0X2xlbiwgLnZhbCA9IHNhdmVkX3BhY2tldCB9OworCisgICAgaWYgKHNhdmVkX3BhY2tldF9sZW4gPT0gMCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIHlvdSBtdXN0IGJ1aWxkL3NhdmUgYSBwYWNrZXQgYmVmb3JlIHlvdSBjYW4gc2VuZCBpdFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvdW50Iik7CisgICAgaWYgKHBhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvdW50ID0gKHVpbnQxNl90KXBhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgICJTZW5kaW5nICV1IHByb3h5IHBhY2tldCVzIHRvICV1IEdFTSBwb3J0JXMuLi5cbiIsCisgICAgICAgIGNvdW50LAorICAgICAgICBjb3VudCA9PSAxID8gIiIgOiAicyIsCisgICAgICAgIGdlbV9jb3VudCwKKyAgICAgICAgZ2VtX2NvdW50ID09IDEgPyAiIiA6ICJzIik7CisKKyAgICAvKiBidWlsZCB0aGUgcHJveHkgQVBJIG1lc3NhZ2UsIGV4Y2VwdCB0aGUgR0VNIHBvcnQgbGlzdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBwb25fbmlfa2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCBzYXZlZF9wYWNrZXRfdHlwZSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgc2F2ZWRfcGFja2V0X2NhbGNfY3JjKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgYnVmZmVyKTsKKworICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSA8Y291bnQ+IHRpbWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgICAvKiB3ZSBtYXkgbmVlZCB0byBzcGxpdCB0aGlzIHVwIGludG8gbXVsdGlwbGUgQVBJIGNhbGxzIChvbmx5IDE2IEdFTSBwb3J0cyBhcmUgYWxsb3dlZCBwZXIgcHJveHkgQVBJKSAqLworICAgICAgICBmb3IgKGdlbV9pZHggPSAwOyBnZW1faWR4IDwgZ2VtX2NvdW50OyBnZW1faWR4ICs9IDE2KQorICAgICAgICB7CisgICAgICAgICAgICBnZW1fcG9ydF9saXN0LmxlbiA9IE1JTigxNiwgZ2VtX2NvdW50IC0gZ2VtX2lkeCk7CisgICAgICAgICAgICBnZW1fcG9ydF9saXN0LnZhbCA9ICZnZW1zW2dlbV9pZHhdOworICAgICAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBnZW1fcG9ydF9saXN0LCBnZW1fcG9ydF9saXN0KTsKKworICAgICAgICAgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlLCAmcHJveHkuaGRyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIltFcnJvcl0gcHJveHkgc2VuZDogcGFja2V0IGluZGV4ICV1IEdFTSBpbmRleCAldTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgIGdlbV9pZHgsCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXUgcHJveHkgcGFja2V0JXMgc2VudCBzdWNjZXNzZnVsbHkhXG4iLCBjb3VudCwgY291bnQgPT0gMSA/ICIiIDogInMiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNlbmRfdG9fZ2VtX2NiKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqZ2VtX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW0iKTsKKyAgICBiY21vbHRfcG9uX25pIHBvbl9pZCA9IChiY21vbHRfcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQxNl90IGk7CisgICAgcG9uX21vZGUgbW9kZSA9IHBvbl9tb2RlX2dldChwb25faWQpOworCisgICAgaWYgKG1vZGUgPT0gUE9OX01PREVfR1BPTikKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX2lkX2J1ZltNQVhfR0VNX1BPUlRTX0ZPUl9TRU5EXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlbV9wYXJtLT5hcnJheV9zaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbV9pZF9idWZbaV0gPSAoYmNtb2x0X2dwb25fZ2VtX2lkKWdlbV9wYXJtLT52YWx1ZXNbaV0udW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VuZF9wYWNrZXRfdG9fZ3Bvbl9nZW1fbGlzdChzZXNzaW9uLCAodWludDE2X3QpZ2VtX3Bhcm0tPmFycmF5X3NpemUsIGdlbV9pZF9idWYpOworICAgIH0gCisgICAgZWxzZSBpZiAobW9kZSA9PSBQT05fTU9ERV9YR1BPTikKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21vbHRfeGdwb25fZ2VtX2lkIGdlbV9pZF9idWZbTUFYX0dFTV9QT1JUU19GT1JfU0VORF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW1fcGFybS0+YXJyYXlfc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBnZW1faWRfYnVmW2ldID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpZ2VtX3Bhcm0tPnZhbHVlc1tpXS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZW5kX3BhY2tldF90b194Z3Bvbl9nZW1fbGlzdChzZXNzaW9uLCAodWludDE2X3QpZ2VtX3Bhcm0tPmFycmF5X3NpemUsIGdlbV9pZF9idWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSBJbnZhbGlkIHN5c3RlbSBtb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF9wYWNrZXRfdG9fZ3Bvbl9vbnVfbGlzdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgdWludDE2X3Qgb251X2NvdW50LCBiY21vbHRfZ3Bvbl9vbnVfaWQgKm9udXMpCit7CisgICAgdWludDE2X3QgY291bnQgPSAxOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3Qgb251X2lkeDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9sdF9wb25fbmkgcG9uX25pID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICBpZiAoc2F2ZWRfcGFja2V0X2xlbiA9PSAwKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0geW91IG11c3QgYnVpbGQvc2F2ZSBhIHBhY2tldCBiZWZvcmUgeW91IGNhbiBzZW5kIGl0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY291bnQiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY291bnQgPSAodWludDE2X3QpcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgIlNlbmRpbmcgJXUgcHJveHkgcGFja2V0JXMgdG8gJXUgT05VJXMuLi5cbiIsCisgICAgICAgIGNvdW50LAorICAgICAgICBjb3VudCA9PSAxID8gIiIgOiAicyIsCisgICAgICAgIG9udV9jb3VudCwKKyAgICAgICAgb251X2NvdW50ID09IDEgPyAiIiA6ICJzIik7CisKKyAgICAvKiBjYWxsIHRoZSBwcm94eSBBUEkgKHBvdGVudGlhbGx5IHNldmVyYWwgdGltZXMpIGZvciBlYWNoIE9OVSAqLworICAgIGZvciAob251X2lkeCA9IDA7IG9udV9pZHggPCBvbnVfY291bnQ7IG9udV9pZHgrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9rZXkgb251X2tleSA9IHsgLnBvbl9uaSA9IHBvbl9uaSwgLm9udV9pZCA9IG9udXNbb251X2lkeF0gfTsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlciA9IHsgLnZhbCA9IHNhdmVkX3BhY2tldCB9OworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHMgcHJveHk7CisgICAgICAgIHVpbnQxNl90IHBhY2tldHNfcGVyX3Byb3h5OworCisgICAgICAgIC8qIGJ1aWxkIHRoZSBwcm94eSBBUEkgbWVzc2FnZSwgZXhjZXB0IHRoZSBidWZmZXIvbnVtYmVyIG9mIHBhY2tldHMgKi8KKyAgICAgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIG9udV9rZXkpOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCBzYXZlZF9wYWNrZXRfdHlwZSk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgY2FsY19jcmMsIHNhdmVkX3BhY2tldF9jYWxjX2NyYyk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3NpemUsIHNhdmVkX3BhY2tldF9sZW4pOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UgY2FuIGZpdCBwZXIgaW52b2NhdGlvbiBvZiB0aGUgcHJveHkgQVBJICovCisgICAgICAgIHBhY2tldHNfcGVyX3Byb3h5ID0gTUlOKGNvdW50LCAyMDQ4IC8gc2F2ZWRfcGFja2V0X2xlbik7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIHBhY2tldHNfcGVyX3Byb3h5KTsKKworICAgICAgICAvKiBwcmVwYXJlIHRoZSBidWZmZXIgZGF0YSB3aXRoIHNldmVyYWwgY29waWVzIG9mIHRoZSBzYW1lIHBhY2tldCBpbiBhIHJvdyAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcGFja2V0c19wZXJfcHJveHk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCZzYXZlZF9wYWNrZXRbaSAqIHNhdmVkX3BhY2tldF9sZW5dLCBzYXZlZF9wYWNrZXQsIHNhdmVkX3BhY2tldF9sZW4pOyAKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSBlbm91Z2ggdGltZXMgdG8gc2VuZCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBwYWNrZXRzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSBwYWNrZXRzX3Blcl9wcm94eSkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbnVtYmVyX29mX3BhY2tldHMgPSBNSU4ocGFja2V0c19wZXJfcHJveHksIGNvdW50IC0gaSk7CisgICAgICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cyk7CisKKyAgICAgICAgICAgIGJ1ZmZlci5sZW4gPSBudW1iZXJfb2ZfcGFja2V0cyAqIHNhdmVkX3BhY2tldF9sZW47CisgICAgICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgYnVmZmVyKTsKKworICAgICAgICAgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlLCAmcHJveHkuaGRyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIltFcnJvcl0gcHJveHkgc2VuZDogT05VICV1IHBhY2tldCBpbmRleCAldTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIG9udXNbb251X2lkeF0sCisgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXUgcHJveHkgcGFja2V0JXMgc2VudCBzdWNjZXNzZnVsbHkhXG4iLCBjb3VudCwgY291bnQgPT0gMSA/ICIiIDogInMiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNlbmRfcGFja2V0X3RvX3hncG9uX29udV9saXN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCB1aW50MTZfdCBvbnVfY291bnQsIGJjbW9sdF94Z3Bvbl9vbnVfaWQgKm9udXMpCit7CisgICAgdWludDE2X3QgY291bnQgPSAxOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3Qgb251X2lkeDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9sdF9wb25fbmkgcG9uX25pID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICBpZiAoc2F2ZWRfcGFja2V0X2xlbiA9PSAwKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0geW91IG11c3QgYnVpbGQvc2F2ZSBhIHBhY2tldCBiZWZvcmUgeW91IGNhbiBzZW5kIGl0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY291bnQiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY291bnQgPSAodWludDE2X3QpcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgIlNlbmRpbmcgJXUgcHJveHkgcGFja2V0JXMgdG8gJXUgT05VJXMuLi5cbiIsCisgICAgICAgIGNvdW50LAorICAgICAgICBjb3VudCA9PSAxID8gIiIgOiAicyIsCisgICAgICAgIG9udV9jb3VudCwKKyAgICAgICAgb251X2NvdW50ID09IDEgPyAiIiA6ICJzIik7CisKKyAgICAvKiBjYWxsIHRoZSBwcm94eSBBUEkgKHBvdGVudGlhbGx5IHNldmVyYWwgdGltZXMpIGZvciBlYWNoIE9OVSAqLworICAgIGZvciAob251X2lkeCA9IDA7IG9udV9pZHggPCBvbnVfY291bnQ7IG9udV9pZHgrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IG9udV9rZXkgPSB7IC5wb25fbmkgPSBwb25fbmksIC5vbnVfaWQgPSBvbnVzW29udV9pZHhdIH07CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXIgPSB7IC52YWwgPSBzYXZlZF9wYWNrZXQgfTsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsKKyAgICAgICAgdWludDE2X3QgcGFja2V0c19wZXJfcHJveHk7CisKKyAgICAgICAgLyogYnVpbGQgdGhlIHByb3h5IEFQSSBtZXNzYWdlLCBleGNlcHQgdGhlIGJ1ZmZlci9udW1iZXIgb2YgcGFja2V0cyAqLworICAgICAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIG9udV9rZXkpOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgc2F2ZWRfcGFja2V0X3R5cGUpOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgc2F2ZWRfcGFja2V0X2NhbGNfY3JjKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3NpemUsIHNhdmVkX3BhY2tldF9sZW4pOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UgY2FuIGZpdCBwZXIgaW52b2NhdGlvbiBvZiB0aGUgcHJveHkgQVBJICovCisgICAgICAgIHBhY2tldHNfcGVyX3Byb3h5ID0gTUlOKGNvdW50LCAyMDQ4IC8gc2F2ZWRfcGFja2V0X2xlbik7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzLCBwYWNrZXRzX3Blcl9wcm94eSk7CisKKyAgICAgICAgLyogcHJlcGFyZSB0aGUgYnVmZmVyIGRhdGEgd2l0aCBzZXZlcmFsIGNvcGllcyBvZiB0aGUgc2FtZSBwYWNrZXQgaW4gYSByb3cgKi8KKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHBhY2tldHNfcGVyX3Byb3h5OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweSgmc2F2ZWRfcGFja2V0W2kgKiBzYXZlZF9wYWNrZXRfbGVuXSwgc2F2ZWRfcGFja2V0LCBzYXZlZF9wYWNrZXRfbGVuKTsgCisgICAgICAgIH0KKworICAgICAgICAvKiBjYWxsIHRoZSBwcm94eSBBUEkgZW5vdWdoIHRpbWVzIHRvIHNlbmQgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgcGFja2V0cyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gcGFja2V0c19wZXJfcHJveHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bWJlcl9vZl9wYWNrZXRzID0gTUlOKHBhY2tldHNfcGVyX3Byb3h5LCBjb3VudCAtIGkpOworICAgICAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzKTsKKworICAgICAgICAgICAgYnVmZmVyLmxlbiA9IG51bWJlcl9vZl9wYWNrZXRzICogc2F2ZWRfcGFja2V0X2xlbjsKKyAgICAgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgYnVmZmVyKTsKKworICAgICAgICAgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlLCAmcHJveHkuaGRyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIltFcnJvcl0gcHJveHkgc2VuZDogT05VICV1IHBhY2tldCBpbmRleCAldTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIG9udXNbb251X2lkeF0sCisgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXUgcHJveHkgcGFja2V0JXMgc2VudCBzdWNjZXNzZnVsbHkhXG4iLCBjb3VudCwgY291bnQgPT0gMSA/ICIiIDogInMiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNlbmRfdG9fb251X2NiKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqb251X3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnUiKTsKKyAgICBiY21vbHRfcG9uX25pIHBvbl9pZCA9IChiY21vbHRfcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQxNl90IGk7CisgICAgcG9uX21vZGUgbW9kZSA9IHBvbl9tb2RlX2dldChwb25faWQpOworCisgICAgaWYgKG1vZGUgPT0gUE9OX01PREVfR1BPTikKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkX2J1ZltNQVhfT05VU19GT1JfU0VORF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbnVfcGFybS0+YXJyYXlfc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBvbnVfaWRfYnVmW2ldID0gKGJjbW9sdF9ncG9uX29udV9pZClvbnVfcGFybS0+dmFsdWVzW2ldLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbmRfcGFja2V0X3RvX2dwb25fb251X2xpc3Qoc2Vzc2lvbiwgKHVpbnQxNl90KW9udV9wYXJtLT5hcnJheV9zaXplLCBvbnVfaWRfYnVmKTsKKyAgICB9IAorICAgIGVsc2UgaWYgKG1vZGUgPT0gUE9OX01PREVfWEdQT04pCisgICAgeworICAgICAgICBzdGF0aWMgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWRfYnVmW01BWF9PTlVTX0ZPUl9TRU5EXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9udV9wYXJtLT5hcnJheV9zaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG9udV9pZF9idWZbaV0gPSAoYmNtb2x0X3hncG9uX29udV9pZClvbnVfcGFybS0+dmFsdWVzW2ldLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbmRfcGFja2V0X3RvX3hncG9uX29udV9saXN0KHNlc3Npb24sICh1aW50MTZfdClvbnVfcGFybS0+YXJyYXlfc2l6ZSwgb251X2lkX2J1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIEludmFsaWQgc3lzdGVtIG1vZGVcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc2F2ZWRfbWFjKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCB1aW50MTZfdCBvZmZzZXQpCit7CisgICAgdWludDE2X3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIjoiKTsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJTAyWCIsIHNhdmVkX3BhY2tldFtvZmZzZXQgKyBpXSk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZHVtcF9wYWNrZXRfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBkYXRhX29mZnNldDsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfbGVuID09IDApCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiTm8gcGFja2V0IGhhcyBiZWVuIGJ1aWx0IHlldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJTYXZlZCBwYWNrZXQgcGFyYW1ldGVyczpcbiIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgICAgVHlwZTogJXNcbiIsIHNhdmVkX3BhY2tldF90eXBlID09IEJDTU9MVF9QQUNLRVRfVFlQRV9DUFUgPyAiQ1BVIiA6ICJPTUNJIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICBMZW5ndGg6ICV1XG4iLCBzYXZlZF9wYWNrZXRfbGVuKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgIEF1dG8tY2FsY3VsYXRlIENSQzogJXNcbiIsIHNhdmVkX3BhY2tldF9jYWxjX2NyYyA/ICJ5ZXMiIDogIm5vIik7CisKKyAgICBpZiAoc2F2ZWRfcGFja2V0X3R5cGUgPT0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgICAgRXRoZXJuZXQgREE6ICIpOworICAgICAgICBkdW1wX3NhdmVkX21hYyhzZXNzaW9uLCAwKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlxuIik7CisKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICBFdGhlcm5ldCBTQTogIik7CisgICAgICAgIGR1bXBfc2F2ZWRfbWFjKHNlc3Npb24sIDYpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4iKTsKKworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgIEV0aGVyVHlwZTogMHglMDJYJTAyWFxuIiwgc2F2ZWRfcGFja2V0WzEyXSwgc2F2ZWRfcGFja2V0WzEzXSk7CisgICAgICAgIGRhdGFfb2Zmc2V0ID0gMTQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRhdGFfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRGF0YSBieXRlcyAoc3RhcnRpbmcgYXQgb2Zmc2V0ICV1KToiLCBkYXRhX29mZnNldCk7CisgICAgZm9yIChpID0gZGF0YV9vZmZzZXQ7IGkgPCBzYXZlZF9wYWNrZXRfbGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoKGkgLSBkYXRhX29mZnNldCkgJSAxNiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4gICAgIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICIpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlMDJYIiwgc2F2ZWRfcGFja2V0W2ldKTsKKyAgICB9CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoIWdwb25fdXRpbHNfaXNfcmVnaXN0ZXJlZCkKKyAgICB7CisgICAgICAgIGdwb25fdXRpbHNfaXNfcmVnaXN0ZXJlZCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgLyogU3Vic2NyaWJlIGZvciBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X2Rldl9zZWxfaW5kX3JlZ2lzdGVyKGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19kZXZpY2VfY2hhbmdlX2luZCk7CisgICAgfQorICAgIHJldHVybiBlcnIgPyBlcnIgOiBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfY3JlYXRlKHRvcF9kaXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2NyZWF0ZShiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBnZW5lcmF0ZWRfcGFja2V0X3BhdHRlcm5fdGFibGVbXSA9CisgICAgeworICAgICAgICB7IC5uYW1lID0gImJ5dGVfY3ljbGUiLCAudmFsID0gR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0JZVEVfQ1lDTEUgfSwKKyAgICAgICAgeyAubmFtZSA9ICJ3b3JkX2N5Y2xlIiwgLnZhbCA9IEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9XT1JEX0NZQ0xFIH0sCisgICAgICAgIHsgLm5hbWUgPSAiY29uc3QiLCAgICAgIC52YWwgPSBHRU5FUkFURURfUEFDS0VUX1BBVFRFUk5fQ09OU1QgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBzdGF0aWMgYmNtY2xpX3Bhcm1fdmFsdWUgZ2VtX3BvcnRfaWRzW01BWF9HRU1fUE9SVFNfRk9SX1NFTkRdOworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBvbnVfaWRzW01BWF9PTlVTX0ZPUl9TRU5EXTsKKworICAgIGJjbWNsaV9lbnRyeSAqZGlyOworCisgICAgaWYgKGJjbWNsaV9kaXJfZmluZCh0b3BfZGlyLCAiZ3BvbiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgZ3Bvbl91dGlsc19jbGlfZGlyX2NsaV9kZXN0cm95KCk7CisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAiZ3BvbiIsICJDb21tb24gR1BPTi9YR1BPTiBmdW5jdGlvbnMiLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoCisgICAgICAgIGRpciwKKyAgICAgICAgImJ1aWxkX2NwdV9wYWNrZXQiLAorICAgICAgICAiQnVpbGQgYW5kIHNhdmUgQ1BVIHBhY2tldCIsCisgICAgICAgIGJ1aWxkX2NwdV9wYWNrZXRfY2IsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiY2FsY19jcmMiLCAiQXV0by1jYWxjdWxhdGUgQ1JDIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgKKyAgICAgICAgICAgICJwYWNrZXRfc2l6ZSIsICJGdWxsIHBhY2tldCBzaXplIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FLCAwLCBNQVhfUEFDS0VUX1NJWkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInBhdHRlcm4iLCAiQmFja2dyb3VuZCBwYXR0ZXJuIiwgZ2VuZXJhdGVkX3BhY2tldF9wYXR0ZXJuX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJjb25zdF92YWx1ZSIsICJDb25zdCB2YWx1ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSwgMCwgMHhGRiksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImV0aF9kYSIsICJFdGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fTUFDLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJldGhfc2EiLCAiRXRoZXJuZXQgc291cmNlIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9NQUMsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKAorICAgICAgICBkaXIsCisgICAgICAgICJidWlsZF9vbWNpX3BhY2tldCIsCisgICAgICAgICJCdWlsZCBhbmQgc2F2ZSBPTUNJIHBhY2tldCIsCisgICAgICAgIGJ1aWxkX29tY2lfcGFja2V0X2NiLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImNhbGNfY3JjIiwgIkF1dG8tY2FsY3VsYXRlIENSQyIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoCisgICAgICAgICAgICAicGFja2V0X3NpemUiLCAiRnVsbCBwYWNrZXQgc2l6ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSwgMCwgTUFYX1BBQ0tFVF9TSVpFKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJwYXR0ZXJuIiwgIkJhY2tncm91bmQgcGF0dGVybiIsIGdlbmVyYXRlZF9wYWNrZXRfcGF0dGVybl90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiY29uc3RfdmFsdWUiLCAiQ29uc3QgdmFsdWUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUsIDAsIDB4RkYpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRCgKKyAgICAgICAgZGlyLAorICAgICAgICAic2VuZF90b19nZW0iLAorICAgICAgICAiU2VuZCBzYXZlZCBDUFUvT01DSSBwYWNrZXQgdG8gR0VNIHBvcnQocykiLAorICAgICAgICBzZW5kX3RvX2dlbV9jYiwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZGV2aWNlIiwgIkRldmljZSBJRCIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInBvbl9uaSIsICJQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0FSUkFZKAorICAgICAgICAgICAgImdlbSIsCisgICAgICAgICAgICAiR0VNIHBvcnQgSURzLCBjb21tYSBzZXBhcmF0ZWQiLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgIE1BWF9HRU1fUE9SVFNfRk9SX1NFTkQsCisgICAgICAgICAgICBnZW1fcG9ydF9pZHMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJjb3VudCIsICJOdW1iZXIgb2YgcGFja2V0cyAoZGVmYXVsdCAxKSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRCgKKyAgICAgICAgZGlyLAorICAgICAgICAic2VuZF90b19vbnUiLAorICAgICAgICAiU2VuZCBzYXZlZCBDUFUvT01DSSBwYWNrZXQgdG8gT05VKHMpIChPTUNJIEdFTSBwb3J0KSIsCisgICAgICAgIHNlbmRfdG9fb251X2NiLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJkZXZpY2UiLCAiRGV2aWNlIElEIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uX25pIiwgIlBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoCisgICAgICAgICAgICAib251IiwKKyAgICAgICAgICAgICJPTlUgSURzLCBjb21tYSBzZXBhcmF0ZWQiLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgIE1BWF9PTlVTX0ZPUl9TRU5ELAorICAgICAgICAgICAgb251X2lkcyksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImNvdW50IiwgIk51bWJlciBvZiBwYWNrZXRzIChkZWZhdWx0IDEpIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTSgKKyAgICAgICAgZGlyLAorICAgICAgICAiZHVtcF9wYWNrZXQiLAorICAgICAgICAiUHJpbnQgc2F2ZWQgQ1BVL09NQ0kgcGFja2V0IGRhdGEiLAorICAgICAgICBkdW1wX3BhY2tldF9jYik7CisKKyAgICBncG9uX3V0aWxzX2NsaV9kaXIgPSBkaXI7CisgICAgZ3Bvbl91dGlsc19jbGlfdG9wX2RpciA9IHRvcF9kaXI7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTM4MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHMuaApAQCAtMCwwICsxLDM3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX0dQT05fVVRJTFNfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfR1BPTl9VVElMU19IXworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2N2UyMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIyBEUG9FIFNlY3VyaXR5CisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCisJTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX2Rwb2Vfc2VjCisJTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IG9zIGhvc3RfYXBpIGJjbV91c2VyX2FwcGxfZXBvbl9vYW0KKworCXNyY3MgPSBiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmMgZHBvZV9lYXBfdGxzLmMgZHBvZV9zZWNfZnNtLmMgZHBvZV9zZWNfbWthX2ZzbS5jIGRwb2Vfc2VjX3V0aWwuYyBta2EuYworCitlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2JjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YmNiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2JjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuYwpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX2ZzbS5oIgorCitzdGF0aWMgYmNtb3NfYm9vbCBpc19ydW5uaW5nID0gQkNNT1NfRkFMU0U7CisKK3N0YXRpYyBiY21vc19ib29sIGNlcnRfYXV0aG9yaXR5X3RydXN0X3BsYWNlaG9sZGVyKGRwb2Vfc2VjX2xpbmtfcmVjKiBsaW5rX3JlYykKK3sKKyAgICBCQ01fTE9HKElORk8sIGRwb2Vfc2VjX2xvZ19pZFtsaW5rX3JlYy0+ZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHZhbGlkYXRlIHRoZSBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGxpbmsgcmVjb3JkIGFuZCBkZWNpZGUgd2hldGhlciB0byBhY2NlcHQgdGhpcyBhdXRoZW50aWNhdGlvbi5cbiIpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitzdGF0aWMgdm9pZCBmc21fY29tcGxldGVfcGxhY2Vob2xkZXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXksIGJjbW9zX2Vycm5vIHN0YXR1cykKK3sKKyAgICBpZiAoc3RhdHVzID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRwb2Vfc2VjX2xvZ19pZFtkZXZpY2VdLCAiVGhlIERQb0UgU2VjdXJpdHkgRlNNIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIFRoaXMgbGluayBjYW4gbm93IGJlIGNvbmZpZ3VyZWQgZm9yIHNlcnZpY2UuXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBkcG9lX3NlY19sb2dfaWRbZGV2aWNlXSwgIlRoZSBEUG9FIFNlY3VyaXR5IEZTTSBmYWlsZWQgZHVlIHRvICVzICglZCkuIEFwcHJvcHJpYXRlIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gdG8gY29ycmVjdCB0aGlzIGVycm9yLlxuIiwgYmNtb3Nfc3RyZXJyb3Ioc3RhdHVzKSwgc3RhdHVzKTsKKyAgICB9Cit9CisKKyNpZmRlZiBFTkFCTEVfQ0xJCitzdGF0aWMgYmNtb3NfZXJybm8gZHBvZV9zZWNfY2xpX2F1dGgoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXk7CisgICAgZHBvZV9zZWNfZnNtX3N0YXJ0X2RhdGEgY2ZnOworCisgICAgbGlua19rZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb24iKS0+dmFsdWUudW51bWJlcjsKKyAgICBsaW5rX2tleS5tYWNfYWRkcmVzcyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udSIpLT52YWx1ZS5tYWM7CisgICAgY2ZnLmVuY19tb2RlID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtb2RlIiktPnZhbHVlLmVudW1fdmFsOworICAgIGNmZy5hdXRoID0gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiBkcG9lX3NlY19mc21fbGlua19zdGFydChjdXJyZW50X2RldmljZSwgbGlua19rZXksICZjZmcpOworfQorI2VuZGlmCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisjaWZkZWYgRU5BQkxFX0NMSQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpkaXJfbmFtZSA9ICJkcG9lX3NlYyI7CisKKyAgICBpZiAoYmNtY2xpX2Rpcl9maW5kKHRvcF9kaXIsIGRpcl9uYW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBiY21jbGlfZW50cnkgKmRwb2Vfc2VjX2RpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsIGRpcl9uYW1lLCAiRFBvRSBTZWN1cml0eSIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJVR19PTihOVUxMID09IGRwb2Vfc2VjX2Rpcik7CisKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGVuY19tb2RlX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyJub25lIiwgKGxvbmcpQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX05PTkV9LAorICAgICAgICB7IjFkb3duIiwgKGxvbmcpQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOfSwKKyAgICAgICAgeyIxMGRvd24iLCAobG9uZylCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0RPV059LAorICAgICAgICB7IjEwYmkiLCAobG9uZylCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZHBvZV9zZWNfZGlyLCAiYXV0aCIsICJBdXRoZW50aWNhdGUgT05VIiwgZHBvZV9zZWNfY2xpX2F1dGgsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInBvbiIsICJQT04gTkkiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgib251IiwgIk9OVSBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgibW9kZSIsICJFbmNyeXB0aW9uIG1vZGUiLCBlbmNfbW9kZV90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisjZW5kaWYKK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjX3Byb2Nlc3NfcHJveHlfcngoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X3Byb3h5X3J4ICpwcm94eV9yeCkKK3sKKyAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkICpjYXAgPSAoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopcHJveHlfcng7CisKKyAgICBpZiAoKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LID09IHByb3h5X3J4LT5oZHIub2JqX3R5cGUpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEID09IHByb3h5X3J4LT5oZHIuc3ViZ3JvdXApKQorICAgIHsKKyAgICAgICAgaWYgKChjYXAtPmRhdGEuZnJhbWUudmFsWzEyXSA9PSAweDg4KSAmJgorICAgICAgICAgICAgKGNhcC0+ZGF0YS5mcmFtZS52YWxbMTNdID09IDB4MDkpICYmCisgICAgICAgICAgICAoY2FwLT5kYXRhLmZyYW1lLnZhbFsxNF0gPT0gMHgwMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmZyYW1lX2NvcHk7CisKKyAgICAgICAgICAgIGZyYW1lX2NvcHkgPSBiY21vc19hbGxvYyhjYXAtPmRhdGEuZnJhbWUubGVuKTsKKyAgICAgICAgICAgIG1lbWNweShmcmFtZV9jb3B5LCBjYXAtPmRhdGEuZnJhbWUudmFsLCBjYXAtPmRhdGEuZnJhbWUubGVuKTsKKworICAgICAgICAgICAgZHBvZV9zZWNfZnNtX2xpbmtfcnhfb2FtKGRldmljZV9pZCwgY2FwLT5rZXksIGZyYW1lX2NvcHksIGNhcC0+ZGF0YS5mcmFtZS5sZW4pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybjsgLyogbm90IGEgZnJhbWUgY2FwdHVyZWQgb24gYSBsaW5rIC0gaWdub3JlICovCisgICAgfQorfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfaW5pdCh2b2lkKQoreworICAgIGlmIChpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRwb2Vfc2VjX2ZzbV9pbml0KGNlcnRfYXV0aG9yaXR5X3RydXN0X3BsYWNlaG9sZGVyLCBmc21fY29tcGxldGVfcGxhY2Vob2xkZXIpOworCisgICAgaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9iY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3MmY4YwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfRFBPRV9TRUNfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfRFBPRV9TRUNfSF8KKworI2luY2x1ZGUgImJjbWNsaS5oIgorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfcHJvY2Vzc19wcm94eV9yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfcHJveHlfcnggKnByb3h5X3J4KTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19pbml0KHZvaWQpOworCisjZW5kaWYgLyogX0JDTU9MVF9VU0VSX0FQUExfRFBPRV9TRUNfSF8gKi8KKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2VfZWFwX3Rscy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX2VhcF90bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVhODBhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX2VhcF90bHMuYwpAQCAtMCwwICsxLDE0ODMgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImRwb2VfZWFwX3Rscy5oIgorI2luY2x1ZGUgImJjbW9sdF9idWYuaCIKKyNpbmNsdWRlICJkcG9lX3NlY19mc20uaCIKKworLyogVGhlIGRlc3RpbmF0aW9uIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmb3IgRUFQT0wgcGFja2V0cy4gKi8KK3N0YXRpYyBjb25zdCBiY21vc19tYWNfYWRkcmVzcyBlYXBvbF9kc3RfbWFjID0geyB7IDB4MDEsIDB4ODAsIDB4YzIsIDB4MDAsIDB4MDAsIDB4MDMgfSB9OworCisvKiBUaGUgbGVuZ3RoIG9mIHRoZSBSU0Ega2V5IHVzZWQgaW4gdGhlIHNlcnZlcl9rZXlfZXhjaGFuZ2UgVExTIG1lc3NhZ2Ugc2VudCB0byB0aGUgT05VIGR1cmluZyBEUG9FIGJpLWRpcmVjdGlvbmFsCisgICBhdXRoZW50aWNhdGlvbi4gKi8KKyNkZWZpbmUgRFBPRV9CSV9SU0FfS0VZX1NJWkUgMjA0OAorCisvKiAyIDEyMDAgYnl0ZSBjZXJ0cyArIHNvbWUgb3ZlcmhlYWQuLi4uICovCisjZGVmaW5lIEVBUE9MX1BLVF9TSVpFIDUwMDAKKwordHlwZWRlZiBlbnVtCit7CisgICAgRUFQX0NPREVfUkVRVUVTVCA9IDEsCisgICAgRUFQX0NPREVfUkVTUE9OU0UsCisgICAgRUFQX0NPREVfU1VDQ0VTUywKKyAgICBFQVBfQ09ERV9GQUlMVVJFCit9IGVhcF9jb2RlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgZWFwX2NvZGU7CisgICAgdWludDhfdCBpZDsKKyAgICB1aW50MTZfdCBsZW5ndGg7Cit9IGVhcF9mcmFtZTsKKworI2RlZmluZSBFQVBfRlJBTUVfU0laRSA0CisKK3R5cGVkZWYgZW51bQoreworICAgIEVBUF9UWVBFX0lERU5USVRZID0gMSwKKyAgICBFQVBfVFlQRV9OT1RJRklDQVRJT04sCisgICAgRUFQX1RZUEVfTkFLLAorICAgIEVBUF9UWVBFX01ENSwKKyAgICBFQVBfVFlQRV9PVFAsCisgICAgRUFQX1RZUEVfR0VORVJJQ19UT0tFTl9DQVJELAorICAgIEVBUF9UWVBFX1RMUyA9IDEzCit9IGVhcF90eXBlOworCisjZGVmaW5lIFRMU19NQUpPUl9WRVJTSU9OIDMKKyNkZWZpbmUgVExTX01JTk9SX1ZFUlNJT04gMgorCisvKiBGaXJzdCB0aGUgRUFQIHN0cnVjdHVyZXMuLi4uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgYXV0aF9zdWJfdHlwZTsKKyAgICB1aW50OF90IGVhcF90bHNfZmxhZ3M7Cit9IGVhcF90bHNfaGRyOworCisjZGVmaW5lIEVBUF9UTFNfSERSX1NJWkUgMgorCisjZGVmaW5lIEVBUF9IRFJfU0laRSAoRUFQX0ZSQU1FX1NJWkUgKyBFQVBfVExTX0hEUl9TSVpFKQorCit0eXBlZGVmIGVudW0KK3sKKyAgICBUTFNfQ0hBTkdFX0NJUEhFUl9TUEVDX0lEID0gMjAsCisgICAgVExTX0FMRVJUX0lEID0gMjEsCisgICAgVExTX0hBTkRTSEFLRV9JRCA9IDIyLAorICAgIFRMU19BUFBMSUNBVElPTl9EQVRBX0lEID0gMjMsCit9IHRsc19jb250ZW50X3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBjb250ZW50X3R5cGU7CisgICAgdGxzX3Byb3RvY29sX3ZlcnNpb24gdGxzX3ZlcnNpb247CisgICAgdWludDE2X3QgdGxzX3JlY29yZF9sZW5ndGg7Cit9IHRsc19yZWNvcmRfaGRyOworCisjZGVmaW5lIFRMU19SRUNPUkRfSERSX1NJWkUgKDMgKyBQUk9UT0NPTF9WRVJTSU9OX1NJWkUpCisKKyNkZWZpbmUgRUFQX1RMU19GTEFHX0xFTkdUSF9PRkZTRVQgNworI2RlZmluZSBFQVBfVExTX0ZMQUdfTU9SRV9PRkZTRVQgNgorI2RlZmluZSBFQVBfVExTX0ZMQUdfU1RBUlRfT0ZGU0VUIDUKKyNkZWZpbmUgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQgKDFVIDw8IEVBUF9UTFNfRkxBR19MRU5HVEhfT0ZGU0VUKQorI2RlZmluZSBFQVBfVExTX0ZMQUdfTU9SRV9CSVQgKDFVIDw8IEVBUF9UTFNfRkxBR19NT1JFX09GRlNFVCkKKyNkZWZpbmUgRUFQX1RMU19GTEFHX1NUQVJUX0JJVCAoMVUgPDwgRUFQX1RMU19GTEFHX1NUQVJUX09GRlNFVCkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlYXBfZnJhbWUgaGRyOworICAgIGVhcF90bHNfaGRyIHRsczsKK30gZWFwX21zZ19idWY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZWFwb2xfbXNnX2hkciBoZHI7CisgICAgZWFwX21zZ19idWYgZWFwX21zZzsKK30gZWFwb2xfbXNnOworCisvKiBOb3cgdGhlIFRMUyByZWNvcmRzLiAqLwordHlwZWRlZiBzdHJ1Y3QgdGxzX3Nlc3Npb25faWQKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IHNlc3Npb25faWRbU0laRV9PRl9UTFNfU0VTU0lPTl9JRF07Cit9IHRsc19zZXNzaW9uX2lkOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBjbV9udWxsID0gMAorfSBjb21wcmVzc2lvbl9tZXRob2Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgdWludDhfdCBjb21wcmVzc2lvbl9tZXRob2Q7Cit9IGNvbXByZXNzaW9uX21ldGhvZHM7CisKK3R5cGVkZWYgZW51bQoreworICAgIFJTQV9TSUdOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisgICAgRFNTX1NJR04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKKyAgICBSU0FfRklYRURfREggICAgICAgICAgICAgICAgICAgICAgPSAzLAorICAgIERTU19GSVhFRF9ESCAgICAgICAgICAgICAgICAgICAgICA9IDQsCisgICAgUlNBX0VQSEVNRVJBTF9ESF9SRVNFUlZFRCAgICAgICAgID0gNSwKKyAgICBEU1NfRVBIRU1FUkFMX0RIX1JFU0VSVkVEICAgICAgICAgPSA2LAorICAgIEZPUlRFWlpBX0RNU19SRVNFUlZFRCAgICAgICAgICAgICA9IDIwLAorfSBjbGllbnRfY2VydGlmaWNhdGVfdHlwZTsKKworLyogRm9yIDIwNDggYml0IFJTQSBrZXkgKi8KKyNkZWZpbmUgU0laRV9PRl9SU0FfTU9EVUxVUyAyNTYKKyNkZWZpbmUgU0laRV9PRl9SU0FfRVhQT05FTlQgMworCit0eXBlZGVmIGVudW0KK3sKKyAgICBIU19IRUxMT19SRVFVRVNUID0gMCwKKyAgICBIU19DTElFTlRfSEVMTE8gPSAxLAorICAgIEhTX1NFUlZFUl9IRUxMTyA9IDIsCisgICAgSFNfQ0VSVElGSUNBVEUgPSAxMSwKKyAgICBIU19TRVJWRVJfS0VZX0VYQ0hBTkdFID0gMTIsCisgICAgSFNfQ0VSVElGSUNBVEVfUkVRVUVTVCA9IDEzLAorICAgIEhTX1NFUlZFUl9IRUxMT19ET05FID0gMTQsCisgICAgSFNfQ0VSVElGSUNBVEVfVkVSSUZZID0gMTUsCisgICAgSFNfQ0xJRU5UX0tFWV9FWENIQU5HRSA9IDE2LAorICAgIEhTX0ZJTklTSEVEID0gMjAsCit9IGhhbmRzaGFrZV90eXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgbXNnX2lkOworICAgIHVpbnQzMl90IG1zZ19sZW5ndGg7IC8qIGFjdHVhbGx5IFUyNCAqLworfSB0bHNfaGFuZHNoYWtlOworCisjZGVmaW5lIFRMU19IQU5EU0hBS0VfU0laRSA0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAqZWFwb2w7CisgICAgdWludDhfdCAqZWFwOworICAgIHVpbnQ4X3QgKmVhcF90bHM7CisgICAgdWludDhfdCAqdGxzX3JlYzsKK30gZWFwX2xlbmd0aF9maWVsZHM7CisKK3N0YXRpYyBmX2Rwb2Vfc2VjX2NlcnRfdHJ1c3RfY2IgX2NlcnRfdHJ1c3Q7CitzdGF0aWMgZl9kcG9lX3NlY19hdXRoX2NiIF9hdXRoX2NvbXBsZXRlOworCitzdGF0aWMgdm9pZCBfYnVmZmVyX2hhc2hfZGF0YShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19zaGExX3VwZGF0ZSgmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfaGFzaCwgYnVmLCBsZW4pOworICAgIGRwb2Vfc2VjX21kNV91cGRhdGUoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tZDVfaGFzaCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9lYXBfdGxzX2NvbXB1dGVfbWFzdGVyX3Nlc3Npb25fa2V5KGF1dGhfdHJhbnNfZGF0YSAqdHJhbnNfZGF0YSkKK3sKKyAgICB1aW50OF90IHNlZWRbKDIqIENPVU5UX09GX1JBTkRPTV9CWVRFUyldOworICAgIHVpbnQzMl90IHNlZWRfbGVuID0gMDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKHRyYW5zX2RhdGEgPT0gTlVMTCk7CisKKyAgICAvKiBUaGUgc2VlZCB0byB0aGUgUFJGIGlzIHRoZSBjbGllbnQgcmFuZG9tIHZhbHVlIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBzZXJ2ZXIgcmFuZG9tIHZhbHVlLiAqLworICAgIG1lbWNweSgmc2VlZFtzZWVkX2xlbl0sIHRyYW5zX2RhdGEtPmNsaWVudF9yYW5kb20sIENPVU5UX09GX1JBTkRPTV9CWVRFUyk7CisgICAgc2VlZF9sZW4gKz0gQ09VTlRfT0ZfUkFORE9NX0JZVEVTOworICAgIG1lbWNweSgmc2VlZFtzZWVkX2xlbl0sIHRyYW5zX2RhdGEtPnNlcnZlcl9yYW5kb20sIENPVU5UX09GX1JBTkRPTV9CWVRFUyk7CisgICAgc2VlZF9sZW4gKz0gQ09VTlRfT0ZfUkFORE9NX0JZVEVTOworCisgICAgZHBvZV9zZWNfcHJmX2V4cGFuZF80MzQ2KAorICAgICAgICB0cmFuc19kYXRhLT5wcmVfbWFzdGVyX3NlY3JldCwKKyAgICAgICAgc2l6ZW9mKHRyYW5zX2RhdGEtPnByZV9tYXN0ZXJfc2VjcmV0KSwKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikibWFzdGVyIHNlY3JldCIsCisgICAgICAgIHN0cmxlbigibWFzdGVyIHNlY3JldCIpLAorICAgICAgICBzZWVkLAorICAgICAgICBzZWVkX2xlbiwKKyAgICAgICAgdHJhbnNfZGF0YS0+bWFzdGVyX3NlY3JldCwKKyAgICAgICAgc2l6ZW9mKHRyYW5zX2RhdGEtPm1hc3Rlcl9zZWNyZXQpKTsKKyAgICBkcG9lX3NlY19wcmZfZXhwYW5kXzQzNDYoCisgICAgICAgIHRyYW5zX2RhdGEtPm1hc3Rlcl9zZWNyZXQsCisgICAgICAgIHNpemVvZih0cmFuc19kYXRhLT5tYXN0ZXJfc2VjcmV0KSwKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikiY2xpZW50IEVBUCBlbmNyeXB0aW9uIiwKKyAgICAgICAgc3RybGVuKCJjbGllbnQgRUFQIGVuY3J5cHRpb24iKSwKKyAgICAgICAgc2VlZCwKKyAgICAgICAgc2VlZF9sZW4sCisgICAgICAgIHRyYW5zX2RhdGEtPmtleV9tYXRlcmlhbCwKKyAgICAgICAgc2l6ZW9mKHRyYW5zX2RhdGEtPmtleV9tYXRlcmlhbCkpOworCisgICAgbWVtY3B5KHRyYW5zX2RhdGEtPm1hc3Rlcl9zZXNzaW9uX2tleSwgdHJhbnNfZGF0YS0+a2V5X21hdGVyaWFsLCBzaXplb2YodHJhbnNfZGF0YS0+bWFzdGVyX3Nlc3Npb25fa2V5KSk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcHJlcGFyZV9zZWN1cml0eV9kYXRhKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIC8qIElmIGJpZGlyZWN0aW9uYWwsIGNvbXB1dGUgdGhlIG1hc3RlciBzZXNzaW9uIGtleSBhbmQgZ2VuZXJhdGUgdGhlIFJTQSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpciAqLworICAgIGlmIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlID09IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkpCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX2NvbXB1dGVfbWFzdGVyX3Nlc3Npb25fa2V5KCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEpOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3NraXBfbGVuZ3RoKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3Qgc2tpcCwgdWludDhfdCoqIGxlbikKK3sKKyAgICAqbGVuID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAoYnVmLCBza2lwKTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19pbml0X2VhcF9oZHIoCisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLAorICAgIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICBlYXBfY29kZSBjb2RlLAorICAgIGVhcF9sZW5ndGhfZmllbGRzICpsZikKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgcmV0dXJuCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCBlYXBvbF9kc3RfbWFjKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgbGlua19yZWMtPm5pX21hYykgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCBFVEhFUlRZUEVfRUFQT0wpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBFQVBPTF9QUk9UT0NPTF9WRVJTSU9OX0RQT0UpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBFQVBPTF9UWVBFX1BBQ0tFVCkgJiYKKyAgICAgICAgLyogRWFwb2wgTGVuZ3RoIC0gd2UgcmUtY29tcHV0ZSB0aGlzIGFmdGVyIGJ1aWxkaW5nIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19za2lwX2xlbmd0aChidWYsIHNpemVvZih1aW50MTZfdCksICZsZi0+ZWFwb2wpICYmCisgICAgICAgIC8qIEVBUCBsYXllciBoZWFkZXJzICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBjb2RlKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgbGlua19yZWMtPmF1dGhfY3RybC5jdXJyZW50X3BhY2tldF9pZCsrKSAmJgorICAgICAgICAvKiBFQVAgbGVuZ3RoIC0gYWdhaW4sIGNvbXB1dGVkIHdoZW4gdGhlIHBhY2tldCBpcyBwYWNrZWQhICovCisgICAgICAgIF9kcG9lX2VhcF90bHNfc2tpcF9sZW5ndGgoYnVmLCBzaXplb2YodWludDE2X3QpLCAmbGYtPmVhcCk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfaW5pdF90bHNfaGRyKGJjbW9sdF9idWYgKmJ1ZiwgdWludDhfdCBlYXBUbHNGbGFncywgZWFwX2xlbmd0aF9maWVsZHMgKmxmKQoreworICAgIGJjbW9zX2Jvb2wgcmMgPSBCQ01PU19GQUxTRTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgRUFQX1RZUEVfVExTKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgZWFwVGxzRmxhZ3MpKQorICAgIHsKKyAgICAgICAgaWYgKChlYXBUbHNGbGFncyAmIEVBUF9UTFNfRkxBR19MRU5HVEhfQklUKSA9PSBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRUFQLVRMUyBsZW5ndGggLSBjb21wdXRlZCBhdCBwYWNrIGNvbXBsZXRpb24gb25seSBhbGxvY2F0ZSByb29tIGZvciB0aGlzIGlmIEVhcFRsc0ZsYWdMZW5ndGhCaXQgaXMgc2V0CisgICAgICAgICAgICAgICBCdXQgaWYgdGhlIEVhcFRsc0ZsYWdMZW5ndGhCaXQgaXMgc2V0LCB3ZSBhbHNvIHdyaXRlIHRoZSBUTFMgUmVjb3JkIGhlYWRlci4gKi8KKyAgICAgICAgICAgIGlmIChfZHBvZV9lYXBfdGxzX3NraXBfbGVuZ3RoKGJ1Ziwgc2l6ZW9mKHVpbnQzMl90KSwgJmxmLT5lYXBfdGxzKSAmJgorICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBUTFNfSEFORFNIQUtFX0lEKSAmJgorICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBUTFNfTUFKT1JfVkVSU0lPTikgJiYKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgVExTX01JTk9SX1ZFUlNJT04pICYmCisgICAgICAgICAgICAgICAgLyogQW5vdGhlciBsZW5ndGggZmllbGQsIHRoZSBUTFMgcmVjb3JkIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfc2tpcF9sZW5ndGgoYnVmLCBzaXplb2YodWludDE2X3QpLCAmbGYtPnRsc19yZWMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX2Rwb2VfZWFwX3Rsc19wYWNrX2hhbmRzaGFrZV9sZW5ndGgoCisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLAorICAgIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICB1aW50OF90ICpzdGFydCwKKyAgICB1aW50OF90ICpsZW4pCit7CisgICAgdWludDMyX3QgcmVjX2xlbjsKKyAgICB1aW50OF90ICplbmQ7CisKKyAgICAvKiBOb3cgZ28gYmFjayBhbmQgZmlsbCBpbiB0aGUgbGVuZ3RoIGZpZWxkLiAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBUbHNIYW5kc2hha2UgcmVjb3JkICovCisgICAgZW5kID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIHJlY19sZW4gPSBlbmQgLSBzdGFydDsKKyAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIGxlbik7CisgICAgYmNtb2x0X2J1Zl93cml0ZV91MjQoYnVmLCB1aW50MzJfdG9fMjQocmVjX2xlbiAtIFRMU19IQU5EU0hBS0VfU0laRSkpOworICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgZW5kKTsKKyAgICBfYnVmZmVyX2hhc2hfZGF0YShsaW5rX3JlYywgc3RhcnQsIHJlY19sZW4pOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhY2tfc2VydmVyX2hlbGxvX2hzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgKnN0YXJ0OworICAgIHVpbnQ4X3QgKmxlbjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBzdGFydCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKyAgICBpZiAoYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEhTX1NFUlZFUl9IRUxMTykgJiYKKyAgICAgICAgKGxlbiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKSwgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgc2l6ZW9mKHVpbnQyNF90KSkpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWFqb3IpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGUoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2VydmVyX3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNlcnZlcl9yYW5kb20sIENPVU5UX09GX1JBTkRPTV9CWVRFUykgJiYKKworICAgICAgICAvKiBDaXBoZXIgU3VpdGVzIC0gd2Ugd3JpdGUgMCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBDaXBoZXIgU3VpdGVzCisgICAgICAgICAgIFNob3J0IGNpcmN1aXQgaWYgdXNpbmcgcHJlLXJlbGVhc2UgYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgKChsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPT0gMykgfHwgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCAwKSkgJiYKKworICAgICAgICAvKiBDb21wcmVzc2lvbk1ldGhvZHMgYWxzbyB3cml0ZSAwIGFzIHRoZSBsZW5ndGggKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIDApKQorICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX2hhbmRzaGFrZV9sZW5ndGgobGlua19yZWMsIGJ1Ziwgc3RhcnQsIGxlbik7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfa2V5X2V4Y2hhbmdlX2hzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgKnN0YXJ0OworICAgIHVpbnQ4X3QgKmxlbjsKKyAgICB1aW50OF90IHJzYV9tb2R1bHVzW1NJWkVfT0ZfUlNBX01PRFVMVVNdID0ge307CisgICAgdWludDhfdCByc2FfZXhwb25lbnRbU0laRV9PRl9SU0FfRVhQT05FTlRdID0ge307CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgLyogSWYgbm90IGJpZGlyZWN0aW9uYWwsIGp1c3QgcmV0dXJuIEJDTU9TX1RSVUUgKi8KKyAgICBpZiAobGlua19yZWMtPmNmZy5lbmNfbW9kZSAhPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgLyogVmVyaWZ5IHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgcHVibGljIGtleSAobW9kdWx1cykgb2YgdGhlIHByaXZhdGUga2V5IG1hdGNoZXMgdGhlIGV4cGVjdGVkIGxlbmd0aC4gQWxzbywgdmVyaWZ5CisgICAgICAgdGhhdCB0aGUgbW9kdWx1cyBpcyBzdWNjZXNzZnVsbHkgcmVhZCBmcm9tIHRoZSBSU0Ega2V5LiAqLworICAgIHN0YXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIGlmICgoZHBvZV9zZWNfcnNhX3B1YmxpY19nZXQobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnJzYSwgcnNhX21vZHVsdXMsIHJzYV9leHBvbmVudCkpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBIU19TRVJWRVJfS0VZX0VYQ0hBTkdFKSAmJgorICAgICAgICAobGVuID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpLCBiY21vbHRfYnVmX3NraXAoYnVmLCBzaXplb2YodWludDI0X3QpKSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZShidWYsIHJzYV9tb2R1bHVzLCBzaXplb2YocnNhX21vZHVsdXMpKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgcnNhX2V4cG9uZW50LCBzaXplb2YocnNhX2V4cG9uZW50KSkpCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfaGFuZHNoYWtlX2xlbmd0aChsaW5rX3JlYywgYnVmLCBzdGFydCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wYWNrX2NlcnRfcmVxX2hzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgKnN0YXJ0OworICAgIHVpbnQ4X3QgKmxlbjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBzdGFydCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKyAgICBpZiAoYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEhTX0NFUlRJRklDQVRFX1JFUVVFU1QpICYmCisgICAgICAgIChsZW4gPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1ZiksIGJjbW9sdF9idWZfc2tpcChidWYsIHNpemVvZih1aW50MjRfdCkpKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgMSkgJiYgLyogbGVuZ3RoIG9mICdDZXJ0aWZpY2F0ZSBUeXBlJyAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgUlNBX1NJR04pICYmIC8qIENlcnRpZmljYXRlIFR5cGUgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCAwKSkgLyogemVybyBsZW5ndGggZm9yIGNlcnQgYXV0aG9yaXRpZXMgKi8KKyAgICB7CisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19oYW5kc2hha2VfbGVuZ3RoKGxpbmtfcmVjLCBidWYsIHN0YXJ0LCBsZW4pOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhY2tfc2VydmVyX2hlbGxvX2RvbmVfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIHN0YXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIGlmIChiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgSFNfU0VSVkVSX0hFTExPX0RPTkUpICYmCisgICAgICAgIChsZW4gPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1ZiksIGJjbW9sdF9idWZfc2tpcChidWYsIHNpemVvZih1aW50MjRfdCkpKSkKKyAgICB7CisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19oYW5kc2hha2VfbGVuZ3RoKGxpbmtfcmVjLCBidWYsIHN0YXJ0LCBsZW4pOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhY2tfZmluaXNoZWRfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworCisgICAgc3RhcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgaWYgKGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBIU19GSU5JU0hFRCkgJiYKKyAgICAgICAgKGxlbiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKSwgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgc2l6ZW9mKHVpbnQyNF90KSkpKQorICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX2hhbmRzaGFrZV9sZW5ndGgobGlua19yZWMsIGJ1Ziwgc3RhcnQsIGxlbik7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19tc2dfbGVuZ3RocyhiY21vbHRfYnVmICpidWYsIHVpbnQ4X3QgZWFwX3Rsc19mbGFncywgZWFwX2xlbmd0aF9maWVsZHMgKmxmKQoreworICAgIHVpbnQxNl90IGVhcG9sX2xlbmd0aDsKKyAgICB1aW50MzJfdCBlYXBfdGxzX2xlbmd0aDsKKyAgICB1aW50OF90ICpzbmFwID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworICAgIEJVR19PTihsZiA9PSBOVUxMKTsKKworICAgIGVhcG9sX2xlbmd0aCA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoYnVmKSAtIEVBUE9MX01TR19IRFJfU0laRTsKKworICAgIC8qIFNlZW1zIG9kZCB0aGF0IHRoZXNlIHR3byB3b3VsZCBiZSB0aGUgc2FtZS4gQnV0IGVhcG9sTGVuZ3RoIGlzIGRlZmluZWQgYXMgdGhlIGxlbmd0aCBvZiB0aGUgYm9keSBmaWVsZHMgb2YgdGhlCisgICAgICAgRWFwb2wgYnVmZmVyLCB3aGljaCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBFYXBvbCBoZWFkZXIuIEVBUCBpcyBkaWZmZXJlbnQsIHRoZSBFQVAgbGVuZ3RoIGlzIGRlZmluZSB0byBpbmNsdWRlIHRoZQorICAgICAgIGVudGlyZSBFQVAgcGFja2V0LCBpbmNsdWRpbmcgdGhlIGhlYWRlci4gKi8KKyAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIGxmLT5lYXBvbCk7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShidWYsIGVhcG9sX2xlbmd0aCkpCisgICAgeworICAgICAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIHNuYXApOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBsZi0+ZWFwKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKGJ1ZiwgZWFwb2xfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1Ziwgc25hcCk7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGVhcF90bHNfZmxhZ3MgJiBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCkgPT0gRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQpCisgICAgeworICAgICAgICAvKiBUaGUgVExTIG1lc3NhZ2UgbGVuZ3RoIC0gdGFrZSBhd2F5IHRoZSBFYXBUbHNIZHIsIEFORCB0aGUgRWFwTXNnSGRyIHdoaWNoLCBzdXJwcmlzaW5nbHkgd2FzIG5vdCByZW1vdmVkIGluCisgICAgICAgICAgIHRoZSBwcmV2aW91cyBzdGVwLiAqLworICAgICAgICBlYXBfdGxzX2xlbmd0aCA9IGVhcG9sX2xlbmd0aCAtIChFQVBfRlJBTUVfU0laRSArIEVBUF9UTFNfSERSX1NJWkUgKyBzaXplb2YodWludDMyX3QpKTsKKworICAgICAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIGxmLT5lYXBfdGxzKTsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShidWYsIGVhcF90bHNfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBzbmFwKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgbGYtPnRsc19yZWMpOworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKGJ1ZiwgKHVpbnQxNl90KWVhcF90bHNfbGVuZ3RoIC0gVExTX1JFQ09SRF9IRFJfU0laRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1Ziwgc25hcCk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIHNuYXApOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2VfZWFwX3Rsc19wYWNrX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICB1aW50OF90IGZsYWdzID0gRUFQX1RMU19GTEFHX1NUQVJUX0JJVDsKKyAgICBlYXBfbGVuZ3RoX2ZpZWxkcyBsZjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBpZiAoX2Rwb2VfZWFwX3Rsc19pbml0X2VhcF9oZHIobGlua19yZWMsIGJ1ZiwgRUFQX0NPREVfUkVRVUVTVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX2luaXRfdGxzX2hkcihidWYsIGZsYWdzLCAmbGYpICYmCisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19tc2dfbGVuZ3RocyhidWYsIGZsYWdzLCAmbGYpKQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19zZW5kX2NlcnRfcmVxdWVzdChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfYm9vbCByYyA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90ICptc2cgPSBOVUxMOworICAgIGVhcF9sZW5ndGhfZmllbGRzIGxmOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBtc2cgPSBiY21vc19jYWxsb2MoRUFQT0xfUEtUX1NJWkUpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBsZW5ndGggRUFQLVRMUyBtZXNzYWdlIGJ1ZmZlci4gVGhlIHZhcmlvdXMgVExTIHJlY29yZHMgY29udGFpbmVkIGluIGFuIEVBUC1UTFMKKyAgICAgICBtZXNzYWdlIGFyZSB2YXJpYWJsZSBzaXplLiBIb3dldmVyLCB0aGlzIGNhbiBvbmx5IGJlIGEgY29tYmluZWQgbWF4aW11bSBsZW5ndGguICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIEVBUE9MX1BLVF9TSVpFLCBtc2csIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICBpZiAoX2Rwb2VfZWFwX3Rsc19pbml0X2VhcF9oZHIobGlua19yZWMsICZidWYsIEVBUF9DT0RFX1JFUVVFU1QsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19pbml0X3Rsc19oZHIoJmJ1ZiwgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQsICZsZikpCisgICAgeworICAgICAgICAvKiBUaGUgQ2VydCByZXF1ZXN0IGNvbnRhaW5zIDMgb3IgNCBUTFMgcmVjb3JkcyAoMyBmb3IgRFMtb25seSBhbmQgNCBmb3IgYmktZGlyZWN0aW9uYWwpLiBUaGUgVExTIHJlY29yZHMgYXJlCisgICAgICAgICAgIG9yZGVyZWQgYXM6CisgICAgICAgICAgIC0gU2VydmVyIEhlbGxvCisgICAgICAgICAgIC0gU2VydmVyIEtleSBFeGNoYW5nZSAoaWYgYmktZGlyZWN0aW9uYWwpCisgICAgICAgICAgIC0gQ2VydGlmaWNhdGUgUmVxdWVzdAorICAgICAgICAgICAtIFNlcnZlciBIZWxsbyBEb25lICovCisgICAgICAgIGlmIChfZHBvZV9lYXBfdGxzX3BhY2tfc2VydmVyX2hlbGxvX2hzKGxpbmtfcmVjLCAmYnVmKSAmJgorICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX3NlcnZlcl9rZXlfZXhjaGFuZ2VfaHMobGlua19yZWMsICZidWYpICYmCisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfY2VydF9yZXFfaHMobGlua19yZWMsICZidWYpICYmCisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfc2VydmVyX2hlbGxvX2RvbmVfaHMobGlua19yZWMsICZidWYpKQorICAgICAgICB7CisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfbXNnX2xlbmd0aHMoJmJ1ZiwgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQsICZsZik7CisKKyAgICAgICAgICAgIC8qIFNlbmQgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGVyciA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShtc2cpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gaGFzIGJlZ3VuLiAqLworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfRUFQX1NUQVJUOworICAgICAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSB0aGUgbWVzc2FnZS4gKi8KKyAgICBiY21vc19mcmVlKG1zZyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3NlbmRfZmluaXNoZWRfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90ICptc2cgPSBOVUxMOworICAgIGVhcF9sZW5ndGhfZmllbGRzIGxmOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBtc2cgPSBiY21vc19jYWxsb2MoRUFQT0xfUEtUX1NJWkUpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIEVBUC1UTFMgbWVzc2FnZSBidWZmZXIuICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIEVBUE9MX1BLVF9TSVpFLCBtc2csIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICBpZiAoX2Rwb2VfZWFwX3Rsc19pbml0X2VhcF9oZHIobGlua19yZWMsICZidWYsIEVBUF9DT0RFX1JFUVVFU1QsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19pbml0X3Rsc19oZHIoJmJ1ZiwgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX2ZpbmlzaGVkX2hzKGxpbmtfcmVjLCAmYnVmKSkKKyAgICB7CisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19tc2dfbGVuZ3RocygmYnVmLCBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCwgJmxmKTsKKyAgICAgICAgLyogTm8gZXJyb3IgZGV0ZWN0aW9uIGhlcmUuIFdlIGhhdmUgYWxyZWFkeSBhdXRoZW50aWNhdGVkLiB0aGlzIG1lc3NhZ2UgaXMganVzdCBmb3Igc3RhbmRhcmRzIGNvbXBsaWFuY2UgKi8KKyAgICAgICAgcmMgPSBkcG9lX3NlY19zZW5kX2VhcG9sKGxpbmtfcmVjLT5kZXZpY2UsICZsaW5rX3JlYy0+a2V5LCBtc2csIGJjbW9sdF9idWZfZ2V0X3VzZWQoJmJ1ZikpOworICAgIH0KKworICAgIC8qIEZyZWUgdGhlIG1lc3NhZ2UuICovCisgICAgYmNtb3NfZnJlZShtc2cpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2VfZWFwX3Rsc19zZW5kX3Jlc3VsdChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGVhcF9jb2RlIHJlc3VsdCkKK3sKKyAgICB1aW50OF90ICptc2c7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgIGVhcF9sZW5ndGhfZmllbGRzIGxmOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgRUFQLVRMUyBtZXNzYWdlIGJ1ZmZlci4gKi8KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgRUFQT0xfUEtUX1NJWkUsIG1zZywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIC8qIEVuY29kZSB0aGUgRUFQLVN1Y2Nlc3MgbWVzc2FnZSB0byB0aGUgYnVmZmVyLiAqLworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgJmJ1ZiwgcmVzdWx0LCAmbGYpICYmCisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19tc2dfbGVuZ3RocygmYnVmLCAwLCAmbGYpKQorICAgIHsKKyAgICAgICAgcmMgPSBkcG9lX3NlY19zZW5kX2VhcG9sKGxpbmtfcmVjLT5kZXZpY2UsICZsaW5rX3JlYy0+a2V5LCBtc2csIGJjbW9sdF9idWZfZ2V0X3VzZWQoJmJ1ZikpOworICAgIH0KKworICAgIGJjbW9zX2ZyZWUobXNnKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wYXJzZV9jZXJ0aWZpY2F0ZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY21vc19ib29sICAgICAgICAgICAgcmMgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50MjRfdCBsZW5ndGg7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3UyNChidWYsICZsZW5ndGgpICYmCisgICAgICAgICgobGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuID0gKHVpbnQxNl90KXVpbnQyNF90b18zMihsZW5ndGgpKSwgKGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydExlbiA8PSBFQVBPTF9QS1RfU0laRSkpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZChidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUsIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydExlbikpCisgICAgeworICAgICAgICByYyA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhcnNlX2NsaWVudF9rZXlfZXhjaGFuZ2UoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfYm9vbCByYyA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB1aW50OF90IGVuY3J5cHRlZF9idWZbU0laRV9PRl9SU0FfRU5DUllQVEVEX0JMT0NLXSA9IHt9OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChiY21vbHRfYnVmX3JlYWRfdTE2X2JlKGJ1ZiwgJmxlbmd0aCkgJiYKKyAgICAgICAgKGxlbmd0aCA9PSAoU0laRV9PRl9SU0FfRU5DUllQVEVEX0JMT0NLKSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgZW5jcnlwdGVkX2J1Ziwgc2l6ZW9mKGVuY3J5cHRlZF9idWYpKSkKKyAgICB7CisgICAgICAgIGludCB2YWw7CisKKyAgICAgICAgdmFsID0gZHBvZV9zZWNfcnNhX3ByaXZhdGVfZGVjcnlwdCgKKyAgICAgICAgICAgIHNpemVvZihlbmNyeXB0ZWRfYnVmKSwKKyAgICAgICAgICAgIGVuY3J5cHRlZF9idWYsCisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEucHJlX21hc3Rlcl9zZWNyZXQsCisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEucnNhKTsKKworICAgICAgICBpZiAodmFsID09IFNJWkVfT0ZfUFJFX01BU1RFUl9TRUNSRVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdlIG5vdyBuZWVkIHRoZSBzZWN1cml0eSBkYXRhIC0gd2UgaGF2ZSB0aGUgImNsaWVudCByYW5kb20iLCAic2VydmVyIHJhbmRvbSIsIGFuZCAicHJlIG1hc3RlciBzZWNyZXQiLiAqLworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19wcmVwYXJlX3NlY3VyaXR5X2RhdGEobGlua19yZWMpOworICAgICAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiUlNBIGRlY3J5cHQgcHJlLW1hc3RlciBzZWNyZXQgZmFpbGVkOiAlZFxuIiwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJGYWlsZWQgdG8gcGFyc2UgY2xpZW50IGtleSBleGNoYW5nZTogJXVcbiIsIGxlbmd0aCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhcnNlX2NlcnRfdmVyaWZ5KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBiY21vc19ib29sIHJldCA9IEJDTU9TX0ZBTFNFOworCisgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmbGVuZ3RoKSAmJgorICAgICAgICAobGVuZ3RoIDw9ICgyICogU0laRV9PRl9SU0FfRU5DUllQVEVEX0JMT0NLKSkpCisgICAgeworICAgICAgICBiY21vbHRfYnVmIGNlcnRfYnVmOworICAgICAgICB1aW50MjRfdCB0ZW1wOworICAgICAgICBjb25zdCB1aW50OF90ICpjZXJ0OworICAgICAgICB1aW50MzJfdCBjZXJ0X2xlbiA9IDA7CisgICAgICAgIHVpbnQ4X3QgY2VydF92ZXJpZnlbc2l6ZW9mKGRwb2Vfc2VjX3NoYTFfZGlnZXN0KSArIHNpemVvZihkcG9lX3NlY19tZDVfZGlnZXN0KV07CisgICAgICAgIHVpbnQ4X3QgKmVuY19idWY7CisgICAgICAgIGRwb2Vfc2VjX3JzYV9rZXkgKnJzYTsKKworICAgICAgICBiY21vbHRfYnVmX2luaXQoJmNlcnRfYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRMZW4sIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKworICAgICAgICAvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIE9OVSBjZXJ0IGFuZCBpdHMgbGVuZ3RoICovCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MjQoJmNlcnRfYnVmLCAmdGVtcCk7CisgICAgICAgIGNlcnRfbGVuID0gdWludDI0X3RvXzMyKHRlbXApOworICAgICAgICBjZXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldCgmY2VydF9idWYpOworCisgICAgICAgIGVuY19idWYgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgICAgIGJjbW9sdF9idWZfc2tpcChidWYsIGxlbmd0aCk7CisKKyAgICAgICAgLyogR2V0IHRoZSBwdWJsaWMga2V5IGZyb20gdGhlIE9OVSBjZXJ0LiAqLworICAgICAgICByc2EgPSBkcG9lX3NlY194NTA5X3B1Yl9rZXlfZ2V0KGNlcnQsIGNlcnRfbGVuKTsKKworICAgICAgICAvKiBkZWNyeXB0IHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZiB3aXRoIHRoZSBPTlUgY2VydC4gKi8KKyAgICAgICAgaWYgKHJzYSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBvZV9zZWNfcnNhX3B1YmxpY19kZWNyeXB0KGxlbmd0aCwgZW5jX2J1ZiwgY2VydF92ZXJpZnksIHJzYSkgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSU0Ffc2l6ZSgpIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgaW4gYnl0ZXMuIENvbnZlcnQgdG8gYml0cy4gKi8KKyAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9jZXJ0X2tleV9zaXplID0gZHBvZV9zZWNfcnNhX3NpemUocnNhKSAqIDg7CisKKyAgICAgICAgICAgICAgICAvKiBDb21wYXJlIHRoZSBvdXRwdXQgKHNob3VsZCBiZSAzNiBieXRlcykgdG8gc2hhMS9tZDUgbWVzc2FnZXMgZGlnZXN0cyBJZiB0aGV5IG1hdGNoLCB3ZSBhcmUgZ29vZCAqLworICAgICAgICAgICAgICAgIGlmICgobWVtY21wKCZjZXJ0X3ZlcmlmeVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWQ1X2RpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHBvZV9zZWNfbWQ1X2RpZ2VzdCkpID09IDApICYmCisgICAgICAgICAgICAgICAgICAgIChtZW1jbXAoJmNlcnRfdmVyaWZ5W3NpemVvZihkcG9lX3NlY19tZDVfZGlnZXN0KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkcG9lX3NlY19zaGExX2RpZ2VzdCkpID09IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9pbml0KCZjZXJ0X2J1ZiwgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuLCBsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRpZmljYXRlLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBPTlUgY2VydGlmaWNhdGUuICovCisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MjQoJmNlcnRfYnVmLCAmdGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2NlcnRfbGVuID0gdWludDI0X3RvXzMyKHRlbXApOworICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9jZXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldCgmY2VydF9idWYpOworCisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2tpcCgmY2VydF9idWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2NlcnRfbGVuKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIE1hbnVmYWN0dXJlciBDQSBjZXJ0aWZpY2F0ZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UyNCgmY2VydF9idWYsICZ0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5tZmdfY2VydF9sZW4gPSB1aW50MjRfdG9fMzIodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwubWZnX2NlcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KCZjZXJ0X2J1Zik7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiQ2VydCBWZXJpZnkgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiUlNBIHB1YmxpYyBkZWNyeXB0L3ZlcmlmeSBmYWlsZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHJldHJpZXZlIFJTQSBrZXlcbiIpOworICAgICAgICB9CisKKyAgICAgICAgZHBvZV9zZWNfcnNhX2tleV9mcmVlKHJzYSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wYXJzZV92ZXJpZnlfZGF0YShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfYm9vbCByYyA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1pbm9yID09IFRMU19NSU5PUl9WRVJTSU9OKQorICAgIHsKKyAgICAgICAgLyogVGhpcyB2ZXJzaW9uIG9mIGF1dGhlbnRpY2F0aW9uIGRvZXMgbm90IHBhcnNlIHZlcmlmeSBkYXRhICovCisgICAgICAgIHJjID0gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhcnNlX2NsaWVudF9oZWxsbyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB0bHNfcHJvdG9jb2xfdmVyc2lvbiB2ZXJzaW9uOworICAgIHRsc19zZXNzaW9uX2lkIHNlc3Npb25faWQ7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91OChidWYsICZ2ZXJzaW9uLm1ham9yKSAmJgorICAgICAgICAodmVyc2lvbi5tYWpvciA9PSBUTFNfTUFKT1JfVkVSU0lPTikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnZlcnNpb24ubWlub3IpICYmCisgICAgICAgICh2ZXJzaW9uLm1pbm9yID49IFRMU19NSU5PUl9WRVJTSU9OKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuY2xpZW50X3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmc2Vzc2lvbl9pZC5sZW5ndGgpICYmCisgICAgICAgIChzZXNzaW9uX2lkLmxlbmd0aCA8PSBzaXplb2Yoc2Vzc2lvbl9pZC5zZXNzaW9uX2lkKSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKGJ1Ziwgc2Vzc2lvbl9pZC5zZXNzaW9uX2lkLCBzZXNzaW9uX2lkLmxlbmd0aCkpCisgICAgeworICAgICAgICBjb21wcmVzc2lvbl9tZXRob2RzIGNvbXBfbWV0aG9kczsKKyAgICAgICAgdWludDE2X3QgdGx2TGVuOworICAgICAgICB1aW50OF90IGNpcGhlcl9zdWl0ZXNbMl07CisgICAgICAgIHVpbnQ4X3QgKmNtX3NuYXAgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisKKyAgICAgICAgbWVtc2V0KCZjb21wX21ldGhvZHMsIDAsIHNpemVvZihjb21wX21ldGhvZHMpKTsKKworICAgICAgICAvKiBDaXBoZXIgU3VpdGVzIG1heSBiZSBwcmVzZW50IC1pZiBzbyBwYXJzZSBvdmVyIGl0IGFuZCBpdCB3aWxsIGJlIGlnbm9yZWQuIFN0aWxsIGNoZWNrIHRoYXQgY29tcCBtZXRob2RzIGlzCisgICAgICAgICAgIE5VTEwgKi8KKyAgICAgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmdGx2TGVuKSAmJiAvKiBDaXBoZXIgU3VpdGVzICovCisgICAgICAgICAgICAodGx2TGVuIDw9IHNpemVvZih1aW50MTZfdCkpICYmCisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCBjaXBoZXJfc3VpdGVzLCB0bHZMZW4pICYmCisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmY29tcF9tZXRob2RzLmxlbmd0aCkgJiYgLyogQ29tcHJlc3Npb24gTWV0aG9kcyAqLworICAgICAgICAgICAgKGNvbXBfbWV0aG9kcy5sZW5ndGggPT0gc2l6ZW9mKGNvbXBfbWV0aG9kcy5jb21wcmVzc2lvbl9tZXRob2QpKSAmJgorICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgJmNvbXBfbWV0aG9kcy5jb21wcmVzc2lvbl9tZXRob2QsIGNvbXBfbWV0aG9kcy5sZW5ndGgpICYmCisgICAgICAgICAgICAoY29tcF9tZXRob2RzLmNvbXByZXNzaW9uX21ldGhvZCA9PSBjbV9udWxsKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5tYWpvciA9IHZlcnNpb24ubWFqb3I7CisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPSB2ZXJzaW9uLm1pbm9yOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICAvKiBObyBjaXBoZXIgc3VpdGVzLCBjaGVjayB0aGF0IGNvbXAgbWV0aG9kIGlzIG51bGwgKi8KKyAgICAgICAgbWVtc2V0KCZjb21wX21ldGhvZHMsIDAsIHNpemVvZihjb21wX21ldGhvZHMpKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBjbV9zbmFwKTsKKyAgICAgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91OChidWYsICZjb21wX21ldGhvZHMubGVuZ3RoKSAmJiAgLyogQ29tcHJlc3Npb24gTWV0aG9kcyAqLworICAgICAgICAgICAoY29tcF9tZXRob2RzLmxlbmd0aCA9PSBzaXplb2YoY29tcF9tZXRob2RzLmNvbXByZXNzaW9uX21ldGhvZCkpICYmCisgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZChidWYsICZjb21wX21ldGhvZHMuY29tcHJlc3Npb25fbWV0aG9kLCBjb21wX21ldGhvZHMubGVuZ3RoKSAmJgorICAgICAgICAgICAoY29tcF9tZXRob2RzLmNvbXByZXNzaW9uX21ldGhvZCA9PSBjbV9udWxsKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5tYWpvciA9IHZlcnNpb24ubWFqb3I7CisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPSB2ZXJzaW9uLm1pbm9yOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICAvKiBPayB3ZSBmYWlsZWQgdG8gZGVjb2RlIHdoYXQgd2FzIHNlbnQgYXMgY2lwaGVyIHN1aXRlcyBhbmQgY29tcCBtZXRob2RzLiBEbyB3ZSBjYXJlPyBBYnNvbHV0ZWx5IE5vdCEgKi8KKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1ham9yID0gdmVyc2lvbi5tYWpvcjsKKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1pbm9yID0gdmVyc2lvbi5taW5vcjsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX2hhbmRsZV9jbGllbnRfaGVsbG9faHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9lYXBfdGxzX3BhcnNlX2NsaWVudF9oZWxsbyhsaW5rX3JlYywgYnVmKSkKKyAgICB7CisgICAgICAgIC8qIFdlIG5vdyBoYXZlIHRoZSBkYXRhLCBidWlsZCB0aGUgRUFQIHNlc3Npb24gSUQgKHNlZSBSRkMgNTIxNikgKi8KKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNlc3Npb25faWRbMF0gPSAweGQ7CisgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2Vzc2lvbl9pZFsxXSwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5jbGllbnRfcmFuZG9tLAorICAgICAgICAgICAgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKTsKKyAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXNzaW9uX2lkW0NPVU5UX09GX1JBTkRPTV9CWVRFUyArIDFdLAorICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNlcnZlcl9yYW5kb20sCisgICAgICAgICAgICBDT1VOVF9PRl9SQU5ET01fQllURVMpOworCisgICAgICAgIGlmIChfZHBvZV9lYXBfdGxzX3NlbmRfY2VydF9yZXF1ZXN0KGxpbmtfcmVjKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRVFVRVNUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfaGFuZGxlX2NlcnRpZmljYXRlX2hzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBpZiAoX2Rwb2VfZWFwX3Rsc19wYXJzZV9jZXJ0aWZpY2F0ZShsaW5rX3JlYywgYnVmKSkKKyAgICB7CisgICAgICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPT0gVExTX01JTk9SX1ZFUlNJT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPSBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfUkVDRUlWRUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX2hhbmRsZV9jbGllbnRfa2V5X2V4Y2hhbmdlX2hzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBpZiAoX2Rwb2VfZWFwX3Rsc19wYXJzZV9jbGllbnRfa2V5X2V4Y2hhbmdlKGxpbmtfcmVjLCBidWYpKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9PSBUTFNfTUlOT1JfVkVSU0lPTikKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfQ0xJRU5UX0tFWV9SRUNFSVZFRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiV3JvbmcgVExTIHZlcnNpb24gaW4gY2xpZW50IGtleSBleGNoYW5nZTogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkZhaWxlZCB0byBwYXJzZSBjbGllbnQga2V5IGV4Y2hhbmdlXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfaGFuZGxlX2NlcnRfdmVyaWZ5X2hzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2Jvb2wgc3VjY2VzczsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBzdWNjZXNzID0gX2Rwb2VfZWFwX3Rsc19wYXJzZV9jZXJ0X3ZlcmlmeShsaW5rX3JlYywgYnVmKTsKKworICAgIGlmIChzdWNjZXNzKQorICAgIHsKKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9WQUxJREFURUQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPSBEUE9FX09OVV9BVVRIX1NUQVRFX0ZBSUxFRDsKKyAgICAgICAgaWYgKF9hdXRoX2NvbXBsZXRlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9hdXRoX2NvbXBsZXRlKGxpbmtfcmVjLCBCQ01fRVJSX09OVV9FUlJfUkVTUCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19oYW5kbGVfZmluaXNoZWRfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Jvb2wgc3VjY2VzczsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfcGFyc2VfdmVyaWZ5X2RhdGEobGlua19yZWMpOworCisgICAgLyogQW5kIHNlbmQgdGhlIGZpbmFsIEZpbmlzaGVkIEhzIHRvIHRoZSBPTlUgKi8KKyAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1pbm9yID09IFRMU19NSU5PUl9WRVJTSU9OKQorICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19zZW5kX2ZpbmlzaGVkX2hzKGxpbmtfcmVjKTsKKyAgICB9CisKKyAgICBpZiAoc3VjY2VzcykKKyAgICB7CisgICAgICAgIGlmICgoX2NlcnRfdHJ1c3QgPT0gTlVMTCkgfHwgKF9jZXJ0X3RydXN0KGxpbmtfcmVjKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPSBEUE9FX09OVV9BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQ7CisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3NlbmRfcmVzdWx0KGxpbmtfcmVjLCBFQVBfQ09ERV9TVUNDRVNTKTsKKyAgICAgICAgICAgIGlmIChfYXV0aF9jb21wbGV0ZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hdXRoX2NvbXBsZXRlKGxpbmtfcmVjLCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPSBEUE9FX09OVV9BVVRIX1NUQVRFX0ZBSUxFRDsKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfc2VuZF9yZXN1bHQobGlua19yZWMsIEVBUF9DT0RFX0ZBSUxVUkUpOworICAgICAgICAgICAgc3VjY2VzcyA9IEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgaWYgKF9hdXRoX2NvbXBsZXRlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2F1dGhfY29tcGxldGUobGlua19yZWMsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJlc2V0IEFMTCB0aGUgc3RhdGUgdmFyaWFibGVzISAqLworICAgICAgICBtZW1zZXQoJmxpbmtfcmVjLT5hdXRoX2N0cmwsIDAsIHNpemVvZihsaW5rX3JlYy0+YXV0aF9jdHJsKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfYWxsb2NfdGxzX2ZyYWdfYnVmZmVyKG9udV9hdXRoX2NvbnRyb2wgKmF1dGhfY3RybCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihhdXRoX2N0cmwgPT0gTlVMTCk7CisKKyAgICBpZiAoYXV0aF9jdHJsLT50bHNfZnJhZ19idWZmZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGF1dGhfY3RybC0+dGxzX2ZyYWdfYnVmZmVyID0gYmNtb3NfY2FsbG9jKEVBUE9MX1BLVF9TSVpFKTsKKyAgICAgICAgYXV0aF9jdHJsLT50bHNfZnJhZ19sZW5ndGggPSAwOworICAgICAgICBhdXRoX2N0cmwtPnRsc190b3RhbF9sZW5ndGggPSAwOworICAgIH0KKworICAgIGlmIChhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9lYXBfdGxzX2ZyZWVfdGxzX2ZyYWdfYnVmZmVyKG9udV9hdXRoX2NvbnRyb2wgKmF1dGhfY3RybCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihhdXRoX2N0cmwgPT0gTlVMTCk7CisKKyAgICBpZiAoYXV0aF9jdHJsLT50bHNfZnJhZ19idWZmZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoYXV0aF9jdHJsLT50bHNfZnJhZ19idWZmZXIpOworICAgICAgICBhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlciA9IE5VTEw7CisgICAgICAgIGF1dGhfY3RybC0+dGxzX2ZyYWdfbGVuZ3RoID0gMDsKKyAgICAgICAgYXV0aF9jdHJsLT50bHNfdG90YWxfbGVuZ3RoID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3NlbmRfdGxzX2ZyYWdfYWNrX3RvX29udShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgdWludDhfdCAqbXNnOworICAgIGVhcF9sZW5ndGhfZmllbGRzIGxmOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvKiBBbGxvY2F0ZSBhIG1lc3NhZ2UgYnVmZmVyICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKEVBUE9MX1BLVF9TSVpFKTsKKyAgICBpZiAoTlVMTCA9PSBtc2cpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBFQVAtVExTIGJ1ZmZlci4gKi8KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgRUFQT0xfUEtUX1NJWkUsIG1zZywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgJmJ1ZiwgRUFQX0NPREVfUkVRVUVTVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX2luaXRfdGxzX2hkcigmYnVmLCAwLCAmbGYpICYmCisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19tc2dfbGVuZ3RocygmYnVmLCAwLCAmbGYpKQorICAgIHsKKyAgICAgICAgLyogU2VuZCB0aGUgbWVzc2FnZSAqLworICAgICAgICByYyA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19mcmVlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIGJjbW9zX2ZyZWUobXNnKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc191bnBhY2tfdGxzX2hhbmRzaGFrZShiY21vbHRfYnVmICpidWYsIHRsc19oYW5kc2hha2UqIGhzKQoreworICAgIHVpbnQyNF90IHRlbXA7CisgICAgYmNtb3NfYm9vbCByYyA9IEJDTU9TX0ZBTFNFOworCisgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91OChidWYsICZocy0+bXNnX2lkKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTI0KGJ1ZiwgJnRlbXApKQorICAgIHsKKyAgICAgICAgaHMtPm1zZ19sZW5ndGggPSB1aW50MjRfdG9fMzIodGVtcCk7CisgICAgICAgIHJjID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3J1bl9hdXRoX3N0YXRlX21hY2hpbmUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQ4X3QgKmhzX3NuYXA7CisgICAgdGxzX2hhbmRzaGFrZSBoYW5kc2hha2U7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIHdoaWxlIChoc19zbmFwID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpLCBfZHBvZV9lYXBfdGxzX3VucGFja190bHNfaGFuZHNoYWtlKGJ1ZiwgJmhhbmRzaGFrZSkpCisgICAgeworICAgICAgICBiY21vc19ib29sIHN1Y2Nlc3MgPSBCQ01PU19UUlVFOworCisgICAgICAgIGlmIChoYW5kc2hha2UubXNnX2xlbmd0aCA+IEVBUE9MX1BLVF9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJIYW5kc2hha2UgbGVuZ3RoIGlzIGluc2FuZTogbXNnICV1LCBsZW4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBoYW5kc2hha2UubXNnX2xlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaGFuZHNoYWtlLm1zZ19pZCA9PSBIU19DTElFTlRfSEVMTE8pICYmCisgICAgICAgICAgICAobGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9PSBEUE9FX09OVV9BVVRIX1NUQVRFX0VBUF9TVEFSVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgUlggbXNnICV1IGluIHN0YXRlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLm1zZ19pZCwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgICAgICBfYnVmZmVyX2hhc2hfZGF0YShsaW5rX3JlYywgaHNfc25hcCwgaGFuZHNoYWtlLm1zZ19sZW5ndGggKyBUTFNfSEFORFNIQUtFX1NJWkUpOworICAgICAgICAgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfaGFuZGxlX2NsaWVudF9oZWxsb19ocyhsaW5rX3JlYywgYnVmKTsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIk5ldyBhdXRoIHN0YXRlICV1XG4iLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaGFuZHNoYWtlLm1zZ19pZCA9PSBIU19DRVJUSUZJQ0FURSkgJiYKKyAgICAgICAgICAgICAgICAgKGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPT0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1JFUVVFU1QpKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJFQVAgVExTIFJYIG1zZyAldSBpbiBzdGF0ZSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZS5tc2dfaWQsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICAgICAgX2J1ZmZlcl9oYXNoX2RhdGEobGlua19yZWMsIGhzX3NuYXAsIGhhbmRzaGFrZS5tc2dfbGVuZ3RoICsgVExTX0hBTkRTSEFLRV9TSVpFKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBfZHBvZV9lYXBfdGxzX2hhbmRsZV9jZXJ0aWZpY2F0ZV9ocyhsaW5rX3JlYywgYnVmKTsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIk5ldyBhdXRoIHN0YXRlICV1XG4iLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaGFuZHNoYWtlLm1zZ19pZCA9PSBIU19DTElFTlRfS0VZX0VYQ0hBTkdFKSAmJgorICAgICAgICAgICAgICAgICAobGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9PSBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfUkVDRUlWRUQpKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJFQVAgVExTIFJYIG1zZyAldSBpbiBzdGF0ZSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZS5tc2dfaWQsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICAgICAgX2J1ZmZlcl9oYXNoX2RhdGEobGlua19yZWMsIGhzX3NuYXAsIGhhbmRzaGFrZS5tc2dfbGVuZ3RoICsgVExTX0hBTkRTSEFLRV9TSVpFKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBfZHBvZV9lYXBfdGxzX2hhbmRsZV9jbGllbnRfa2V5X2V4Y2hhbmdlX2hzKGxpbmtfcmVjLCBidWYpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0NFUlRJRklDQVRFX1ZFUklGWSkgJiYKKyAgICAgICAgICAgICAgICAgKChsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID09IERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRUNFSVZFRCkgfHwKKyAgICAgICAgICAgICAgICAgIChsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID09IERQT0VfT05VX0FVVEhfU1RBVEVfQ0xJRU5UX0tFWV9SRUNFSVZFRCkpKQorCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgUlggbXNnICV1IGluIHN0YXRlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLm1zZ19pZCwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgICAgICBkcG9lX3NlY19zaGExX2ZpbmFsKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zaGExX2RpZ2VzdCwgJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zaGExX2hhc2gpOworICAgICAgICAgICAgZHBvZV9zZWNfbWQ1X2ZpbmFsKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tZDVfZGlnZXN0LCAmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1kNV9oYXNoKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBfZHBvZV9lYXBfdGxzX2hhbmRsZV9jZXJ0X3ZlcmlmeV9ocyhsaW5rX3JlYywgYnVmKTsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIk5ldyBhdXRoIHN0YXRlICV1XG4iLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaGFuZHNoYWtlLm1zZ19pZCA9PSBIU19GSU5JU0hFRCkgJiYKKyAgICAgICAgICAgICAgICAgKGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPT0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1ZBTElEQVRFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgUlggbXNnICV1IGluIHN0YXRlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLm1zZ19pZCwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgICAgICBzdWNjZXNzID0gX2Rwb2VfZWFwX3Rsc19oYW5kbGVfZmluaXNoZWRfaHMobGlua19yZWMpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBSWCBtc2cgJXUgaW4gc3RhdGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIGp1c3QgYWJvcnQuLi4gKi8KKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgaGFuZHNoYWtlIHByb2Nlc3NpbmcgZmFpbGVkOiAldVxuIiwgaGFuZHNoYWtlLm1zZ19pZCk7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfdW5wYWNrX3Rsc19yZWNvcmRfaGRyKGJjbW9sdF9idWYgKmJ1ZiwgdGxzX3JlY29yZF9oZHIgKm1zZykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm1zZy0+Y29udGVudF90eXBlKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT50bHNfdmVyc2lvbi5tYWpvcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm1zZy0+dGxzX3ZlcnNpb24ubWlub3IpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmbXNnLT50bHNfcmVjb3JkX2xlbmd0aCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3Byb2Nlc3NfdGxzX3JlY29yZHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB0bHNfcmVjb3JkX2hkciB0bHNfaGRyOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGgsIGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX2ZyYWdfYnVmZmVyLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgd2hpbGUgKChyYyA9PSBCQ01fRVJSX09LKSAmJiBfZHBvZV9lYXBfdGxzX3VucGFja190bHNfcmVjb3JkX2hkcigmYnVmLCAmdGxzX2hkcikpCisgICAgeworICAgICAgICByYyA9IF9kcG9lX2VhcF90bHNfcnVuX2F1dGhfc3RhdGVfbWFjaGluZShsaW5rX3JlYywgJmJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX2NoZWNrX3Rsc192ZXJzaW9uKGNvbnN0IHRsc19yZWNvcmRfaGRyICp0bHNfcmVjX2hkcikKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTih0bHNfcmVjX2hkciA9PSBOVUxMKTsKKworICAgIGlmICgodGxzX3JlY19oZHItPmNvbnRlbnRfdHlwZSAhPSBUTFNfSEFORFNIQUtFX0lEKSB8fAorICAgICAgICAodGxzX3JlY19oZHItPnRsc192ZXJzaW9uLm1ham9yICE9IFRMU19NQUpPUl9WRVJTSU9OKSB8fAorICAgICAgICAodGxzX3JlY19oZHItPnRsc192ZXJzaW9uLm1pbm9yIDwgVExTX01JTk9SX1ZFUlNJT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2VfZWFwX3Rsc19idWZmZXJfdGxzX2RhdGEoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGRhdGEgPT0gTlVMTCk7CisKKyAgICAvKiBkbyBub3Qgb3ZlcnJ1biB0aGUgYnVmZmVyLCBubyBtYXR0ZXIgaG93IG11Y2ggZGF0YSByZWNlaXZlZCAqLworICAgIGlmICgobGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGggKyBsZW5ndGgpID4gRUFQT0xfUEtUX1NJWkUpCisgICAgeworICAgICAgICBsZW5ndGggPSBFQVBPTF9QS1RfU0laRSAtIGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX2ZyYWdfbGVuZ3RoOworICAgIH0KKworICAgIG1lbWNweSgmbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19idWZmZXJbbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGhdLCBkYXRhLCBsZW5ndGgpOworICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX2ZyYWdfbGVuZ3RoICs9IGxlbmd0aDsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc191bnBhY2tfbXNnKGJjbW9sdF9idWYgKmJ1ZiwgZWFwb2xfbXNnICptc2cpCit7CisgICAgcmV0dXJuIGRwb2Vfc2VjX2VhcG9sX3VucGFjayhidWYsICZtc2ctPmhkcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm1zZy0+ZWFwX21zZy5oZHIuZWFwX2NvZGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZtc2ctPmVhcF9tc2cuaGRyLmlkKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTE2X2JlKGJ1ZiwgJm1zZy0+ZWFwX21zZy5oZHIubGVuZ3RoKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT5lYXBfbXNnLnRscy5hdXRoX3N1Yl90eXBlKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT5lYXBfbXNnLnRscy5lYXBfdGxzX2ZsYWdzKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfZ2VuX2tleShhdXRoX3RyYW5zX2RhdGEgKnRyYW5zX2RhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGRwb2Vfc2VjX3JzYV9rZXkgKnJzYSA9IE5VTEw7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKHRyYW5zX2RhdGEgPT0gTlVMTCk7CisKKyAgICAvKiBHZW5lcmF0ZSB0aGUgUlNBIGtleSB0byBiZSB1c2VkIGluIHRoZSBTZXJ2ZXJLZXlFeGNoYW5nZSBhbmQgQ2xpZW50S2V5RXhjaGFuZ2UgKi8KKyAgICByc2EgPSBkcG9lX3NlY19yc2FfZ2VuZXJhdGVfa2V5KERQT0VfQklfUlNBX0tFWV9TSVpFKTsKKyAgICBpZiAocnNhID09IE5VTEwpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFN0b3JlIHRoZSBwb2ludGVyIHRvIHRoZSBrZXkuICovCisgICAgICAgIHRyYW5zX2RhdGEtPnJzYSA9IHJzYTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2VfZWFwX3Rsc19zZW5kX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgdWludDhfdCAqbXNnOworICAgIHRpbWVfdCB1bml4X3RpbWU7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgYXV0aGVudGljYXRpb24gY29udHJvbCBkYXRhLiAqLworICAgIG1lbXNldCgmbGlua19yZWMtPmF1dGhfY3RybCwgMCwgc2l6ZW9mKGxpbmtfcmVjLT5hdXRoX2N0cmwpKTsKKyAgICBkcG9lX3NlY19zaGExX2luaXQoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zaGExX2hhc2gpOworICAgIGRwb2Vfc2VjX21kNV9pbml0KCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWQ1X2hhc2gpOworCisgICAgLyogUGVyIHN0YW5kYXJkLCB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgc2VydmVyIHJhbmRvbSB2YWx1ZSBzaG91bGQgYmUgInVuaXggdGltZSIgKi8KKyAgICB1bml4X3RpbWUgPSB0aW1lKE5VTEwpOworICAgIG1lbWNweShsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2VydmVyX3JhbmRvbSwgJnVuaXhfdGltZSwgc2l6ZW9mKHVuaXhfdGltZSkpOworICAgIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2VydmVyX3JhbmRvbVtzaXplb2YodW5peF90aW1lKV0sIENPVU5UX09GX1JBTkRPTV9CWVRFUyAtIHNpemVvZih1bml4X3RpbWUpKTsKKworICAgIC8qIElmIGJpZGlyZWN0aW9uYWwsIGdlbmVyYXRlIHRoZSBSU0EgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgZm9yIHRoZSBTZXJ2ZXJLZXlFeGNoYW5nZSBhbmQgQ2xpZW50S2V5RXhjaGFuZ2UuICovCisgICAgaWYgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgPT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkKKyAgICB7CisgICAgICAgIHJjID0gX2Rwb2VfZWFwX3Rsc19nZW5fa2V5KCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGEgbWVzc2FnZSBidWZmZXIgKi8KKyAgICBtc2cgPSBiY21vc19jYWxsb2MoRUFQT0xfUEtUX1NJWkUpOworICAgIGlmIChOVUxMID09IG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIEVBUC1UTFMgYnVmZmVyLiAqLworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBFQVBPTF9QS1RfU0laRSwgbXNnLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisKKyAgICAvKiBFbmNvZGUgdGhlIEVBUC1UTFMgU3RhcnQgbWVzc2FnZSB0byB0aGUgYnVmZmVyLiAqLworICAgIF9kcG9lX2VhcF90bHNfcGFja19zdGFydChsaW5rX3JlYywgJmJ1Zik7CisKKyAgICAvKiBTZW5kIHRoZSBtZXNzYWdlICovCisgICAgcmMgPSBkcG9lX3NlY19zZW5kX2VhcG9sKGxpbmtfcmVjLT5kZXZpY2UsICZsaW5rX3JlYy0+a2V5LCBtc2csIGJjbW9sdF9idWZfZ2V0X3VzZWQoJmJ1ZikpOworICAgIGJjbW9zX2ZyZWUobXNnKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworCisgICAgLyogQXV0aGVudGljYXRpb24gaGFzIGJlZ3VuLiAqLworICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPSBEUE9FX09OVV9BVVRIX1NUQVRFX0VBUF9TVEFSVDsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gZHBvZV9lYXBfdGxzX3Byb2Nlc3NfZWFwb2xfcGt0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgdWludDhfdCAqbXNnLCB1aW50MzJfdCBtc2dfbGVuKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB1aW50MzJfdCBlYXBfdGxzX2xlbmd0aDsKKyAgICB0bHNfcmVjb3JkX2hkciB0bHNfcmVjX2hkcjsKKyAgICBlYXBvbF9tc2cgdW5wYWNrZWRfbXNnOworICAgIGJjbW9sdF9idWYgYnVmOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obXNnID09IE5VTEwpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIG1zZ19sZW4sIG1zZywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIF9kcG9lX2VhcF90bHNfdW5wYWNrX21zZygmYnVmLCAmdW5wYWNrZWRfbXNnKTsKKworICAgIGlmICh1bnBhY2tlZF9tc2cuZWFwX21zZy50bHMuYXV0aF9zdWJfdHlwZSA9PSBFQVBfVFlQRV9OQUspCisgICAgeworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9GQUlMRUQ7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICB9CisKKyAgICBpZiAodW5wYWNrZWRfbXNnLmhkci5lYXBvbF9sZW5ndGggIT0gdW5wYWNrZWRfbXNnLmVhcF9tc2cuaGRyLmxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFdlIHNob3VsZCBvbmx5IHJlYWQgdGhlIGxlbmd0aCBpZiB0aGUgbGVuZ3RoIGJpdCBpcyBzZXQuICovCisgICAgaWYgKCh1bnBhY2tlZF9tc2cuZWFwX21zZy50bHMuZWFwX3Rsc19mbGFncyAmIEVBUF9UTFNfRkxBR19MRU5HVEhfQklUKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UzMl9iZSgmYnVmLCAmZWFwX3Rsc19sZW5ndGgpOworICAgICAgICB1aW50OF90ICp0bHNfZGF0YSA9IGJjbW9sdF9idWZfc25hcF9nZXQoJmJ1Zik7CisgICAgICAgIF9kcG9lX2VhcF90bHNfdW5wYWNrX3Rsc19yZWNvcmRfaGRyKCZidWYsICZ0bHNfcmVjX2hkcik7CisgICAgICAgIGlmIChfZHBvZV9lYXBfdGxzX2NoZWNrX3Rsc192ZXJzaW9uKCZ0bHNfcmVjX2hkcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEludmFsaWQgVExTIHJlY29yZCwgZGlzY2FyZC4uLiAqLworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgZnJhZ21lbnRhdGlvbiBidWZmZXIuIE11bHRpcGxlIGNhbGxzIHRvIHRoZSBmcmFnIGFsbG9jIGZ1bmN0aW9uIGlzIGFsbG93ZWQgc2luY2UgaXQgYWxsb2NhdGVzIGEKKyAgICAgICAgICAgbmV3IGJ1ZmZlciBvbmx5IGlmIHRoZXJlIGlzIG5vIGZyYWcgYnVmZmVyIGN1cnJlbnRseSBhbGxvY2F0ZWQuIFRoZSBmcmFnIGJ1ZmZlciBpcyBhbHNvIGZyZWVkIGlmIHRoZSBFQVAtVExTCisgICAgICAgICAgIHNlc3Npb24gZ29lcyBkb3duIGZvciBzb21lIHJlYXNvbi4gKi8KKyAgICAgICAgaWYgKCFfZHBvZV9lYXBfdGxzX2FsbG9jX3Rsc19mcmFnX2J1ZmZlcigmbGlua19yZWMtPmF1dGhfY3RybCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIGxlbmd0aCBiaXQgaXMgc2V0LCBhbmQgdGhlIG1vcmUgYml0IGlzIG5vdCwgdGhpcyBpcyBsaWtlbHkgYSBzaW5nbGUgZnJhZ21lbnQgcGFja2V0LiAgSW4gdGhhdCBjYXNlCisgICAgICAgICAgIHRoZSBUbHNNc2cgbGVuZ3RoIG11c3QgYmUgcHJlc2VudCwgYW5kIG1hdGNoIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB0aGlzIGlzIGEKKyAgICAgICAgICAgc3Vic2VxdWVudCBmcmFnbWVudCBhbmQgdGhlIGNsaWVudCBhbHdheXMgYWRkcyB0aGUgbGVuZ3RoICh3aGljaCBwZXIgc3RhbmRhcmQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IG9mCisgICAgICAgICAgIGZyYWdtZW50cyksIGluIHdoaWNoIGNhc2Ugd2UgY2Fubm90IHZhbGlkYXRlIHRoaXMgbm93LiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXMgc2F2ZSB0aGlzIHNpemUsIGFuZCB2YWxpZGF0ZQorICAgICAgICAgICB3aGVuIGFsbCBmcmFnbWVudHMgaGF2ZSBiZWVuIHJlY2VpdmVkLiAqLworICAgICAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC50bHNfdG90YWxfbGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX3RvdGFsX2xlbmd0aCA9IGVhcF90bHNfbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX3RvdGFsX2xlbmd0aCAhPSBlYXBfdGxzX2xlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgICAgIH0KKworICAgICAgICBfZHBvZV9lYXBfdGxzX2J1ZmZlcl90bHNfZGF0YSgKKyAgICAgICAgICAgIGxpbmtfcmVjLAorICAgICAgICAgICAgdGxzX2RhdGEsCisgICAgICAgICAgICB1bnBhY2tlZF9tc2cuaGRyLmVhcG9sX2xlbmd0aCAtIChFQVBfRlJBTUVfU0laRSArIEVBUF9UTFNfSERSX1NJWkUgKyBzaXplb2YodWludDMyX3QpKSk7CisKKyAgICAgICAgaWYgKCh1bnBhY2tlZF9tc2cuZWFwX21zZy50bHMuZWFwX3Rsc19mbGFncyAmIEVBUF9UTFNfRkxBR19NT1JFX0JJVCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTmVlZCB0byBhY2tub3dsZWRnZSB0aGUgZnJhZ21lbnQgKi8KKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfc2VuZF90bHNfZnJhZ19hY2tfdG9fb251KGxpbmtfcmVjKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVpdGhlciBhIHNpbmdsZSBmcmFnbWVudCBwYWNrZXQsIG9yIHRoZSBsYXN0IGZyYWdtZW50IG9mIGEgbXVsdGktZnJhZ21lbnQgcGFja2V0LiBJZiBpdCBpcyB0aGUgbGFzdAorICAgICAgICAgICAgICAgZnJhZ21lbnQgb2YgYSBtdWx0aS1mcmFnbWVudCwgdGhlbiBhbGwgd2UgY2FuIGNoZWNrIGlzIHRoYXQgZWFwVGxzTGVuZ3RoIGlzIG9uZSBUbHNSZWNvcmRIZHIgYmlnZ2VyIHRoYW4KKyAgICAgICAgICAgICAgIHRoZSBidWZmZXJlZCAoYXV0aEN0cmwtPnRsc0ZyYWdMZW4pIGRhdGEgc3RyZWFtLiBUaGUgc2FtZSBsb2dpYyB3b3JrcyBvbiBhIHNpbmdsZSBmcmFnIHBhY2tldC4gKi8KKyAgICAgICAgICAgIGlmICgoZWFwX3Rsc19sZW5ndGggIT0gbGlua19yZWMtPmF1dGhfY3RybC50bHNfdG90YWxfbGVuZ3RoKSB8fAorICAgICAgICAgICAgICAgIChlYXBfdGxzX2xlbmd0aCAhPSBsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gX2Rwb2VfZWFwX3Rsc19wcm9jZXNzX3Rsc19yZWNvcmRzKGxpbmtfcmVjKTsKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfZnJlZV90bHNfZnJhZ19idWZmZXIoJmxpbmtfcmVjLT5hdXRoX2N0cmwpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKnRsc19kYXRhID0gYmNtb2x0X2J1Zl9zbmFwX2dldCgmYnVmKTsKKworICAgICAgICAvKiBObyBsZW5ndGggZmllbGQgLSBtdXN0IGJlIGZyYWdtZW50ZWQsIGFuZCBub3QgZmlyc3QgKi8KKyAgICAgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX2ZyYWdfYnVmZmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09VVF9PRl9TWU5DOworICAgICAgICB9CisKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19idWZmZXJfdGxzX2RhdGEoCisgICAgICAgICAgICBsaW5rX3JlYywKKyAgICAgICAgICAgIHRsc19kYXRhLAorICAgICAgICAgICAgdW5wYWNrZWRfbXNnLmhkci5lYXBvbF9sZW5ndGggLSAoRUFQX0ZSQU1FX1NJWkUgKyBFQVBfVExTX0hEUl9TSVpFKSk7CisKKyAgICAgICAgLyogSWYgdGhlIG1vcmUgYml0IGlzIHNldCwgd2FpdCBmb3IgdGhlIG5leHQgZnJhZ21lbnQuIE90aGVyd2lzZSBkdW1wIHdoYXQgd2UgaGF2ZSBpbnRvIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworICAgICAgICBpZiAoKHVucGFja2VkX21zZy5lYXBfbXNnLnRscy5lYXBfdGxzX2ZsYWdzICYgRUFQX1RMU19GTEFHX01PUkVfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOZWVkIHRvIGFja25vd2xlZGdlIHRoZSBmcmFnbWVudD8gVGhlIHN0YW5kYXJkIGRvZXMgbm90IGRlZmluZSBhIG1lc3NhZ2Ugc2V0IHRoYXQgd2lsbCBnZXQgdXMgaGVyZS4gKi8KKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfc2VuZF90bHNfZnJhZ19hY2tfdG9fb251KGxpbmtfcmVjKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc190b3RhbF9sZW5ndGggIT0gbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gX2Rwb2VfZWFwX3Rsc19wcm9jZXNzX3Rsc19yZWNvcmRzKGxpbmtfcmVjKTsKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfZnJlZV90bHNfZnJhZ19idWZmZXIoJmxpbmtfcmVjLT5hdXRoX2N0cmwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGRwb2VfZWFwX3Rsc19jbGVhbnVwKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLy8gV2UgYXJlIGRvbmUgd2l0aCB0aGlzLgorICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRpZmljYXRlICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUpOworICAgIH0KKworICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEucnNhICE9IE5VTEwpCisgICAgeworICAgICAgICBkcG9lX3NlY19yc2Ffa2V5X2ZyZWUobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnJzYSk7CisgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5yc2EgPSBOVUxMOworICAgIH0KKworICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydExlbiA9IDA7CisKKyAgICBfZHBvZV9lYXBfdGxzX2ZyZWVfdGxzX2ZyYWdfYnVmZmVyKCZsaW5rX3JlYy0+YXV0aF9jdHJsKTsKKworICAgIG1lbXNldCgmbGlua19yZWMtPmF1dGhfY3RybCwgMCwgc2l6ZW9mKGxpbmtfcmVjLT5hdXRoX2N0cmwpKTsKK30KKworYmNtb3NfZXJybm8gZHBvZV9lYXBfdGxzX2luaXQoZl9kcG9lX3NlY19hdXRoX2NiIGF1dGhfY2IsIGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBjZXJ0X3RydXN0X2NiKQoreworICAgIF9hdXRoX2NvbXBsZXRlID0gYXV0aF9jYjsKKyAgICBfY2VydF90cnVzdCA9IGNlcnRfdHJ1c3RfY2I7CisKKyAgICByZXR1cm4gZHBvZV9zZWNfcm5nX3NlZWQoKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX2VhcF90bHMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9lYXBfdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0ZDU1NQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9lYXBfdGxzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZiAhZGVmaW5lZChfRFBPRV9FQVBfVExTX0hfKQorI2RlZmluZSBfRFBPRV9FQVBfVExTX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJkcG9lX3NlY191dGlsLmgiCisKKyNkZWZpbmUgQ09VTlRfT0ZfUkFORE9NX0JZVEVTIDMyCisjZGVmaW5lIFNJWkVfT0ZfTUFTVEVSX1NFQ1JFVCA0OAorI2RlZmluZSBTSVpFX09GX01BU1RFUl9TRVNTSU9OX0tFWSA2NAorI2RlZmluZSBTSVpFX09GX0tFWV9NQVRFUklBTCAxMjgKKyNkZWZpbmUgU0laRV9PRl9SU0FfRU5DUllQVEVEX0JMT0NLIDI1NgorI2RlZmluZSBTSVpFX09GX0VBUF9TRVNTSU9OX0lEIDY1CisjZGVmaW5lIFNJWkVfT0ZfVExTX1NFU1NJT05fSUQgMzIKKworLyogVG90YWwgbGVuZ3RoIG9mIHRoZSBQcmVNYXN0ZXJTZWNyZXQgKi8KKyNkZWZpbmUgU0laRV9PRl9QUkVfTUFTVEVSX1NFQ1JFVCA0OAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX1VOQVVUSEVOVElDQVRFRCwKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX0VBUF9TVEFSVCwKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfUkVRVUVTVCwKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX0NMSUVOVF9LRVlfUkVDRUlWRUQsCisgICAgRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1JFQ0VJVkVELAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9WQUxJREFURUQsCisgICAgRFBPRV9PTlVfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVELAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfRkFJTEVECit9IGRwb2Vfb251X2F1dGhfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBtYWpvcjsKKyAgICB1aW50OF90IG1pbm9yOworfSB0bHNfcHJvdG9jb2xfdmVyc2lvbjsKKworI2RlZmluZSBQUk9UT0NPTF9WRVJTSU9OX1NJWkUgMgorCisvKiBEUG9FIEF1dGhlbnRpY2F0aW9uIHRyYW5zaWVudCBkYXRhICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgY2xpZW50X3JhbmRvbVtDT1VOVF9PRl9SQU5ET01fQllURVNdOworICAgIHVpbnQ4X3Qgc2VydmVyX3JhbmRvbVtDT1VOVF9PRl9SQU5ET01fQllURVNdOworICAgIHVpbnQ4X3Qgc2Vzc2lvbl9pZFtTSVpFX09GX0VBUF9TRVNTSU9OX0lEXTsKKyAgICB1aW50OF90IG1hc3Rlcl9zZWNyZXRbU0laRV9PRl9NQVNURVJfU0VDUkVUXTsKKyAgICB1aW50OF90IGtleV9tYXRlcmlhbFtTSVpFX09GX0tFWV9NQVRFUklBTF07CisgICAgdWludDhfdCBwcmVfbWFzdGVyX3NlY3JldFtTSVpFX09GX1BSRV9NQVNURVJfU0VDUkVUXTsKKyAgICBkcG9lX3NlY19zaGExX2hhc2ggc2hhMV9oYXNoOworICAgIGRwb2Vfc2VjX3NoYTFfZGlnZXN0IHNoYTFfZGlnZXN0OworICAgIGRwb2Vfc2VjX21kNV9oYXNoIG1kNV9oYXNoOworICAgIGRwb2Vfc2VjX21kNV9kaWdlc3QgbWQ1X2RpZ2VzdDsKKyAgICAvKiAgQWxsb3cgdGhlIGtleSB0byBkb3VibGUgaW4gc2l6ZSBiZWZvcmUgd2UgYnJlYWsuICovCisgICAgdWludDhfdCBlbmNyeXB0ZWRfY2FrWzIgKiBTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0tdOworICAgIHVpbnQ4X3QgbWFzdGVyX3Nlc3Npb25fa2V5W1NJWkVfT0ZfTUFTVEVSX1NFU1NJT05fS0VZXTsKKyAgICBkcG9lX3NlY19yc2Ffa2V5ICpyc2E7Cit9IGF1dGhfdHJhbnNfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3Qgb251X2F1dGhfY29udHJvbAoreworICAgIGRwb2Vfb251X2F1dGhfc3RhdGUgb251X2F1dGhfc3RhdGU7CisgICAgdGxzX3Byb3RvY29sX3ZlcnNpb24gdmVyc2lvbjsKKyAgICB1aW50MzJfdCBjdXJyZW50X3BhY2tldF9pZDsKKyAgICB1aW50OF90ICpjZXJ0aWZpY2F0ZTsKKyAgICB1aW50MTZfdCBjZXJ0TGVuOworICAgIHVpbnQ4X3QgKm9udV9jZXJ0OworICAgIHVpbnQxNl90IG9udV9jZXJ0X2xlbjsKKyAgICB1aW50MzJfdCBvbnVfY2VydF9rZXlfc2l6ZTsKKyAgICB1aW50OF90ICptZmdfY2VydDsKKyAgICB1aW50MTZfdCBtZmdfY2VydF9sZW47CisgICAgdWludDhfdCAqdGxzX2ZyYWdfYnVmZmVyOworICAgIHVpbnQzMl90IHRsc19mcmFnX2xlbmd0aDsKKyAgICB1aW50MzJfdCB0bHNfdG90YWxfbGVuZ3RoOworICAgIGF1dGhfdHJhbnNfZGF0YSB0cmFuc19kYXRhOworfSBvbnVfYXV0aF9jb250cm9sOworCitzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWM7CisKKy8qIGNhbGxiYWNrcyAqLworCit0eXBlZGVmIHZvaWQgKCpmX2Rwb2Vfc2VjX2F1dGhfY2IpKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyosIGJjbW9zX2Vycm5vIHN0YXR1cyk7CisKK3R5cGVkZWYgYmNtb3NfYm9vbCAoKmZfZHBvZV9zZWNfY2VydF90cnVzdF9jYikoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjKik7CisKKy8qIGZ1bmN0aW9ucyAqLworCitiY21vc19lcnJubyBkcG9lX2VhcF90bHNfc2VuZF9zdGFydChzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmspOworCitiY21vc19lcnJubyBkcG9lX2VhcF90bHNfcHJvY2Vzc19lYXBvbF9wa3Qoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCB1aW50OF90ICptc2csIHVpbnQzMl90IG1zZ19sZW4pOworCit2b2lkIGRwb2VfZWFwX3Rsc19jbGVhbnVwKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK2JjbW9zX2Vycm5vIGRwb2VfZWFwX3Rsc19pbml0KGZfZHBvZV9zZWNfYXV0aF9jYiBhdXRoX2NiLCBmX2Rwb2Vfc2VjX2NlcnRfdHJ1c3RfY2IgY2VydF90cnVzdF9jYik7CisKKyNlbmRpZiAvKiBfRFBPRV9FQVBfVExTX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX2ZzbS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19mc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmM5NmRlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19mc20uYwpAQCAtMCwwICsxLDgyNiBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSAiZHBvZV9zZWNfZnNtLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfdXRpbC5oIgorI2luY2x1ZGUgImJjbW9zX2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorCisjZGVmaW5lIERQT0VfU0VDX0ZTTV9NQVhfTElOS1MgNjQKKyNkZWZpbmUgRFBPRV9TRUNfRlNNX1RBU0tfTVNHX1FfU0laRSA2NAorCitzdGF0aWMgY29uc3QgdWludDE2X3QgRFBPRV9TRUNfRlNNX0RFRkFVTFRfT0FNX0tFWV9FWENIQU5HRV9QRVJJT0QgPSA2MDA7IC8qIDEwIG1pbnV0ZXMgKi8KKy8qKgorICogQGJyaWVmICBNYXhpbXVtIE9OVSBBdXRoZW50aWNhdGlvbiB0aW1lb3V0IHZhbHVlCisgKiBEUG9FIHNwZWNpZmljYXRpb24gaW5kaWNhdGVzIHRoYXQgdGhpcyB2YWx1ZSBpcyA1IG1pbnV0ZXMuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBEUE9FX1NFQ19BVVRIX1RJTUVPVVQgPSA1ICogNjAgKiAxMDAwICogMTAwMDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgY2hhciB0YXNrX25hbWVbTUFYX1RBU0tfTkFNRV9TSVpFXTsKKyAgICBjaGFyIG1zZ19xdWV1ZV9uYW1lW01BWF9NU0dfUVVFVUVfTkFNRV9TSVpFXTsKKyAgICBoYXNoX3RhYmxlICpsaW5rX21hcDsKK30gZHBvZV9zZWNfZnNtX2N0eHQ7CisKK2Rwb2Vfc2VjX2ZzbV9jdHh0IGN0eHRbQkNNVFJfTUFYX09MVFNdOworCit0eXBlZGVmIHZvaWQgKCpmX2Rwb2Vfc2VjX2ZzbSkoZHBvZV9zZWNfbGlua19yZWMqLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSopOworCisvKiBEUG9FIFNlY3VyaXR5IEZTTSBFdmVudCB0eXBlIHRvIHN0cmluZyBkZWZpbml0aW9ucyB1c2VkIGZvciBkZWJ1ZyBvdXRwdXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpkcG9lX3NlY19mc21fZXZlbnRfbmFtZVtEUE9FX1NFQ19GU01fRVZFTlRfX0NPVU5UXSA9Cit7CisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9FTkNSWVBUX1NUQVJUXSA9ICJTdGFydCBFbmNyeXB0aW9uIiwKKyAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX0FVVEhfU1RBUlRdID0gIlN0YXJ0IEF1dGhlbnRpY2F0aW9uIiwKKyAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1JYX09BTV0gPSAiUmVjZWl2ZSBPQU0iLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfUlhfRUFQT0xdID0gIlJlY2VpdmUgRUFQT0wiLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9DT01QTEVURV0gPSAiQXV0aGVudGljYXRpb24gQ29tcGxldGUiLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfTUtBX0NPTVBMRVRFXSA9ICJNS0EgQ29tcGxldGUiLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfVElNRU9VVF0gPSAiVGltZW91dCIKK307CisKKworLyogRFBvRSBTZWN1cml0eSBGU00gU3RhdGUgdG8gc3RyaW5nIGRlZmluaXRpb25zIHVzZWQgZm9yIGRlYnVnIG91dHB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRwb2Vfc2VjX2ZzbV9zdGF0ZV9uYW1lW0RQT0VfU0VDX0ZTTV9TVEFURV9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0lETEVdID0gIklkbGUiLAorICAgIFtEUE9FX1NFQ19GU01fU1RBVEVfQVVUSF9XQUlUXSA9ICJBdXRoZW50aWNhdGlvbiBpbiBwcm9ncmVzcyIsCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0RPV05fV0FJVF0gPSAiT0FNIEtleSBFeGNoYW5nZSBpbiBwcm9ncmVzcyIsCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0JJX1dBSVRdID0gIk1LQSBpbiBwcm9ncmVzcyIsCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9DT01QTEVURV0gPSAiQXV0aGVudGljYXRpb24vRW5jcnlwdGlvbiBDb21wbGV0ZSIKK307CisKK3N0YXRpYyBmX2Rwb2Vfc2VjX2ZzbV9jYiBfZnNtX2NvbXBsZXRlOworCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9zZWNfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQoZHBvZV9zZWNfZnNtX2V2ZW50IHR5cGUpCit7CisgICAgcmV0dXJuIHR5cGUgPCBEUE9FX1NFQ19GU01fRVZFTlRfX0NPVU5UOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9zZWNfZnNtX3N0YXRlX2lzX3ZhbGlkKGRwb2Vfc2VjX2ZzbV9zdGF0ZSBzdGF0ZSkKK3sKKyAgICByZXR1cm4gc3RhdGUgPCBEUE9FX1NFQ19GU01fU1RBVEVfX0NPVU5UOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2Rwb2Vfc2VjX2ZzbV9ldmVudF9uYW1lKGRwb2Vfc2VjX2ZzbV9ldmVudCB0eXBlKQoreworICAgIGlmIChfZHBvZV9zZWNfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQodHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gZHBvZV9zZWNfZnNtX2V2ZW50X25hbWVbdHlwZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVW5rbm93biBFdmVudCI7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2Rwb2Vfc2VjX2ZzbV9zdGF0ZV9uYW1lKGRwb2Vfc2VjX2ZzbV9zdGF0ZSBzdGF0ZSkKK3sKKyAgICBpZiAoX2Rwb2Vfc2VjX2ZzbV9zdGF0ZV9pc192YWxpZChzdGF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gZHBvZV9zZWNfZnNtX3N0YXRlX25hbWVbc3RhdGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIlVua25vd24gU3RhdGUiOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9jb21wbGV0ZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGlmIChfZnNtX2NvbXBsZXRlICE9IE5VTEwpCisgICAgeworICAgICAgICBfZnNtX2NvbXBsZXRlKGxpbmtfcmVjLT5kZXZpY2UsIGxpbmtfcmVjLT5rZXksIGxpbmtfcmVjLT5zdGF0dXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9zdWNjZXNzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgbGlua19yZWMtPmZzbV9zdGF0ZSA9IERQT0VfU0VDX0ZTTV9TVEFURV9DT01QTEVURTsKKyAgICBsaW5rX3JlYy0+c3RhdHVzID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAobGlua19yZWMtPmNmZy5lbmNfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX05PTkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9PTkVfRE9XTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0RPV046CisgICAgICAgICAgICBiY21vc190aW1lcl9zdGFydCgKKyAgICAgICAgICAgICAgICAmbGlua19yZWMtPnRpbWVvdXQsCisgICAgICAgICAgICAgICAgKERQT0VfU0VDX0ZTTV9ERUZBVUxUX09BTV9LRVlfRVhDSEFOR0VfUEVSSU9EICogMTAwMCAqIDEwMDApICsgRFBPRV9TRUNfT0FNX1RJTUVPVVQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCVUcoKTsKKyAgICB9CisKKyAgICBfZHBvZV9zZWNfZnNtX2NvbXBsZXRlKGxpbmtfcmVjKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb3NfZXJybm8gcmVhc29uKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBsaW5rX3JlYy0+ZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0lETEU7CisgICAgbGlua19yZWMtPnN0YXR1cyA9IHJlYXNvbjsKKworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmxpbmtfcmVjLT50aW1lb3V0KTsKKworICAgIC8qIENsZWFudXAgYW55IEVBUC1UTFMgc3RhdGUuICovCisgICAgZHBvZV9lYXBfdGxzX2NsZWFudXAobGlua19yZWMpOworCisgICAgX2Rwb2Vfc2VjX2ZzbV9jb21wbGV0ZShsaW5rX3JlYyk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fYXV0aF9zdGFydChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICAvKiBTdGFydCBPTlUgQXV0aGVudGljYXRpb24gKi8KKyAgICByYyA9IGRwb2VfZWFwX3Rsc19zZW5kX3N0YXJ0KGxpbmtfcmVjKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkZhaWxlZCB0byBzdGFydCBhdXRoZW50aWNhdGlvbjogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgcmMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW5rX3JlYy0+ZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0FVVEhfV0FJVDsKKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT50aW1lb3V0LCBEUE9FX1NFQ19BVVRIX1RJTUVPVVQpOworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJTdGFydGluZyBhdXRoZW50aWNhdGlvblxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX21rYV9zdGFydChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBkcG9lX3NlY19ta2FfZnNtX3N0YXJ0KGxpbmtfcmVjKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkZhaWxlZCB0byBzdGFydCBNS0E6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIHJjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGlua19yZWMtPmZzbV9zdGF0ZSA9IERQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0JJX1dBSVQ7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIlN0YXJ0aW5nIE1LQVxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2VuY3J5cHRfc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgaWYgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgPT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkKKyAgICB7CisgICAgICAgIF9kcG9lX3NlY19mc21fbWthX3N0YXJ0KGxpbmtfcmVjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBlcG9uX29hbV9kcG9lX3NldF9lbmNyeXB0aW9uKAorICAgICAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5rZXkuZXBvbl9uaSwKKyAgICAgICAgICAgICZsaW5rX3JlYy0+a2V5Lm1hY19hZGRyZXNzLAorICAgICAgICAgICAgbGlua19yZWMtPmNmZy5lbmNfbW9kZSwKKyAgICAgICAgICAgIERQT0VfU0VDX0ZTTV9ERUZBVUxUX09BTV9LRVlfRVhDSEFOR0VfUEVSSU9EKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkZhaWxlZCB0byBzZXQgZW5jcnlwdGlvbjogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIHJjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5mc21fc3RhdGUgPSBEUE9FX1NFQ19GU01fU1RBVEVfRU5DUllQVF9ET1dOX1dBSVQ7CisgICAgICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPnRpbWVvdXQsIERQT0VfU0VDX09BTV9USU1FT1VUKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9hdXRoX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJjID0gZHBvZV9lYXBfdGxzX3Byb2Nlc3NfZWFwb2xfcGt0KGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUudmFsLCBldnQtPmRhdGEucnhfZnJhbWUubGVuKTsKKyAgICBpZiAoKEJDTV9FUlJfT0sgIT0gcmMpICYmIChCQ01fRVJSX0lOX1BST0dSRVNTICE9IHJjKSkKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkVycm9yIHByb2Nlc3NpbmcgRUFQT0wgcGFja2V0OiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGxpbmtfcmVjLCByYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2F1dGhfY29tcGxldGUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmxpbmtfcmVjLT50aW1lb3V0KTsKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSBldnQtPmRhdGEuc3ViX3N0YXR1cykKKyAgICB7CisgICAgICAgIGlmIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlID09IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fbWthX3N0YXJ0KGxpbmtfcmVjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fc3VjY2VzcyhsaW5rX3JlYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGxpbmtfcmVjLCBldnQtPmRhdGEuc3ViX3N0YXR1cyk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX2ZzbV9pbnN0YWxsX2RuX2tleSgKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UpCit7CisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9pbmZvOworCisgICAgaWYgKEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9PTkVfRE9XTiA9PSBsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlKQorICAgIHsKKyAgICAgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jZmIua2V5LCBkcG9lLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSwgc2l6ZW9mKGtleV9pbmZvLnUuY2ZiLmtleSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBrZXlfaW5mby5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5rZXksIGRwb2UtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCBzaXplb2Yoa2V5X2luZm8udS5jdHIua2V5KSk7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5zY2ksIGxpbmtfcmVjLT5uaV9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKKyAgICAgICAga2V5X2luZm8udS5jdHIuc2NpWzZdID0gKGxpbmtfcmVjLT5sbGlkID4+IDgpICYgMHhmZjsKKyAgICAgICAga2V5X2luZm8udS5jdHIuc2NpWzddID0gKGxpbmtfcmVjLT5sbGlkID4+IDApICYgMHhmZjsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgICAgIGxpbmtfcmVjLT5kZXZpY2UsCisgICAgICAgICZsaW5rX3JlYy0+a2V5LAorICAgICAgICBCQ01PU19GQUxTRSwKKyAgICAgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMsCisgICAgICAgIChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKWRwb2UtPnUua2V5X2V4Y2hhbmdlLmtleV9udW1iZXIsCisgICAgICAgICZrZXlfaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fZW5jX2RuX3J4X29hbShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2U7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBvYW1fZnJhbWUgPSBlcG9uX29hbV91bnBhY2sobGlua19yZWMtPmRldmljZSwgZXZ0LT5kYXRhLnJ4X2ZyYW1lLmxlbiwgZXZ0LT5kYXRhLnJ4X2ZyYW1lLnZhbCk7CisgICAgaWYgKE5VTEwgPT0gb2FtX2ZyYW1lKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coV0FSTklORywgbGlua19yZWMsICJGYWlsZWQgdG8gcGFyc2UgT0FNIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZXBvbl9vYW1faXNfZHBvZShvYW1fZnJhbWUpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHBvZSA9ICZvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWU7CisKKyAgICBpZiAoZXBvbl9vYW1faXNfZHBvZV9lbmNyeXB0X3Jlc3BvbnNlKGRwb2UpKQorICAgIHsKKyAgICAgICAgaWYgKChkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCA9PSAweDgwKSAmJgorICAgICAgICAgICAgKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID09IDB4ODApKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPnRpbWVvdXQsIERQT0VfU0VDX09BTV9USU1FT1VUKTsgLyogcmVzdGFydCB0aW1lciB0byB3YWl0IGZvciBrZXkgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIk9OVSByZWplY3RlZCBlbmNyeXB0aW9uOiBbMF0gPSAweCV4LCBbMV0gPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzFdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCk7CisgICAgICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIEJDTV9FUlJfT05VX0VSUl9SRVNQKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFID09IGRwb2UtPm9wKQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9pbnN0YWxsX2RuX2tleShsaW5rX3JlYywgZHBvZSk7CisgICAgICAgIGlmIChsaW5rX3JlYy0+Y2ZnLmF1dGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fYXV0aF9zdGFydChsaW5rX3JlYywgZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fc3VjY2VzcyhsaW5rX3JlYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogaWdub3JlIG90aGVyIE9BTSAqLworICAgIH0KKworICAgIGJjbW9zX2ZyZWUob2FtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9lbmNfYmlfcnhfb2FtKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19ta2FfZnNtX3J4X29hbShsaW5rX3JlYywgZXZ0LT5kYXRhLnJ4X2ZyYW1lLnZhbCwgZXZ0LT5kYXRhLnJ4X2ZyYW1lLmxlbik7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fZW5jX2JpX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19ta2FfZnNtX3J4X2VhcG9sKGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUudmFsLCBldnQtPmRhdGEucnhfZnJhbWUubGVuKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9ta2FfY29tcGxldGUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGlmIChCQ01fRVJSX09LID09IGV2dC0+ZGF0YS5zdWJfc3RhdHVzKQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdWNjZXNzKGxpbmtfcmVjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGxpbmtfcmVjLCBldnQtPmRhdGEuc3ViX3N0YXR1cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2NvbXBfcnhfb2FtKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBpZiAoKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgPT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOKSB8fAorICAgICAgICAobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0RPV04pKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWU7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICpkcG9lOworCisgICAgICAgIG9hbV9mcmFtZSA9IGVwb25fb2FtX3VucGFjayhsaW5rX3JlYy0+ZGV2aWNlLCBldnQtPmRhdGEucnhfZnJhbWUubGVuLCBldnQtPmRhdGEucnhfZnJhbWUudmFsKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gb2FtX2ZyYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhXQVJOSU5HLCBsaW5rX3JlYywgIkZhaWxlZCB0byBwYXJzZSBPQU0gZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFlcG9uX29hbV9pc19kcG9lKG9hbV9mcmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUob2FtX2ZyYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGRwb2UgPSAmb2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlOworCisgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFID09IGRwb2UtPm9wKQorICAgICAgICB7CisgICAgICAgICAgICBfZHBvZV9zZWNfZnNtX2luc3RhbGxfZG5fa2V5KGxpbmtfcmVjLCBkcG9lKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9jb21wX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBpZiAobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJKQorICAgIHsKKyAgICAgICAgZHBvZV9zZWNfbWthX2ZzbV9yeF9lYXBvbChsaW5rX3JlYywgZXZ0LT5kYXRhLnJ4X2ZyYW1lLnZhbCwgZXZ0LT5kYXRhLnJ4X2ZyYW1lLmxlbik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX3RpbWVvdXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgQkNNX0VSUl9USU1FT1VUKTsKK30KKworc3RhdGljIGZfZHBvZV9zZWNfZnNtIGRwb2Vfc2VjX2ZzbVtEUE9FX1NFQ19GU01fU1RBVEVfX0NPVU5UXVtEUE9FX1NFQ19GU01fRVZFTlRfX0NPVU5UXSA9Cit7CisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9JRExFXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX0FVVEhfU1RBUlRdID0gX2Rwb2Vfc2VjX2ZzbV9hdXRoX3N0YXJ0LAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX0VOQ1JZUFRfU1RBUlRdID0gX2Rwb2Vfc2VjX2ZzbV9lbmNyeXB0X3N0YXJ0CisgICAgfSwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0FVVEhfV0FJVF0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfZnNtX2F1dGhfcnhfZWFwb2wsCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9DT01QTEVURV0gPSBfZHBvZV9zZWNfZnNtX2F1dGhfY29tcGxldGUsCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfVElNRU9VVF0gPSBfZHBvZV9zZWNfZnNtX3RpbWVvdXQKKyAgICB9LAorICAgIFtEUE9FX1NFQ19GU01fU1RBVEVfRU5DUllQVF9ET1dOX1dBSVRdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNXSA9IF9kcG9lX3NlY19mc21fZW5jX2RuX3J4X29hbSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUXSA9IF9kcG9lX3NlY19mc21fdGltZW91dAorICAgIH0sCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0JJX1dBSVRdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNXSA9IF9kcG9lX3NlY19mc21fZW5jX2JpX3J4X29hbSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfZnNtX2VuY19iaV9yeF9lYXBvbCwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9NS0FfQ09NUExFVEVdID0gX2Rwb2Vfc2VjX2ZzbV9ta2FfY29tcGxldGUsCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfVElNRU9VVF0gPSBfZHBvZV9zZWNfZnNtX3RpbWVvdXQKKyAgICB9LAorICAgIFtEUE9FX1NFQ19GU01fU1RBVEVfQ09NUExFVEVdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNXSA9IF9kcG9lX3NlY19mc21fY29tcF9yeF9vYW0sCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfUlhfRUFQT0xdID0gX2Rwb2Vfc2VjX2ZzbV9jb21wX3J4X2VhcG9sLAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX2ZzbV90aW1lb3V0CisgICAgfQorfTsKKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV91bmV4cGVjdGVkKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBEUE9FX1NFQ19MSU5LX0xPRyhXQVJOSU5HLCBsaW5rX3JlYywgIlVuZXhwZWN0ZWQgZXZlbnQgJXMgKCV1KSBpbiBzdGF0ZSAlcyAoJXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9kcG9lX3NlY19mc21fZXZlbnRfbmFtZShldnQtPnR5cGUpLCBldnQtPnR5cGUsIF9kcG9lX3NlY19mc21fc3RhdGVfbmFtZShsaW5rX3JlYy0+ZnNtX3N0YXRlKSwgbGlua19yZWMtPmZzbV9zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fZXhlYyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgaWYgKGV2dC0+dHlwZSA8IERQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlQpCisgICAgeworICAgICAgICBkcG9lX3NlY19mc21fc3RhdGUgcHJlX3N0YXRlID0gbGlua19yZWMtPmZzbV9zdGF0ZTsKKworICAgICAgICBpZiAoZHBvZV9zZWNfZnNtW2xpbmtfcmVjLT5mc21fc3RhdGVdW2V2dC0+dHlwZV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAicHJvY2Vzc2luZyBldmVudCAlcyBpbiBzdGF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kcG9lX3NlY19mc21fZXZlbnRfbmFtZShldnQtPnR5cGUpLCBfZHBvZV9zZWNfZnNtX3N0YXRlX25hbWUobGlua19yZWMtPmZzbV9zdGF0ZSkpOworICAgICAgICAgICAgZHBvZV9zZWNfZnNtW2xpbmtfcmVjLT5mc21fc3RhdGVdW2V2dC0+dHlwZV0obGlua19yZWMsIGV2dCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfZHBvZV9zZWNfZnNtX3VuZXhwZWN0ZWQobGlua19yZWMsIGV2dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGlua19yZWMtPmZzbV9zdGF0ZSAhPSBwcmVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgInRyYW5zaXRpb24gZnJvbSAlcyB0byAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kcG9lX3NlY19mc21fc3RhdGVfbmFtZShwcmVfc3RhdGUpLCBfZHBvZV9zZWNfZnNtX3N0YXRlX25hbWUobGlua19yZWMtPmZzbV9zdGF0ZSkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIlVua25vd24gZXZlbnQ6ICV1IiwgZXZ0LT50eXBlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBfZHBvZV9zZWNfZnNtX2xpbmtfdGltZXJfZXhwaXJlZChiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMgPSAoZHBvZV9zZWNfbGlua19yZWMqKWRhdGE7CisgICAgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgZXZ0OworCisgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfVElNRU9VVDsKKworICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19zdGFydF9oYW5kbGUoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZHBvZV9zZWNfZnNtX21zZyAqbXNnID0gKGRwb2Vfc2VjX2ZzbV9tc2cqKW9zX21zZzsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gb3NfbXNnLT5pbnN0YW5jZTsKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWM7CisgICAgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgZXZ0OworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGxpbmtfcmVjID0gaGFzaF90YWJsZV9nZXQoY3R4dFtkZXZpY2VdLmxpbmtfbWFwLCAoY29uc3QgdWludDhfdCopJm1zZy0+bGluayk7CisgICAgaWYgKGxpbmtfcmVjID09IE5VTEwpCisgICAgeworICAgICAgICBkcG9lX3NlY19saW5rX3JlYyBuZXdfbGluazsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIHBvbl9jZmc7CisgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGxpbmtfY2ZnOworICAgICAgICBiY21vbHRfZXBvbl9uaV9rZXkgcG9uX2tleSA9IHsgLmVwb25fbmkgPSBtc2ctPmxpbmsuZXBvbl9uaSB9OworICAgICAgICBiY21vc190aW1lcl9wYXJtIHRwID0KKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAiZHBvZV9zZWNfZnNtX3RpbWVyIiwKKyAgICAgICAgICAgIC5vd25lciA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRFBPRV9TRUMgKyBkZXZpY2UsCisgICAgICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19GQUxTRSwKKyAgICAgICAgICAgIC5oYW5kbGVyID0gX2Rwb2Vfc2VjX2ZzbV9saW5rX3RpbWVyX2V4cGlyZWQsCisgICAgICAgICAgICAuZmxhZ3MgPSBCQ01PU19USU1FUl9QQVJNX0ZMQUdTX05PTl9VUkdFTlQKKyAgICAgICAgfTsKKworICAgICAgICAvKiByZXRyaWV2ZSB0aGUgRVBPTiBOSSBNQUMgYWRkcmVzcyAqLworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJnBvbl9jZmcsIGVwb25fbmksIHBvbl9rZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZwb25fY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7CisgICAgICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZSwgJnBvbl9jZmcuaGRyKTsKKyAgICAgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gZXJyKTsKKworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIG1zZy0+bGluayk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxsaWQpOworICAgICAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2UsICZsaW5rX2NmZy5oZHIpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtkZXZpY2VdLCAiRmFpbGVkIHRvIGdldCBMTElEXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIG5ld19saW5rLmRldmljZSA9IGRldmljZTsKKyAgICAgICAgbmV3X2xpbmsua2V5ID0gbXNnLT5saW5rOworICAgICAgICBuZXdfbGluay5uaV9tYWMgPSBwb25fY2ZnLmRhdGEubWFjX2FkZHJlc3M7CisgICAgICAgIG5ld19saW5rLmxsaWQgPSBsaW5rX2NmZy5kYXRhLmxsaWQ7CisgICAgICAgIG5ld19saW5rLmZzbV9zdGF0ZSA9IERQT0VfU0VDX0ZTTV9TVEFURV9JRExFOworICAgICAgICBuZXdfbGluay5zdGF0dXMgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworCisgICAgICAgIC8qIGFkZCBuZXcgcmVjIHRvIGhhc2ggdGFibGUgKi8KKyAgICAgICAgbGlua19yZWMgPSBoYXNoX3RhYmxlX3B1dChjdHh0W2RldmljZV0ubGlua19tYXAsICh1aW50OF90KikmbXNnLT5saW5rLCAmbmV3X2xpbmspOworICAgICAgICBpZiAobGlua19yZWMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsICZuZXdfbGluaywgIkZhaWxlZCB0byBzdG9yZSBsaW5rIHJlY29yZFxuIik7CisgICAgICAgIH0KKworICAgICAgICB0cC5kYXRhID0gKGxvbmcpbGlua19yZWM7CisgICAgICAgIGVyciA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmbGlua19yZWMtPnRpbWVvdXQsICZ0cCk7CisgICAgICAgIEJVR19PTihCQ01fRVJSX09LICE9IGVycik7CisgICAgfQorCisgICAgbGlua19yZWMtPmNmZyA9IG1zZy0+ZGF0YS5zdGFydDsKKworICAgIGlmICghbGlua19yZWMtPmNmZy5hdXRoIHx8IChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlICE9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkpKQorICAgIHsKKyAgICAgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfRU5DUllQVF9TVEFSVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9TVEFSVDsKKyAgICB9CisKKyAgICBfZHBvZV9zZWNfZnNtX2V4ZWMobGlua19yZWMsICZldnQpOworCisgICAgYmNtb3NfZnJlZShvc19tc2cpOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2xpbmtfcnhfb2FtX2hhbmRsZShiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnICptc2cgPSAoZHBvZV9zZWNfZnNtX21zZyopb3NfbXNnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSBvc19tc2ctPmluc3RhbmNlOworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYzsKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisKKyAgICBsaW5rX3JlYyA9IGhhc2hfdGFibGVfZ2V0KGN0eHRbZGV2aWNlXS5saW5rX21hcCwgKHVpbnQ4X3QqKSZtc2ctPmxpbmspOworICAgIGlmIChsaW5rX3JlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJGYWlsZWQgdG8gZmluZCBsaW5rOiBQT04gJXUsICJCQ01PU19NQUNBRERSX0ZNVF9TVFIiXG4iLAorICAgICAgICAgICAgICAgIG1zZy0+bGluay5lcG9uX25pLCBCQ01PU19NQUNBRERSX1BBUkFNUygmbXNnLT5saW5rLm1hY19hZGRyZXNzKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV2dC50eXBlID0gRFBPRV9TRUNfRlNNX0VWRU5UX1JYX09BTTsKKyAgICAgICAgZXZ0LmRhdGEucnhfZnJhbWUudmFsID0gbXNnLT5kYXRhLnJ4X2ZyYW1lLmZyYW1lOworICAgICAgICBldnQuZGF0YS5yeF9mcmFtZS5sZW4gPSBtc2ctPmRhdGEucnhfZnJhbWUubGVuZ3RoOworICAgICAgICBfZHBvZV9zZWNfZnNtX2V4ZWMobGlua19yZWMsICZldnQpOworICAgIH0KKworICAgIGJjbW9zX2ZyZWUobXNnLT5kYXRhLnJ4X2ZyYW1lLmZyYW1lKTsKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19yeF9lYXBvbF9oYW5kbGUoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZHBvZV9zZWNfZnNtX21zZyAqbXNnID0gKGRwb2Vfc2VjX2ZzbV9tc2cqKW9zX21zZzsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gb3NfbXNnLT5pbnN0YW5jZTsKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWM7CisgICAgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgZXZ0OworCisgICAgbGlua19yZWMgPSBoYXNoX3RhYmxlX2dldChjdHh0W2RldmljZV0ubGlua19tYXAsICh1aW50OF90KikmbXNnLT5saW5rKTsKKyAgICBpZiAobGlua19yZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJGYWlsZWQgdG8gZmluZCBsaW5rOiBQT04gJXUsICJCQ01PU19NQUNBRERSX0ZNVF9TVFIiXG4iLAorICAgICAgICAgICAgICAgIG1zZy0+bGluay5lcG9uX25pLCBCQ01PU19NQUNBRERSX1BBUkFNUygmbXNnLT5saW5rLm1hY19hZGRyZXNzKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV2dC50eXBlID0gRFBPRV9TRUNfRlNNX0VWRU5UX1JYX0VBUE9MOworICAgICAgICBldnQuZGF0YS5yeF9mcmFtZS52YWwgPSBtc2ctPmRhdGEucnhfZnJhbWUuZnJhbWU7CisgICAgICAgIGV2dC5kYXRhLnJ4X2ZyYW1lLmxlbiA9IG1zZy0+ZGF0YS5yeF9mcmFtZS5sZW5ndGg7CisgICAgICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShvc19tc2cpOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2xpbmtfYXV0aF9jb21wbGV0ZShkcG9lX3NlY19saW5rX3JlYyogbGlua19yZWMsIGJjbW9zX2Vycm5vIHN0YXR1cykKK3sKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisKKyAgICBldnQudHlwZSA9IERQT0VfU0VDX0ZTTV9FVkVOVF9BVVRIX0NPTVBMRVRFOworICAgIGV2dC5kYXRhLnN1Yl9zdGF0dXMgPSBzdGF0dXM7CisKKyAgICBfZHBvZV9zZWNfZnNtX2V4ZWMobGlua19yZWMsICZldnQpOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2xpbmtfbWthX2NvbXBsZXRlKGRwb2Vfc2VjX2xpbmtfcmVjKiBsaW5rX3JlYywgYmNtb3NfZXJybm8gc3RhdHVzKQoreworICAgIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhIGV2dDsKKworICAgIGV2dC50eXBlID0gRFBPRV9TRUNfRlNNX0VWRU5UX01LQV9DT01QTEVURTsKKyAgICBldnQuZGF0YS5zdWJfc3RhdHVzID0gc3RhdHVzOworCisgICAgX2Rwb2Vfc2VjX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZ0KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19mc21faW5pdF90YXNrKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSBjdHh0W2RldmljZV0udGFza19uYW1lLAorICAgICAgICAucHJpb3JpdHkgICAgID0gVEFTS19QUklPUklUWV9VU0VSX0FQUExfRFBPRV9TRUMsCisgICAgICAgIC5jb3JlICAgICAgICAgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisgICAgc25wcmludGYoY3R4dFtkZXZpY2VdLnRhc2tfbmFtZSwgc2l6ZW9mKGN0eHRbZGV2aWNlXS50YXNrX25hbWUpLCAidXNlcl9hcHBsX2Rwb2Vfc2VjJXUiLCBkZXZpY2UpOworICAgIGJjbW9zX2Vycm5vIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJmN0eHRbZGV2aWNlXS50YXNrLCAmdGFza19wYXJhbXMpOworCisgICAgcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfZnNtX2luaXRfbW9kdWxlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gbW9kdWxlX3BhcmFtcyA9CisgICAgeworICAgICAgICAucXBhcm0gPSB7IC5uYW1lID0gY3R4dFtkZXZpY2VdLm1zZ19xdWV1ZV9uYW1lLCAuc2l6ZSA9IERQT0VfU0VDX0ZTTV9UQVNLX01TR19RX1NJWkUgfSwKKyAgICAgICAgLmluaXQgPSBOVUxMCisgICAgfTsKKyAgICBzbnByaW50ZihjdHh0W2RldmljZV0ubXNnX3F1ZXVlX25hbWUsIHNpemVvZihjdHh0W2RldmljZV0ubXNnX3F1ZXVlX25hbWUpLCAiZHBvZV9zZWNfbXNnX3EldSIsIGRldmljZSk7CisgICAgcmV0dXJuIGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwgJmN0eHRbZGV2aWNlXS50YXNrLCAmbW9kdWxlX3BhcmFtcyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfZnNtX3NlbmRfb3NfbXNnKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXksCisgICAgYmNtb3NfbXNnX2lkIHR5cGUsCisgICAgZHBvZV9zZWNfZnNtX21zZ19kYXRhICpkYXRhKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGRwb2Vfc2VjX2ZzbV9tc2cgKm1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtkZXZpY2VdLCAiT1MgTWVzc2FnZSBjYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgbXNnLT5vc19tc2cuaW5zdGFuY2UgPSBkZXZpY2U7CisgICAgbXNnLT5vc19tc2cudHlwZSA9IHR5cGU7CisgICAgbXNnLT5saW5rID0gbGlua19rZXk7CisgICAgbXNnLT5kYXRhID0gKmRhdGE7CisgICAgcmMgPSBiY21vc19tc2dfZGlzcGF0Y2goJm1zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJPUyBNZXNzYWdlIHNlbmQgZmFpbGVkICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBkcG9lX3NlY19mc21fbGlua19zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSwgZHBvZV9zZWNfZnNtX3N0YXJ0X2RhdGEgKmNmZykKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnX2RhdGEgZGF0YTsKKworICAgIGRhdGEuc3RhcnQgPSAqY2ZnOworCisgICAgcmV0dXJuIF9kcG9lX3NlY19mc21fc2VuZF9vc19tc2coZGV2aWNlLCBsaW5rX2tleSwgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1NUQVJULCAmZGF0YSk7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3J4X29hbShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSwgdWludDhfdCAqb2FtLCB1aW50MTZfdCBsZW5ndGgpCit7CisgICAgZHBvZV9zZWNfZnNtX21zZ19kYXRhIGRhdGE7CisKKyAgICBkYXRhLnJ4X2ZyYW1lLmZyYW1lID0gb2FtOworICAgIGRhdGEucnhfZnJhbWUubGVuZ3RoID0gbGVuZ3RoOworCisgICAgcmV0dXJuIF9kcG9lX3NlY19mc21fc2VuZF9vc19tc2coZGV2aWNlLCBsaW5rX2tleSwgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1JYX09BTSwgJmRhdGEpOworfQorCitiY21vc19lcnJubyBkcG9lX3NlY19mc21fbGlua19yeF9lYXBvbCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5LAorICAgIHVpbnQ4X3QgKmVhcG9sLAorICAgIHVpbnQxNl90IGxlbmd0aCkKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnX2RhdGEgZGF0YTsKKworICAgIGRhdGEucnhfZnJhbWUuZnJhbWUgPSBlYXBvbDsKKyAgICBkYXRhLnJ4X2ZyYW1lLmxlbmd0aCA9IGxlbmd0aDsKKworICAgIHJldHVybiBfZHBvZV9zZWNfZnNtX3NlbmRfb3NfbXNnKGRldmljZSwgbGlua19rZXksIEJDTU9TX01TR19JRF9EUE9FX1NFQ19SWF9FQVBPTCwgJmRhdGEpOworfQorCitiY21vc19lcnJubyBkcG9lX3NlY19mc21faW5pdCgKKyAgICBmX2Rwb2Vfc2VjX2NlcnRfdHJ1c3RfY2IgY2VydF90cnVzdF9jYiwKKyAgICBmX2Rwb2Vfc2VjX2ZzbV9jYiBmc21fY29tcGxldGVfY2IpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBmb3IgKHVpbnQzMl90IGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisgICAgICAgIHJjID0gX2Rwb2Vfc2VjX2ZzbV9pbml0X3Rhc2soZGV2aWNlKTsKKyAgICAgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgICAgIHJjID0gX2Rwb2Vfc2VjX2ZzbV9pbml0X21vZHVsZShkZXZpY2UpOworICAgICAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSksICJ1c2VyX2FwcGxfZHBvZV9zZWMldSIsIGRldmljZSk7CisgICAgICAgIGRwb2Vfc2VjX2xvZ19pZFtkZXZpY2VdID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworCisgICAgICAgIGJjbW9zX21zZ19yZWdpc3RlcigKKyAgICAgICAgICAgIEJDTU9TX01TR19JRF9EUE9FX1NFQ19TVEFSVCwKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRFBPRV9TRUMgKyBkZXZpY2UsCisgICAgICAgICAgICBfZHBvZV9zZWNfZnNtX2xpbmtfc3RhcnRfaGFuZGxlKTsKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1JYX09BTSwKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRFBPRV9TRUMgKyBkZXZpY2UsCisgICAgICAgICAgICBfZHBvZV9zZWNfZnNtX2xpbmtfcnhfb2FtX2hhbmRsZSk7CisgICAgICAgIGJjbW9zX21zZ19yZWdpc3RlcigKKyAgICAgICAgICAgIEJDTU9TX01TR19JRF9EUE9FX1NFQ19SWF9FQVBPTCwKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRFBPRV9TRUMgKyBkZXZpY2UsCisgICAgICAgICAgICBfZHBvZV9zZWNfZnNtX2xpbmtfcnhfZWFwb2xfaGFuZGxlKTsKKworICAgICAgICBjdHh0W2RldmljZV0ubGlua19tYXAgPSBoYXNoX3RhYmxlX2NyZWF0ZSgKKyAgICAgICAgICAgIERQT0VfU0VDX0ZTTV9NQVhfTElOS1MsCisgICAgICAgICAgICBzaXplb2YoZHBvZV9zZWNfbGlua19yZWMpLAorICAgICAgICAgICAgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KSwKKyAgICAgICAgICAgICJkcG9lX3NlY19saW5rX3N0YXRlIik7CisgICAgICAgIEJVR19PTihjdHh0W2RldmljZV0ubGlua19tYXAgPT0gTlVMTCk7CisgICAgfQorCisgICAgX2ZzbV9jb21wbGV0ZSA9IGZzbV9jb21wbGV0ZV9jYjsKKworICAgIGRwb2VfZWFwX3Rsc19pbml0KF9kcG9lX3NlY19mc21fbGlua19hdXRoX2NvbXBsZXRlLCBjZXJ0X3RydXN0X2NiKTsKKyAgICBkcG9lX3NlY19ta2FfZnNtX2luaXQoX2Rwb2Vfc2VjX2ZzbV9saW5rX21rYV9jb21wbGV0ZSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfZnNtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX2ZzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOGIzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX2ZzbS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9EUE9FX1NFQ19GU01fSF8KKyNkZWZpbmUgX0RQT0VfU0VDX0ZTTV9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmgiCisjaW5jbHVkZSAiZHBvZV9lYXBfdGxzLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfbWthX2ZzbS5oIgorCisvKiBEUG9FIFNlY3VyaXR5IEZTTSBFdmVudCBUeXBlIGRlZmluaXRpb25zICovCit0eXBlZGVmIGVudW0gZHBvZV9zZWNfZnNtX2V2ZW50Cit7CisgICAgRFBPRV9TRUNfRlNNX0VWRU5UX19GSVJTVCwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfRU5DUllQVF9TVEFSVCA9IERQT0VfU0VDX0ZTTV9FVkVOVF9fRklSU1QsCisgICAgRFBPRV9TRUNfRlNNX0VWRU5UX0FVVEhfU1RBUlQsCisgICAgRFBPRV9TRUNfRlNNX0VWRU5UX1JYX09BTSwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfUlhfRUFQT0wsCisgICAgRFBPRV9TRUNfRlNNX0VWRU5UX0FVVEhfQ09NUExFVEUsCisgICAgRFBPRV9TRUNfRlNNX0VWRU5UX01LQV9DT01QTEVURSwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfVElNRU9VVCwKKworICAgIERQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlQKK30gZHBvZV9zZWNfZnNtX2V2ZW50OworCisvKiBEUG9FIFNlY3VyaXR5IEZTTSBTdGF0ZSBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBlbnVtIGRwb2Vfc2VjX2ZzbV9zdGF0ZQoreworICAgIERQT0VfU0VDX0ZTTV9TVEFURV9fRklSU1QsCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX0lETEUgPSBEUE9FX1NFQ19GU01fU1RBVEVfX0ZJUlNULAorICAgIERQT0VfU0VDX0ZTTV9TVEFURV9BVVRIX1dBSVQsCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfRE9XTl9XQUlULAorICAgIERQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0JJX1dBSVQsCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX0NPTVBMRVRFLAorCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX19DT1VOVAorfSBkcG9lX3NlY19mc21fc3RhdGU7CisKKy8qIERQb0UgU2VjdXJpdHkgRlNNIEV2ZW50IGNvbnRlbnRzLiBUaGlzIGlzIGEgdW5pb24gb2YgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIERQb0UgU2VjdXJpdHkgRlNNLiBUaGlzIGRhdGEgdHlwZQorICogcGVybWl0cyBhIGNvbW1vbiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRhYmxlLiAqLwordHlwZWRlZiBzdHJ1Y3QgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEKK3sKKyAgICBkcG9lX3NlY19mc21fZXZlbnQgdHlwZTsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTE2IHJ4X2ZyYW1lOworICAgICAgICBiY21vc19lcnJubyBzdWJfc3RhdHVzOworICAgIH0gZGF0YTsKK30gZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGE7CisKK3N0cnVjdCBkcG9lX3NlY19saW5rX3JlYzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgZW5jX21vZGU7CisgICAgYmNtb3NfYm9vbCBhdXRoOworfSBkcG9lX3NlY19mc21fc3RhcnRfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsKKyAgICBkcG9lX3NlY19mc21fc3RhcnRfZGF0YSBjZmc7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbmlfbWFjOworICAgIGJjbW9sdF9lcG9uX2xsaWQgbGxpZDsKKyAgICBkcG9lX3NlY19mc21fc3RhdGUgZnNtX3N0YXRlOworICAgIGJjbW9zX2Vycm5vIHN0YXR1czsKKyAgICBiY21vc190aW1lciB0aW1lb3V0OworICAgIG9udV9hdXRoX2NvbnRyb2wgYXV0aF9jdHJsOworICAgIGRwb2Vfc2VjX21rYV9mc21fY3RybCBta2FfY3RybDsKK30gZHBvZV9zZWNfbGlua19yZWM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAqZnJhbWU7CisgICAgdWludDE2X3QgbGVuZ3RoOworfSBkcG9lX3NlY19mc21fcnhfZnJhbWVfZGF0YTsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGRwb2Vfc2VjX2ZzbV9zdGFydF9kYXRhIHN0YXJ0OworICAgIGRwb2Vfc2VjX2ZzbV9yeF9mcmFtZV9kYXRhIHJ4X2ZyYW1lOworfSBkcG9lX3NlY19mc21fbXNnX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnIG9zX21zZzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rOworICAgIGRwb2Vfc2VjX2ZzbV9tc2dfZGF0YSBkYXRhOworfSBkcG9lX3NlY19mc21fbXNnOworCit0eXBlZGVmIHZvaWQgKCpmX2Rwb2Vfc2VjX2ZzbV9jYikoYmNtb2x0X2RldmlkLCBiY21vbHRfZXBvbl9saW5rX2tleSwgYmNtb3NfZXJybm8pOworCitiY21vc19lcnJubyBkcG9lX3NlY19mc21fbGlua19zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSwgZHBvZV9zZWNfZnNtX3N0YXJ0X2RhdGEgKmNmZyk7CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3J4X29hbShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rLCB1aW50OF90ICpvYW0sIHVpbnQxNl90IGxlbmd0aCk7CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3J4X2VhcG9sKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmssIHVpbnQ4X3QgKmVhcG9sLCB1aW50MTZfdCBsZW5ndGgpOworCitiY21vc19lcnJubyBkcG9lX3NlY19mc21faW5pdChmX2Rwb2Vfc2VjX2NlcnRfdHJ1c3RfY2IgY2VydF90cnVzdF9jYiwgZl9kcG9lX3NlY19mc21fY2IgZnNtX2NvbXBsZXRlX2NiKTsKKworI2VuZGlmIC8qIF9EUE9FX1NFQ19GU01fSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfbWthX2ZzbS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19ta2FfZnNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NGQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfbWthX2ZzbS5jCkBAIC0wLDAgKzEsODMwIEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJkcG9lX3NlY19mc20uaCIKKyNpbmNsdWRlICJkcG9lX3NlY19ta2FfZnNtLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX3V0aWwuaCIKKwordHlwZWRlZiBlbnVtIGRwb2Vfc2VjX21rYV9mc21fZXZlbnRfdHlwZQoreworICAgIERQT0VfU0VDX01LQV9GU01fRVZFTlRfX0lOVkFMSUQgICAgID0gLTEsIC8qKjwgcGVybWl0cyBldmVudCB2YWxpZGF0aW9uICovCisKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX0lOSVQgICAgICAgICA9ICAwLAorICAgIERQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfT0FNICAgICAgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX0VBUE9MICAgICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9USU1FT1VUICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9TVE9QICAgICAgICAgLAorCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9fQ09VTlQKK30gZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlOworCisvKiBNS0EgRlNNIEV2ZW50IGNvbnRlbnRzLiBUaGlzIGlzIGEgdW5pb24gb2YgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIE1LQSBGU00uIFRoaXMgZGF0YSB0eXBlIHBlcm1pdHMgYSBjb21tb24KKyAqIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdGFibGUuICovCit0eXBlZGVmIHN0cnVjdCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50Cit7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlIHR5cGU7IC8qKjwgVHlwZSBvZiBldmVudCovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UxNiByeF9mcmFtZTsKKyAgICB9IGRhdGE7Cit9IGRwb2Vfc2VjX21rYV9mc21fZXZlbnQ7CisKK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpmX2Rwb2Vfc2VjX21rYV9mc20pKGRwb2Vfc2VjX2xpbmtfcmVjICpta2FfY3RybCwgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRwb2Vfc2VjX21rYV9mc21fZXZlbnRfbmFtZVtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX19DT1VOVF0gPQoreworICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX0lOSVRdID0gIkluaXRpYWxpemF0aW9uIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9PQU1dID0gIk9BTSBSZXNwb25zZSIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfRUFQT0xdID0gIlJYIEVBUE9MIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9USU1FT1VUXSA9ICJGU00gVGltZW91dCIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfVFhfVElNRU9VVF0gPSAiTUtBIFRpbWVvdXQiLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1BdID0gIlN0b3AiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZV9uYW1lW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfX0NPVU5UXSA9Cit7CisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTF0gPSAiTnVsbCIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VUX0VOQ1JZUFRJT05dID0gIlNldCBFbmNyeXB0aW9uIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TVEFSVF9NS0EgXSA9ICJTdGFydCBNS0EiLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfU0FLXSA9ICJTZW5kIFNBSyIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfT1BFUkFUSU9OQUxdID0gIk9wZXJhdGlvbmFsIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRU5EX05FV19TQUtdID0gIlNlbmQgTmV3IFNBSyIKK307CisKK3N0YXRpYyBmX2Rwb2Vfc2VjX21rYV9jYiBfbWthX2RvbmVfY2I7CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpOworCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlX2lzX3ZhbGlkKGRwb2Vfc2VjX21rYV9mc21fZXZlbnRfdHlwZSB0eXBlKQoreworICAgIHJldHVybiAodHlwZSA+IERQT0VfU0VDX01LQV9GU01fRVZFTlRfX0lOVkFMSUQpICYmICh0eXBlIDwgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9fQ09VTlQpOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZV9pc192YWxpZChkcG9lX3NlY19ta2FfZnNtX3N0YXRlIHN0YXRlKQoreworICAgIHJldHVybiAoc3RhdGUgPiBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX19JTlZBTElEKSAmJiAoc3RhdGUgPCBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX19DT1VOVCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZHBvZV9zZWNfbWthX2ZzbV9ldmVudF9uYW1lKGRwb2Vfc2VjX21rYV9mc21fZXZlbnRfdHlwZSB0eXBlKQoreworICAgIGlmIChfZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlX2lzX3ZhbGlkKHR5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRwb2Vfc2VjX21rYV9mc21fZXZlbnRfbmFtZVt0eXBlXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICJVbmtub3duIEV2ZW50IjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZV9uYW1lKGRwb2Vfc2VjX21rYV9mc21fc3RhdGUgc3RhdGUpCit7CisgICAgaWYgKF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX2lzX3ZhbGlkKHN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBkcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWVbc3RhdGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIlVua25vd24gU3RhdGUiOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX2Vycm9yKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIC8qIFRPRE86IGxvZyB1bmV4cGVjdGVkIGV2ZW50ICovCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX21rYV9mc21fY2xlYW51cChkcG9lX3NlY19ta2FfZnNtX2N0cmwgKm1rYV9jdHJsKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG1rYV9jdHJsID09IE5VTEwpOworCisgICAgaWYgKG1rYV9jdHJsLT5ta2FfaW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgYWxsIE1LQSBpbmZvcm1hdGlvbiBiZWZvcmUgZnJlZWluZy4gKi8KKyAgICAgICAgbWVtc2V0KG1rYV9jdHJsLT5ta2FfaW5mbywgMCwgc2l6ZW9mKCpta2FfY3RybC0+bWthX2luZm8pKTsKKyAgICAgICAgYmNtb3NfZnJlZShta2FfY3RybC0+bWthX2luZm8pOworICAgICAgICBta2FfY3RybC0+bWthX2luZm8gPSBOVUxMOworICAgIH0KKworICAgIGlmIChta2FfY3RybC0+bWthX2ZzbV9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBDbGVhciBhbGwgTUtBIEZTTSBpbmZvcm1hdGlvbiBiZWZvcmUgZnJlZWluZy4gKi8KKyAgICAgICAgbWVtc2V0KG1rYV9jdHJsLT5ta2FfZnNtX2luZm8sIDAsIHNpemVvZigqbWthX2N0cmwtPm1rYV9mc21faW5mbykpOworICAgICAgICBiY21vc19mcmVlKG1rYV9jdHJsLT5ta2FfZnNtX2luZm8pOworICAgICAgICBta2FfY3RybC0+bWthX2ZzbV9pbmZvID0gTlVMTDsKKyAgICB9CisKKyAgICBta2FfY3RybC0+bWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3N0b3AoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgLyogVGhlIHN0b3AgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgTGluayBkZXJlZ2lzdGVycyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIE1LQSBGU00gaXMgcnVubmluZyBvciBub3QuCisgICAgICAgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBydW5uaW5nLiAqLworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvKiBTdG9wIGFueSB0aW1lcnMgdGhhdCBtYXkgYmUgcnVubmluZy4gKi8KKyAgICBiY21vc190aW1lcl9zdG9wKCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT5yeF90aW1lcik7CisgICAgYmNtb3NfdGltZXJfc3RvcCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+dHhfdGltZXIpOworCisgICAgLyogQ2hhbmdlIHRvIHRoZSBOVUxMIHN0YXRlICovCisgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGUgPSBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX05VTEw7CisKKyAgICAvKiBGcmVlIGR5bmFtaWMgTUtBIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuICovCisgICAgX2Rwb2Vfc2VjX21rYV9mc21fY2xlYW51cCgmbGlua19yZWMtPm1rYV9jdHJsKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZXJfZXhwaXJlKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYyA9IChkcG9lX3NlY19saW5rX3JlYyopZGF0YTsKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2bnQgPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBDaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBTZXQgdXAgdGhlIGV2ZW50ICovCisgICAgZXZudC50eXBlID0gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9USU1FT1VUOworCisgICAgLyogRXhlY3V0ZSB0aGUgc3RhdGUgbWFjaGluZSAqLworICAgIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMobGlua19yZWMsICZldm50KTsKKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIF9kcG9lX3NlY19ta2FfZnNtX3R4X3RpbWVyX2V4cGlyZShiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMgPSAoZHBvZV9zZWNfbGlua19yZWMqKWRhdGE7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCBldm50ID0ge307CisKKyAgICAvKiBQYXJhbWV0ZXIgQ2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworCisgICAgLyogU2V0IHVwIHRoZSBldmVudCAqLworICAgIGV2bnQudHlwZSA9IERQT0VfU0VDX01LQV9GU01fRVZFTlRfVFhfVElNRU9VVDsKKworICAgIC8qIEV4ZWN1dGUgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKyAgICBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZudCk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9pbml0aWFsaXplKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vc190aW1lcl9wYXJtIHJ4X3RwID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gImRwb2Vfc2VjX21rYV9mc21fdGltZXIiLAorICAgICAgICAub3duZXIgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0RQT0VfU0VDICsgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgLnBlcmlvZGljID0gQkNNT1NfRkFMU0UsCisgICAgICAgIC5oYW5kbGVyID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZXJfZXhwaXJlLAorICAgICAgICAuZGF0YSA9IChsb25nKWxpbmtfcmVjLAorICAgICAgICAuZmxhZ3MgPSBCQ01PU19USU1FUl9QQVJNX0ZMQUdTX05PTl9VUkdFTlQKKyAgICB9OworICAgIGJjbW9zX3RpbWVyX3Bhcm0gdHhfdHAgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZHBvZV9zZWNfbWthX21rYV90aW1lciIsCisgICAgICAgIC5vd25lciA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRFBPRV9TRUMgKyBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19UUlVFLAorICAgICAgICAuaGFuZGxlciA9IF9kcG9lX3NlY19ta2FfZnNtX3R4X3RpbWVyX2V4cGlyZSwKKyAgICAgICAgLmRhdGEgPSAobG9uZylsaW5rX3JlYywKKyAgICAgICAgLmZsYWdzID0gQkNNT1NfVElNRVJfUEFSTV9GTEFHU19OT05fVVJHRU5UCisgICAgfTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBNS0EgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAqLworICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbykpOworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIHRoZSBNS0EgRlNNIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gKi8KKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbykpOworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpCisgICAgeworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9jbGVhbnVwKCZsaW5rX3JlYy0+bWthX2N0cmwpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vc190aW1lcl9jcmVhdGUoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCAmcnhfdHApOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX2NsZWFudXAoJmxpbmtfcmVjLT5ta2FfY3RybCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gYmNtb3NfdGltZXJfY3JlYXRlKCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lciwgJnR4X3RwKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9jbGVhbnVwKCZsaW5rX3JlYy0+bWthX2N0cmwpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIENoYW5nZSB0byB0aGUgU0VUX0xJTktfRU5DUllQVElPTl9NT0RFIHN0YXRlICovCisgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGUgPSBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFVF9FTkNSWVBUSU9OOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT5yeF90aW1lciwgRFBPRV9TRUNfT0FNX1RJTUVPVVQpOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2Vfc2V0X2VuY3J5cHRpb24oCisgICAgICAgIGxpbmtfcmVjLT5kZXZpY2UsCisgICAgICAgIGxpbmtfcmVjLT5rZXkuZXBvbl9uaSwKKyAgICAgICAgJmxpbmtfcmVjLT5rZXkubWFjX2FkZHJlc3MsCisgICAgICAgIGxpbmtfcmVjLT5jZmcuZW5jX21vZGUsCisgICAgICAgIDApOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9zdWNjZXNzKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oX21rYV9kb25lX2NiID09IE5VTEwpOworCisgICAgX21rYV9kb25lX2NiKGxpbmtfcmVjLCBCQ01fRVJSX09LKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9mYWlsdXJlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb3NfZXJybm8gcmVhc29uKQoreworICAgIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgZXZlbnQgPSB7IC50eXBlID0gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9TVE9QIH07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oX21rYV9kb25lX2NiID09IE5VTEwpOworCisgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiTUtBIHN0b3BwaW5nIVxuIik7CisKKyAgICAvKiBOb3RpZnkgdGhlIERQb0UgU2VjdXJpdHkgRlNNIG9mIHRoZSBNS0EgZXJyb3IuICovCisgICAgX21rYV9kb25lX2NiKGxpbmtfcmVjLCByZWFzb24pOworCisgICAgLyogU3RvcCB0aGUgRlNNIGR1ZSB0byB0aGUgZXJyb3IuICovCisgICAgcmV0dXJuIF9kcG9lX3NlY19ta2FfZnNtX3N0b3AobGlua19yZWMsICZldmVudCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lb3V0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIlRJTUVPVVQgZXJyb3IhXG4iKTsKKworICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSBlcnJvci4gKi8KKyAgICByZXR1cm4gX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9mYWlsdXJlKGxpbmtfcmVjLCBCQ01fRVJSX1RJTUVPVVQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fcnhfb2FtKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0LT5kYXRhLnJ4X2ZyYW1lLnZhbCA9PSBOVUxMKTsKKworICAgIG9hbV9mcmFtZSA9IGVwb25fb2FtX3VucGFjayhsaW5rX3JlYy0+ZGV2aWNlLCBldnQtPmRhdGEucnhfZnJhbWUubGVuLCBldnQtPmRhdGEucnhfZnJhbWUudmFsKTsKKyAgICBpZiAoTlVMTCA9PSBvYW1fZnJhbWUpCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJPQU0gdW5wYWNrIGZhaWxlZCFcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBpZiAoIWVwb25fb2FtX2lzX2Rwb2Uob2FtX2ZyYW1lKSkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUob2FtX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgZHBvZSA9ICZvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWU7CisKKyAgICBpZiAoZXBvbl9vYW1faXNfZHBvZV9lbmNyeXB0X3Jlc3BvbnNlKGRwb2UpKQorICAgIHsKKyAgICAgICAgaWYgKChkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCA9PSAweDgwKSAmJgorICAgICAgICAgICAgKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID09IDB4ODApKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190aW1lcl9zdG9wKCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT5yeF90aW1lcik7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSB0byB0aGUgU1RBUlRfTUtBIHN0YXRlICovCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfU1RBUlRfTUtBOworCisgICAgICAgICAgICAvKiBTZW5kIHRoZSBpbml0aWFsIE1LQSBwYWNrZXQgdG8gdGhlIE9OVSBmb3IgdGhlIHNwZWNpZmllZCBsaW5rLiAqLworICAgICAgICAgICAgcmMgPSBta2Ffc3RhcnQobGlua19yZWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiT05VIHJlamVjdGVkIGVuY3J5cHRpb246IFswXSA9IDB4JXgsIFsxXSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoKTsKKyAgICAgICAgICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSBlcnJvci4gKi8KKyAgICAgICAgICAgIHJjID0gX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9mYWlsdXJlKGxpbmtfcmVjLCBCQ01fRVJSX09OVV9FUlJfUkVTUCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogaWdub3JlIG90aGVyIE9BTSAqLworICAgIH0KKworICAgIGJjbW9zX2ZyZWUob2FtX2ZyYW1lKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3N0YXJ0X3RpbWVvdXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmV0dXJuIG1rYV9wcm9jZXNzX3RpbWVvdXQobGlua19yZWMsIE1LQV9PUF9TVEFSVF9USU1FT1VUKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3N0YXJ0X3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJjID0gbWthX3Byb2Nlc3NfcGFja2V0KGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUsIE1LQV9PUF9TVEFSVF9SU1ApOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9pbmZvOworCisgICAgICAgIC8qIFJlLXN0YXJ0IHRoZSByeCB0aW1lciAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKKworICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgaW5pdGlhbCBTQUsuICovCisgICAgICAgIG1rYV9nZW5lcmF0ZV9zYWsobGlua19yZWMsIEJDTU9TX1RSVUUpOworCisgICAgICAgIGtleV9pbmZvLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLmtleSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5zYWssIHNpemVvZihrZXlfaW5mby51LmN0ci5rZXkpKTsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLnNjaSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbnVfc2NpLCBzaXplb2Yoa2V5X2luZm8udS5jdHIuc2NpKSk7CisKKyAgICAgICAgLyogSW5zdGFsbCB0aGUgU0FLIGFzIHRoZSBVUyBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBsaW5rLiAqLworICAgICAgICByYyA9IGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgICAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgICAgICZsaW5rX3JlYy0+a2V5LAorICAgICAgICAgICAgQkNNT1NfVFJVRSwKKyAgICAgICAgICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTLAorICAgICAgICAgICAgKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpKChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgKyAxKSAlIDIpLAorICAgICAgICAgICAgJmtleV9pbmZvKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWthX3NlbmRfc2FrKGxpbmtfcmVjLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhayk7CisgICAgICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDaGFuZ2UgdG8gdGhlIFNFTkRfU0FLIHN0YXRlICovCisgICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGUgPSBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfU0FLOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgInNlbmQgU0FLIGZhaWxlZCFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAia2V5IHNldCBmYWlsZWQgJWQhXG4iLCByYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiTUtBIHByb2Nlc3MgcGFja2V0IGZhaWxlZCFcbiIpOworICAgIH0KKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9zYWtfdGltZW91dChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICByZXR1cm4gbWthX3Byb2Nlc3NfdGltZW91dChsaW5rX3JlYywgTUtBX09QX1NBS19USU1FT1VUKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3Nha19yeF9lYXBvbChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJjID0gbWthX3Byb2Nlc3NfcGFja2V0KGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUsIE1LQV9PUF9TQUtfUlNQKTsKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBrZXlfaW5mbzsKKworICAgICAgICAvKiBSZS1zdGFydCB0aGUgcnggdGltZXIgKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCBNS0FfTElGRV9USU1FICogMTAwMCk7CisKKyAgICAgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIua2V5LCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgc2l6ZW9mKGtleV9pbmZvLnUuY3RyLmtleSkpOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIuc2NpLCBsaW5rX3JlYy0+bmlfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgICAgIGtleV9pbmZvLnUuY3RyLnNjaVs2XSA9IChsaW5rX3JlYy0+bGxpZCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGtleV9pbmZvLnUuY3RyLnNjaVs3XSA9IChsaW5rX3JlYy0+bGxpZCA+PiAwKSAmIDB4ZmY7CisKKyAgICAgICAgLyogSW5zdGFsbCB0aGUgU0FLIGFzIHRoZSBVUyBhbmQgRFMgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgbGluay4gKi8KKyAgICAgICAgcmMgPSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fa2V5X3NldCgKKyAgICAgICAgICAgIGxpbmtfcmVjLT5kZXZpY2UsCisgICAgICAgICAgICAmbGlua19yZWMtPmtleSwKKyAgICAgICAgICAgIEJDTU9TX0ZBTFNFLAorICAgICAgICAgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMsCisgICAgICAgICAgICAoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSkoKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciArIDEpICUgMiksCisgICAgICAgICAgICAma2V5X2luZm8pOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBta2Ffc2VuZF9zYWtfY29uZmlybShsaW5rX3JlYyk7CisgICAgICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBOb3RpZnkgdGhlIERQb0UgU2VjdXJpdHkgRlNNIG9mIHRoZSBNS0EgcmVzdWx0LiAqLworICAgICAgICAgICAgICAgIHJjID0gX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9zdWNjZXNzKGxpbmtfcmVjKTsKKworICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0byB0aGUgT1BFUkFUSU9OQUwgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfT1BFUkFUSU9OQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSBlcnJvci4gKi8KKyAgICAgICAgX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9mYWlsdXJlKGxpbmtfcmVjLCByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9rZWVwX2FsaXZlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJldHVybiBta2FfcHJvY2Vzc190aW1lb3V0KGxpbmtfcmVjLCBNS0FfT1BfU0VORF9LRUVQX0FMSVZFKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3Nha19yZWZyZXNoKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBrZXlfaW5mbzsKKworICAgIC8qIEdlbmVyYXRlIHRoZSBuZXcgU0FLLiAqLworICAgIG1rYV9nZW5lcmF0ZV9zYWsobGlua19yZWMsIEJDTU9TX0ZBTFNFKTsKKworICAgIGtleV9pbmZvLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjsKKyAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIua2V5LCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgc2l6ZW9mKGtleV9pbmZvLnUuY3RyLmtleSkpOworICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5zY2ksIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b251X3NjaSwgc2l6ZW9mKGtleV9pbmZvLnUuY3RyLnNjaSkpOworCisgICAgLyogSW5zdGFsbCB0aGUgbmV3IFNBSyBhcyB0aGUgVVMgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgbGluay4gKi8KKyAgICByYyA9IGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgICAgICBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAmbGlua19yZWMtPmtleSwKKyAgICAgICAgQkNNT1NfVFJVRSwKKyAgICAgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMsCisgICAgICAgIChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyICsgMSkgJSAyKSwKKyAgICAgICAgJmtleV9pbmZvKTsKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJjID0gbWthX3NlbmRfc2FrKGxpbmtfcmVjLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm5ld19zYWspOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2hhbmdlIHRvIHRoZSBTRU5EX1NBSyBzdGF0ZSAqLworICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGUgPSBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfTkVXX1NBSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9oYW5kbGVfa2VlcF9hbGl2ZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIC8qIFBhc3MgdGhlIGtlZXAgYWxpdmUgbWVzc2FnZSB0byB0aGUgTUtBIHByb3BlciBjb2RlLiBJdCdzIG9rYXkgdG8gaWdub3JlIHRoZSByZXR1cm4gc3RhdHVzLiBGYWlsdXJlIHRvIG1haW50YWluCisgICAgICAgdGhlIE1LQSBjb25uZWN0aW9uIHRocm91Z2ggTUtBIGtlZXAgYWxpdmUgbWVzc2FnZXMgd2lsbCB0ZWFyIGRvd24gdGhlIE1LQSBjb25uZWN0aW9uLiAqLworICAgIHJjID0gbWthX3Byb2Nlc3NfcGFja2V0KGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUsIE1LQV9PUF9LRUVQX0FMSVZFKTsKKworICAgIC8qIENoZWNrIGlmIGEgU0FLIHJlZnJlc2ggaXMgbmVlZGVkLiAqLworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogUmUtc3RhcnQgdGhlIHJ4IHRpbWVyICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT5yeF90aW1lciwgTUtBX0xJRkVfVElNRSAqIDEwMDApOworCisgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNha19yZWZyZXNoX25lZWRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3RhcnQgdGhlIFNBSyByZWZyZXNoIHByb2Nlc3MuICovCisgICAgICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zYWtfcmVmcmVzaChsaW5rX3JlYywgZXZ0KTsKKworICAgICAgICAgICAgLyogQ2xlYXIgdGhlIFNBSyByZWZyZXNoIGZsYWcgc2luY2UgdGhlIFNBSyByZWZyZXNoIHByb2Nlc3MgaGFzIGJlZW4gc3RhcnRlZC4gKi8KKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrX3JlZnJlc2hfbmVlZGVkID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9uZXdfc2FrX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICByYyA9IG1rYV9wcm9jZXNzX3BhY2tldChsaW5rX3JlYywgZXZ0LT5kYXRhLnJ4X2ZyYW1lLCBNS0FfT1BfU0FLX1JTUCk7CisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBSZS1zdGFydCB0aGUgcnggdGltZXIgKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCBNS0FfTElGRV9USU1FICogMTAwMCk7CisKKyAgICAgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9pbmZvOworCisgICAgICAgIGtleV9pbmZvLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLmtleSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5zYWssIHNpemVvZihrZXlfaW5mby51LmN0ci5rZXkpKTsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLnNjaSwgbGlua19yZWMtPm5pX21hYy51OCwgQkNNT1NfRVRIX0FMRU4pOworICAgICAgICBrZXlfaW5mby51LmN0ci5zY2lbNl0gPSAobGlua19yZWMtPmxsaWQgPj4gOCkgJiAweGZmOworICAgICAgICBrZXlfaW5mby51LmN0ci5zY2lbN10gPSAobGlua19yZWMtPmxsaWQgPj4gMCkgJiAweGZmOworCisgICAgICAgIC8qIEluc3RhbGwgdGhlIG5ldyBTQUsgYXMgdGhlIFVTIGFuZCBEUyBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBsaW5rLiAqLworICAgICAgICByYyA9IGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgICAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgICAgICZsaW5rX3JlYy0+a2V5LAorICAgICAgICAgICAgQkNNT1NfRkFMU0UsCisgICAgICAgICAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUywKKyAgICAgICAgICAgIChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyICsgMSkgJSAyKSwKKyAgICAgICAgICAgICZrZXlfaW5mbyk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1rYV9zZW5kX3Nha19jb25maXJtKGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBTQUsgd2l0aCB0aGUgbmV3IFNBSyAqLworICAgICAgICAgICAgICAgIG1lbWNweShsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5uZXdfc2FrLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5zYWspKTsKKworICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0byB0aGUgT1BFUkFUSU9OQUwgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfT1BFUkFUSU9OQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSBlcnJvci4gKi8KKyAgICAgICAgX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9mYWlsdXJlKGxpbmtfcmVjLCByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiogVGhpcyBpcyB0aGUgT05VIEZTTSBKdW1wIFRhYmxlLCBpbmRleGVkIGJ5IFNUQVRFIGFuZCBFVkVOVC4gKi8KK3N0YXRpYyBmX2Rwb2Vfc2VjX21rYV9mc20gZHBvZV9zZWNfbWthX2ZzbVtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX19DT1VOVF1bRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9OVUxMXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9JTklUXSA9IF9kcG9lX3NlY19ta2FfZnNtX2luaXRpYWxpemUKKyAgICB9LAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFVF9FTkNSWVBUSU9OXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9PQU1dID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfb2FtLAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3J4X3RpbWVvdXQsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1BdID0gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcCwKKyAgICB9LAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NUQVJUX01LQV0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfRUFQT0xdID0gX2Rwb2Vfc2VjX21rYV9mc21fc3RhcnRfcnhfZWFwb2wsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfVFhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdGFydF90aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9TVE9QXSA9IF9kcG9lX3NlY19ta2FfZnNtX3N0b3AKKyAgICB9LAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfU0FLXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zYWtfcnhfZWFwb2wsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfVFhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zYWtfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdG9wCisgICAgfSwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9PUEVSQVRJT05BTF0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfRUFQT0xdID0gX2Rwb2Vfc2VjX21rYV9mc21faGFuZGxlX2tlZXBfYWxpdmUsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfVFhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2tlZXBfYWxpdmUsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1BdID0gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcAorICAgIH0sCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9ORVdfU0FLXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9uZXdfc2FrX3J4X2VhcG9sLAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3J4X3RpbWVvdXQsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1RYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fc2VuZF9rZWVwX2FsaXZlLAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9TVE9QXSA9IF9kcG9lX3NlY19ta2FfZnNtX3N0b3AKKyAgICB9Cit9OworCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fZXhlYyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSTTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlX2lzX3ZhbGlkKGV2dC0+dHlwZSkpCisgICAgeworICAgICAgICBkcG9lX3NlY19ta2FfZnNtX3N0YXRlIHByZV9zdGF0ZSA9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlOworCisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIk1LQTogcHJvY2Vzc2luZyBldmVudCAlcyBpbiBzdGF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rwb2Vfc2VjX21rYV9mc21fZXZlbnRfbmFtZShldnQtPnR5cGUpLCBfZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZV9uYW1lKHByZV9zdGF0ZSkpOworCisgICAgICAgIC8qIGNhbGwgdGhlIEZTTSAqLworICAgICAgICBpZiAoTlVMTCAhPSBkcG9lX3NlY19ta2FfZnNtW2xpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlXVtldnQtPnR5cGVdKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IGRwb2Vfc2VjX21rYV9mc21bbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGVdW2V2dC0+dHlwZV0obGlua19yZWMsIGV2dCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IF9kcG9lX3NlY19ta2FfZnNtX2Vycm9yKGxpbmtfcmVjLCBldnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZV9zdGF0ZSAhPSBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTUtBOiB0cmFuc2l0aW9uaW5nIGZyb20gJXMgdG8gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZV9uYW1lKHByZV9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZV9uYW1lKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3ZvaWQgZHBvZV9zZWNfbWthX2ZzbV9yeF9vYW0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCB1aW50OF90ICpmcmFtZSwgdWludDE2X3QgbGVuZ3RoKQoreworICAgIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgZXZudCA9IHt9OworCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogU2VuZCB0aGUgT0FNIFBEVSB0byB0aGUgc3RhdGUgbWFjaGluZS4gKi8KKyAgICBldm50LnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX09BTTsKKyAgICBldm50LmRhdGEucnhfZnJhbWUudmFsID0gZnJhbWU7CisgICAgZXZudC5kYXRhLnJ4X2ZyYW1lLmxlbiA9IGxlbmd0aDsKKworICAgIC8qIEV4ZWN1dGUgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKyAgICBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZudCk7Cit9CisKK3ZvaWQgZHBvZV9zZWNfbWthX2ZzbV9yeF9lYXBvbChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgKmZyYW1lLCB1aW50MTZfdCBsZW5ndGgpCit7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCBldm50ID0ge307CisKKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvKiBTZW5kIHRoZSBPQU0gUERVIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworICAgIGV2bnQudHlwZSA9IERQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfRUFQT0w7CisgICAgZXZudC5kYXRhLnJ4X2ZyYW1lLnZhbCA9IGZyYW1lOworICAgIGV2bnQuZGF0YS5yeF9mcmFtZS5sZW4gPSBsZW5ndGg7CisKKyAgICAvKiBFeGVjdXRlIHRoZSBzdGF0ZSBtYWNoaW5lICovCisgICAgX2Rwb2Vfc2VjX21rYV9mc21fZXhlYyhsaW5rX3JlYywgJmV2bnQpOworfQorCitiY21vc19lcnJubyBkcG9lX3NlY19ta2FfZnNtX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2ZW50ID0ge307CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIC8qIEluamVjdCBhbiBJTklUX0VWRU5UIGludG8gdGhlIEZTTS4gKi8KKyAgICBldmVudC50eXBlID0gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9JTklUOworCisgICAgcmV0dXJuIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMobGlua19yZWMsICZldmVudCk7Cit9CisKK2JjbW9zX2Jvb2wgZHBvZV9zZWNfbWthX2ZzbV9ydW5uaW5nKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGlmICgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyAhPSBOVUxMKSAmJgorICAgICAgICAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGUgPiBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX05VTEwpKQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gZHBvZV9zZWNfbWthX2ZzbV9kZXJlZ2lzdGVyKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCBldm50ID0ge307CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIC8qIFRoZSBkZXJlZ2lzdGVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWUgdGhlIExpbmsgZGVyZWdpc3RlcnMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBNS0EgRlNNIGlzIHJ1bm5pbmcgb3IKKyAgICAgICBub3QuIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpdCBpcyBub3QgcnVubmluZy4gKi8KKyAgICBpZiAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogSW5qZWN0IGEgc3RvcCBpbnRvIHRoZSBNS0EgRlNNLiAqLworICAgICAgICBldm50LnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1A7CisgICAgICAgIHJjID0gX2Rwb2Vfc2VjX21rYV9mc21fZXhlYyhsaW5rX3JlYywgJmV2bnQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKwordm9pZCBkcG9lX3NlY19ta2FfZnNtX2luaXQoZl9kcG9lX3NlY19ta2FfY2IgbWthX2NiKQoreworICAgIF9ta2FfZG9uZV9jYiA9IG1rYV9jYjsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19ta2FfZnNtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX21rYV9mc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzIwOWJiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19ta2FfZnNtLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfRFBPRV9TRUNfTUtBX0ZTTV9IXworI2RlZmluZSBfRFBPRV9TRUNfTUtBX0ZTTV9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfdXRpbC5oIgorI2luY2x1ZGUgIm1rYS5oIgorCisvKiAtLS0gVHlwZXMgLS0tICovCisKK3R5cGVkZWYgZW51bSBkcG9lX3NlY19ta2FfZnNtX3N0YXRlCit7CisgICAgRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9fSU5WQUxJRCAgICAgICAgID0gLTEsIC8qKjwgcGVybWl0cyBldmVudCB2YWxpZGF0aW9uICovCisKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX05VTEwgICAgICAgICAgICAgPSAgMCwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFVF9FTkNSWVBUSU9OICAgLAorICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfU1RBUlRfTUtBICAgICAgICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRU5EX1NBSyAgICAgICAgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX09QRVJBVElPTkFMICAgICAgLAorICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9ORVdfU0FLICAgICAsCisKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX19DT1VOVAorfSBkcG9lX3NlY19ta2FfZnNtX3N0YXRlOworCisvKiBEUG9FIFNlY3VyaXR5IE1LQSBpbmZvcm1hdGlvbiBzdG9yZWQgd2l0aCBlYWNoIGxpbmsuICovCit0eXBlZGVmIHN0cnVjdCBkcG9lX3NlY19ta2FfZnNtX2luZm8KK3sKKyAgICBiY21vc190aW1lciByeF90aW1lcjsgLyoqPCBUaW1lciBlbnRyeSBmb3IgTUtBIEZTTSAqLworICAgIGJjbW9zX3RpbWVyIHR4X3RpbWVyOyAvKio8IFRpbWVyIGVudHJ5IGZvciBNS0EgbWVzc2FnZXMgKi8KK30gZHBvZV9zZWNfbWthX2ZzbV9pbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG1rYV9saW5rX2luZm8gKm1rYV9pbmZvOyAvKio8IE1LQSBpbmZvcm1hdGlvbiAqLworICAgIGRwb2Vfc2VjX21rYV9mc21faW5mbyAqbWthX2ZzbV9pbmZvOyAvKio8IE1LQSBGU00gaW5mb3JtYXRpb24gKi8KKyAgICBkcG9lX3NlY19ta2FfZnNtX3N0YXRlIG1rYV9mc21fc3RhdGU7IC8qKjwgU3RhdGUgb2YgdGhlIERQb0UgU2VjdXJpdHkgTUtBIEZTTSAqLworfSBkcG9lX3NlY19ta2FfZnNtX2N0cmw7CisKK3N0cnVjdCBkcG9lX3NlY19saW5rX3JlYzsKKwordHlwZWRlZiB2b2lkICgqZl9kcG9lX3NlY19ta2FfY2IpKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyosIGJjbW9zX2Vycm5vIHN0YXR1cyk7CisKKy8qIC0tLSBGdW5jdGlvbiBwcm90b3R5cGVzIC0tLSAqLworCisvKiBTdGFydCBNS0Egb24gYSBsaW5rICovCitiY21vc19lcnJubyBkcG9lX3NlY19ta2FfZnNtX3N0YXJ0KHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKKy8qIEhhbmRsZSByZWNlcHRpb24gb2YgYW4gT0FNIGZyYW1lICovCit2b2lkIGRwb2Vfc2VjX21rYV9mc21fcnhfb2FtKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluaywgdWludDhfdCAqZnJhbWUsIHVpbnQxNl90IGxlbmd0aCk7CisKKy8qIEhhbmRsZSByZWNlcHRpb24gb2YgYW4gRUFQT0wgZnJhbWUgKi8KK3ZvaWQgZHBvZV9zZWNfbWthX2ZzbV9yeF9lYXBvbChzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIHVpbnQ4X3QgKmZyYW1lLCB1aW50MTZfdCBsZW5ndGgpOworCisvKiBJcyB0aGUgTUtBIEZTTSBydW5uaW5nIG9uIGEgbGluaz8gKi8KK2JjbW9zX2Jvb2wgZHBvZV9zZWNfbWthX2ZzbV9ydW5uaW5nKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKKy8qIEhhbmRsZSBsaW5rIGRlLXJlZ2lzdHJhdGlvbiAoc3RvcCB0aGUgTUtBIEZTTSkgKi8KK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX21rYV9mc21fZGVyZWdpc3RlcihzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmspOworCit2b2lkIGRwb2Vfc2VjX21rYV9mc21faW5pdChmX2Rwb2Vfc2VjX21rYV9jYiBta2FfY2IpOworCisjZW5kaWYgLyogX0RQT0VfU0VDX01LQV9GU01fSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfdXNlcl9jZmcuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfdXNlcl9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDZkM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191c2VyX2NmZy5oCkBAIC0wLDAgKzEsMjAwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9EUE9FX1NFQ19VU0VSX0NGR19IXworI2RlZmluZSBfRFBPRV9TRUNfVVNFUl9DRkdfSF8KKworI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisKK2V4dGVybiBkZXZfbG9nX2lkIGRwb2Vfc2VjX2xvZ19pZFtdOworCit0eXBlZGVmIHZvaWQqIGRwb2Vfc2VjX3NoYTFfaGFzaDsgLyogQSBkYXRhIHR5cGUgZm9yIGhvbGRpbmcgYW4gU0hBMSBoYXNoIGNvbnRleHQgKi8KK3R5cGVkZWYgdWludDhfdCBkcG9lX3NlY19zaGExX2RpZ2VzdFsyMF07IC8qIEEgZGF0YSB0eXBlIGZvciBob2xkaW5nIGFuIFNIQTEgaGFzaCAqLwordHlwZWRlZiB2b2lkKiBkcG9lX3NlY19tZDVfaGFzaDsgLyogQSBkYXRhIHR5cGUgZm9yIGhvbGRpbmcgYW4gTUQ1IGhhc2ggY29udGV4dCAqLwordHlwZWRlZiB1aW50OF90IGRwb2Vfc2VjX21kNV9kaWdlc3RbMTZdOyAvKiBBIGRhdGEgdHlwZSBmb3IgaG9sZGluZyBhbiBNRDUgaGFzaCAqLwordHlwZWRlZiB2b2lkKiBkcG9lX3NlY19yc2Ffa2V5OyAvKiBBIGRhdGEgdHlwZSBmb3IgaG9sZGluZyBhbiBSU0Ega2V5ICovCit0eXBlZGVmIHZvaWQqIGRwb2Vfc2VjX2Flc19rZXk7IC8qIEEgZGF0YSB0eXBlIGZvciBob2xkaW5nIGFuIEFFUyBrZXkgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX3NoYTFfaW5pdChkcG9lX3NlY19zaGExX2hhc2ggKnNoYTEpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGluaXRpYWxpemUvcmVzZXQgYW4gU0hBMSBoYXNoIGNvbnRleHRcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfc2hhMV91cGRhdGUoZHBvZV9zZWNfc2hhMV9oYXNoICpzaGExLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCB1cGRhdGUgYW4gU0hBMSBoYXNoIGNvbnRleHRcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfc2hhMV9maW5hbChkcG9lX3NlY19zaGExX2RpZ2VzdCBtZCwgZHBvZV9zZWNfc2hhMV9oYXNoICpzaGExKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5hbGl6ZSBhbiBTSEExIGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19tZDVfaW5pdChkcG9lX3NlY19tZDVfaGFzaCAqbWQ1KQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBpbml0aWFsaXplL3Jlc2V0IGFuIE1ENSBoYXNoIGNvbnRleHRcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfbWQ1X3VwZGF0ZShkcG9lX3NlY19tZDVfaGFzaCAqbWQ1LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCB1cGRhdGUgYW4gTUQ1IGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19tZDVfZmluYWwoZHBvZV9zZWNfbWQ1X2RpZ2VzdCBtZCwgZHBvZV9zZWNfbWQ1X2hhc2ggKm1kNSkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluYWxpemUgYW4gTUQ1IGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19wcmZfZXhwYW5kXzQzNDYoCisgICAgdWludDhfdCAqc2VjcmV0LAorICAgIHVpbnQzMl90IHNlY3JldF9sZW4sCisgICAgY29uc3QgdWludDhfdCAqbGFiZWwsCisgICAgdWludDMyX3QgbGFiZWxfbGVuLAorICAgIGNvbnN0IHVpbnQ4X3QgKnNlZWQsCisgICAgdWludDMyX3Qgc2VlZF9sZW4sCisgICAgdWludDhfdCAqb3V0cHV0LAorICAgIHVpbnQzMl90IG91dHB1dF9sZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gdGhlIHBzZXVkby1yYW5kb20gZnVuY3Rpb24gZm9yIGV4cGFuc2lvbiBvZiBzZWNyZXRzIGFzIGRlZmluZWQgaW4gUkZDIDQzNDYsIHNlY3Rpb24gNVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZHBvZV9zZWNfcnNhX2tleSAqZHBvZV9zZWNfcnNhX2dlbmVyYXRlX2tleShpbnQgYml0cykKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2VuZXJhdGUgYW4gUlNBIGtleVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19yc2Ffa2V5X2ZyZWUoZHBvZV9zZWNfcnNhX2tleSAqcnNhKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCByZWxlYXNlIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhbiBSU0Ega2V5IGJ5IGVpdGhlciBkcG9lX3NlY19yc2FfZ2VuZXJhdGVfa2V5IG9yIGRwb2Vfc2VjX3g1MDlfcHViX2tleV9nZXRcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgZHBvZV9zZWNfcnNhX3B1YmxpY19nZXQoZHBvZV9zZWNfcnNhX2tleSAqcnNhLCB1aW50OF90ICpyc2FfbW9kdWx1cywgdWludDhfdCAqcnNhX2V4cCkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0cmlldmUgdGhlIHB1YmxpYyBtb2R1bHVzIGFuZCBleHBvbmVudCBvZiBhbiBSU0Ega2V5XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHBvZV9zZWNfcnNhX3NpemUoZHBvZV9zZWNfcnNhX2tleSAqcnNhKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNpemUgb2YgYW4gUlNBIGtleSBpbiBieXRlc1xuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRwb2Vfc2VjX3JzYV9wcml2YXRlX2RlY3J5cHQoCisgICAgaW50IGZsZW4sCisgICAgY29uc3QgdWludDhfdCAqZnJvbSwKKyAgICB1aW50OF90ICp0bywKKyAgICBkcG9lX3NlY19yc2Ffa2V5ICpyc2EpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gUlNBIGRlY3J5cHRpb24gdXNpbmcgYSBwcml2YXRlIGtleVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRwb2Vfc2VjX3JzYV9wdWJsaWNfZGVjcnlwdCgKKyAgICBpbnQgZmxlbiwKKyAgICBjb25zdCB1aW50OF90ICpmcm9tLAorICAgIHVpbnQ4X3QgKnRvLAorICAgIGRwb2Vfc2VjX3JzYV9rZXkgKnJzYSkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSBSU0EgZGVjcnlwdGlvbiB1c2luZyBhIHB1YmxpYyBrZXkgKGFsc28ga25vd24gYXMgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbilcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGRwb2Vfc2VjX3JzYV9rZXkgKmRwb2Vfc2VjX3g1MDlfcHViX2tleV9nZXQoY29uc3QgdWludDhfdCAqY2VydCwgdWludDMyX3QgY2VydF9sZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHJpZXZlIGFuIFJTQSBwdWJsaWMga2V5IGZyb20gYW4gWC41MDkgY2V0aWZpY2F0ZVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19hZXNfc2V0X2VuY3J5cHRfa2V5KGNvbnN0IHVpbnQ4X3QgKnVzZXJfa2V5LCBjb25zdCBpbnQgYml0cywgZHBvZV9zZWNfYWVzX2tleSAqa2V5KQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBpbml0aWFsaXplIHRoZSBBRVMga2V5IHdpdGggdGhlIHByb3ZpZGVkIGRhdGFcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfYWVzX3dyYXBfa2V5KAorICAgIGRwb2Vfc2VjX2Flc19rZXkgKmtleSwKKyAgICB1aW50OF90ICpvdXQsCisgICAgY29uc3QgdWludDhfdCAqaW4sCisgICAgdWludDMyX3QgbGVuKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBwZXJmb3JtIGFuIEFFUyBrZXkgd3JhcCBvbiBpblxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19hZXNfY21hYyh1aW50OF90ICprZXksIHVpbnQ4X3QgKm1zZywgdWludDMyX3QgbGVuLCB1aW50OF90ICpjb2RlKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBwZXJmb3JtIEFFUyBDTUFDXG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX2Flc19jbWFjX2tkZigKKyAgICB1aW50OF90ICprZXksCisgICAgY29uc3QgY2hhciAqbGFiZWwsCisgICAgdWludDhfdCAqY3R4LAorICAgIHVpbnQzMl90IGN0eF9sZW4sCisgICAgdWludDhfdCAqb3V0X2J1ZikKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSB0aGUgQUVTIENNQUMga2V5IGRlcml2YXRpb24gZnVuY3Rpb25cbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGRwb2Vfc2VjX3NlbmRfZWFwb2woCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSAqbGlua19rZXksCisgICAgdWludDhfdCAqZWFwb2wsCisgICAgdWludDE2X3QgbGVuZ3RoKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCB0cmFuc21pdCBhbiBFQVBPTCBmcmFtZSB0byB0aGUgc3BlY2lmaWVkIGxpbmtcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGRwb2Vfc2VjX3JuZ19zZWVkKHZvaWQpCit7CisgICAgQkNNX0xPRyhJTkZPLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgc2VlZCBhIGNyeXB0b2dyYXBoaWNhbGx5IHZhbGlkIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuIik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19nZW5lcmF0ZV9uX2J5dGVfcmFuZG9tX251bWJlcih1aW50OF90ICpvdXRwdXQsIGludCBsZW5ndGgpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGdlbmVyYXRlIGEgcHNldWRvLXJhbmRvbSBudW1iZXIgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGhcbiIpOworICAgIEJVRygpOworfQorCisjZW5kaWYgLyogX0RQT0VfU0VDX1VTRVJfQ0ZHX0hfICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfdXRpbC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzMDQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfdXRpbC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImRwb2Vfc2VjX3V0aWwuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisKK2Rldl9sb2dfaWQgZHBvZV9zZWNfbG9nX2lkW0JDTVRSX01BWF9PTFRTXTsKKworYmNtb3NfYm9vbCBkcG9lX3NlY19lYXBvbF91bnBhY2soYmNtb2x0X2J1ZiAqYnVmLCBlYXBvbF9tc2dfaGRyICplYXBvbCkKK3sKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJmVhcG9sLT5kYSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJmVhcG9sLT5zYSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZlYXBvbC0+ZXRoZXJfdHlwZSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJmVhcG9sLT5lYXBvbF92ZXJzaW9uKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmZWFwb2wtPmVhcG9sX3BhY2tldF90eXBlKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTE2X2JlKGJ1ZiwgJmVhcG9sLT5lYXBvbF9sZW5ndGgpOworfQorCitiY21vc19lcnJubyBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fa2V5X3NldCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5ICpsaW5rX2tleSwKKyAgICBiY21vc19ib29sIHVwLCAvKiBUT0RPOiBjcmVhdGUgZXhwbGljaXQgdXAvZG93biB0eXBlIGZvciBjbGFyaXR5ICovCisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIG1vZGUsCisgICAgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSBrZXlfY2hvaWNlLAorICAgIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqa2V5X2luZm8pCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywgKmxpbmtfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZSwgJmNmZy5oZHIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CisKKyAgICBpZiAodXApCisgICAgeworICAgICAgICBjZmcuZGF0YS5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fbW9kZSA9IG1vZGU7CisgICAgICAgIGNmZy5kYXRhLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9rZXlfY2hvaWNlID0ga2V5X2Nob2ljZTsKKyAgICAgICAgY2ZnLmRhdGEuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24gPSAqa2V5X2luZm87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNmZy5kYXRhLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX21vZGUgPSBtb2RlOworICAgICAgICBjZmcuZGF0YS5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9rZXlfY2hvaWNlID0ga2V5X2Nob2ljZTsKKyAgICAgICAgY2ZnLmRhdGEuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiA9ICprZXlfaW5mbzsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoZGV2aWNlLCAmY2ZnLmhkcik7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfdXRpbC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyZmRkYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfdXRpbC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0RQT0VfU0VDX1VUSUxfSF8KKyNkZWZpbmUgX0RQT0VfU0VDX1VUSUxfSF8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X2J1Zi5oIgorI2luY2x1ZGUgImJjbW9sdF91dGlscy5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX3VzZXJfY2ZnLmgiCisKKy8qIHRoZSBFQVBPTCBFdGhlcm5ldCB0eXBlICovCisjZGVmaW5lIEVUSEVSVFlQRV9FQVBPTCAweDg4OGUKKworI2RlZmluZSBFQVBPTF9QUk9UT0NPTF9WRVJTSU9OX0RQT0UgMworCit0eXBlZGVmIGVudW0KK3sKKyAgICBFQVBPTF9UWVBFX1BBQ0tFVCwKKyAgICBFQVBPTF9UWVBFX1NUQVJULAorICAgIEVBUE9MX1RZUEVfTE9HX09GRiwKKyAgICBFQVBPTF9UWVBFX0tFWSwKKyAgICBFQVBPTF9UWVBFX0FTRl9BTEVSVCwKKyAgICBFQVBPTF9UWVBFX01LQQorfSBlYXBvbF90eXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX21hY19hZGRyZXNzIGRhOworICAgIGJjbW9zX21hY19hZGRyZXNzIHNhOworICAgIHVpbnQxNl90IGV0aGVyX3R5cGU7CisgICAgdWludDhfdCBlYXBvbF92ZXJzaW9uOworICAgIHVpbnQ4X3QgZWFwb2xfcGFja2V0X3R5cGU7CisgICAgdWludDE2X3QgZWFwb2xfbGVuZ3RoOworfSBlYXBvbF9tc2dfaGRyOworCisjZGVmaW5lIEVBUE9MX01TR19IRFJfU0laRSAxOAorCisjZGVmaW5lIExJTktfS0VZX0ZNVF9TVFIgIlBPTiAldSwgIkJDTU9TX01BQ0FERFJfRk1UX1NUUgorI2RlZmluZSBMSU5LX0tFWV9EQVRBKGxyKSAobHIpLT5rZXkuZXBvbl9uaSwgQkNNT1NfTUFDQUREUl9QQVJBTVMoJihsciktPmtleS5tYWNfYWRkcmVzcykKKworI2RlZmluZSBEUE9FX1NFQ19MSU5LX0xPRyhsZXZlbCwgbHIsIGZtdCwgYXJncy4uLikgXAorICAgIEJDTV9MT0cobGV2ZWwsIGRwb2Vfc2VjX2xvZ19pZFsobHIpLT5kZXZpY2VdLCBMSU5LX0tFWV9GTVRfU1RSIjogImZtdCwgTElOS19LRVlfREFUQShsciksICMjYXJncykKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IERQT0VfU0VDX09BTV9USU1FT1VUID0gMiAqIDEwMDAgKiAxMDAwOyAvKiAyIHNlY29uZHMgKi8KKworYmNtb3NfYm9vbCBkcG9lX3NlY19lYXBvbF91bnBhY2soYmNtb2x0X2J1ZiAqYnVmLCBlYXBvbF9tc2dfaGRyICplYXBvbCk7CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgKmxpbmtfa2V5LAorICAgIGJjbW9zX2Jvb2wgdXAsCisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIG1vZGUsCisgICAgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSBrZXlfY2hvaWNlLAorICAgIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqa2V5X2luZm8pOworCisjZW5kaWYgLyogX0RQT0VfU0VDX1VUSUxfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvbWthLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5ZWIyMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvbWthLmMKQEAgLTAsMCArMSwxNDM0IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKy8qKiBAZmlsZSBta2EuYworICogIEBicmllZiBQdWJsaWNseSBhY2Nlc3NpYmxlIEFQSXMgcHJvdmlkZWQgdG8gcHJvY2VzcyBNS0EgcmVxdWVzdC9yZXNwb25zZXMuCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlIHB1YmxpYy9wcml2YXRlIEFQSXMgdXNlZCB0byBwcm9jZXNzIE1LQSBmcmFtZXMuCisgKgorICogTUtBIEV4Y2hhbmdlIFNlcXVlbmNlIDoKKyAqCisgKiAxLiAgSWYgYmlkaXJlY3Rpb25hbCBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIHRoZSBPTFQgd2lsbCBnZW5lcmF0ZSBhbiBNS1BEVQorICogICAgIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQgYW5kIGVtcHR5IGxpdmUgYW5kIHBvdGVudGlhbCBwZWVyCisgKiAgICAgbGlzdHMuCisgKiAyLiAgV2hlbiB0aGUgT05VIHJlY2VpdmVzIHRoaXMsIGl0IHdpbGwgYWRkIHRoZSBPTFQgdG8gaXRzIHBvdGVudGlhbCBwZWVycworICogICAgIGxpc3QuCisgKiAzLiAgSGF2aW5nIGRpc2NvdmVyZWQgYSBuZXcgcG90ZW50aWFsIHBlZXIsIHRoZSBPTlUgd2lsbCB0cmFuc21pdCBhbiBNS1BEVQorICogICAgIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQsIGFuZCBlbXB0eSBsaXZlIHBlZXJzIGxpc3QsIGFuZCBhCisgKiAgICAgcG90ZW50aWFsIHBlZXIgbGlzdCBjb250YWluaW5nIHRoZSBPTFQuCisgKiA0LiAgV2hlbiB0aGUgT0xUIHJlY2VpdmVzIHRoaXMsIGl0IHdpbGwgYWRkIHRoZSBPTlUgdG8gaXRzIGxpdmUgcGVlcnMgbGlzdC4KKyAqIDUuICBIYXZpbmcgYWRkZWQgYSBuZXcgbGl2ZSBwZWVyLCB0aGUgT0xUIHdpbGwgZ2VuZXJhdGUgYSBuZXcgU0FLIGFuZCBpbnN0YWxsCisgKiAgICAgaXQgZm9yIHJlY2VpdmUgKHVzaW5nIHRoZSBPTlVzIFNDSSkuCisgKiA2LiAgVGhlIE9MVCB0aGVuIHRyYW5zbWl0cyBhbiBNS1BEVSBjb250YWluaW5nIHRoZSBiYXNpYyBwYXJhbWV0ZXIgc2V0LCBhCisgKiAgICAgbGl2ZSBwZWVyIGxpc3QgY29udGFpbmluZyB0aGUgT05VLCBhbiBlbXB0eSBwb3RlbnRpYWwgcGVlciBsaXN0LCBhCisgKiAgICAgZGlzdHJpYnV0ZWQgU0FLLCBhbmQgYSBTQUsgdXNhZ2UgcGFyYW1ldGVyIHNldCBpbmRpY2F0aW5nIHRoYXQgdGhlIG5ldworICogICAgIFNBSyBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHJlY2VpdmUuCisgKiA3LiAgV2hlbiB0aGUgT05VIHJlY2VpdmVzIHRoaXMsIGl0IHdpbGw6CisgKiAgICAgYS4gQWRkIHRoZSBPTFQgdG8gaXRzIGxpdmUgcGVlcnMgbGlzdAorICogICAgIGIuIEluc3RhbGwgdGhlIG5ldyBTQUsgZm9yIHJlY2VpdmUgKHVzaW5nIHRoZSBPTFRzIFNDSSkKKyAqICAgICBjLiBCZWNhdXNlIHRoZSBPTFQgcmVwb3J0ZWQgdGhlIFNBSyBpbiB1c2UgZm9yIHJlY2VpdmUsIHRoZSBPTlUgd2lsbAorICogICAgICAgIGluc3RhbGwgdGhlIFNBSyBmb3IgdHJhbnNtaXQgKHVzaW5nIHRoZSBPTlVzIFNDSSkuCisgKiA4LiAgVGhlIE9OVSB3aWxsIHRoZW4gdHJhbnNtaXQgYW4gTUtQRFUgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCwKKyAqICAgICBhIGxpdmUgcGVlcnMgbGlzdCBjb250YWluaW5nIHRoZSBPTFQsIGFuIGVtcHR5IHBvdGVudGlhbCBwZWVyIGxpc3QsCisgKiAgICAgYW5kIGEgU0FLIHVzYWdlIHBhcmFtZXRlciBzZXQgaW5kaWNhdGluZyB0aGF0IHRoZSBTQUsgaGFzIGJlZW4gaW5zdGFsbGVkCisgKiAgICAgZm9yIHJlY2VpdmUgYW5kIHRyYW5zbWl0LgorICogOS4gIFdoZW4gdGhlIE9MVCByZWNlaXZlcyB0aGlzLCBpdCB3aWxsIHNlZSB0aGF0IHRoZSBPTlUgaGFzIGluc3RhbGxlZCB0aGUKKyAqICAgICBTQUsgZm9yIHJlY2VpdmUgYW5kIHdpbGwgaW5zdGFsbCB0aGUgU0FLIGZvciB0cmFuc21pdAorICogICAgICh1c2luZyB0aGUgT0xUcyBTQ0kpLgorICogMTAuIFRoZSBPTFQgd2lsbCB0aGVuIHRyYW5zbWl0IGFuIE1LUERVIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQsCisgKiAgICAgYSBsaXZlIHBlZXIgbGlzdCBjb250YWluaW5nIHRoZSBPTlUsIGFuIGVtcHR5IHBvdGVudGlhbCBwZWVyIGxpc3QgYW5kCisgKiAgICAgYSBTQUsgdXNhZ2UgcGFyYW1ldGVyIHNldCBpbmRpY2F0aW5nIHRoZSBTQUsgaGFzIGJlZW4gaW5zdGFsbGVkIGZvcgorICogICAgIHJlY2VpdmUgYW5kIHRyYW5zbWl0LiAgKEmhrm0gbm90IHN1cmUgaWYgdGhpcyBzdGVwIGlzIG5lY2Vzc2FyeSkKKyAqIDExLiBUaGlzIG1lc3NhZ2Ugd2lsbCBwcm9kdWNlIG5vIHN0YXRlIGNoYW5nZSBhdCB0aGUgT05VLCBzbyBpdCB3aWxsIG5vdAorICogICAgIHJlc3BvbmQgaW1tZWRpYXRlbHkuIChib3RoIHRoZSBPTlUgYW5kIE9MVCB3aWxsIG5lZWQgdG8gc3RhcnQgYSAyIHNlY29uZAorICogICAgIHRpbWVyIGV2ZXJ5IHRpbWUgYW4gTUtQRFUgaXMgdHJhbnNtaXR0ZWQgPyBpZiB0aGV5IGhhdmUgbm90IHRyYW5zbWl0dGVkCisgKiAgICAgYW4gTUtQRFUgZHVlIHRvIGEgc3RhdGUgY2hhbmdlIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMsIHRoZXkgd2lsbAorICogICAgIHRyYW5zbWl0IGFuIE1LUERVIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQgYW5kIGxpdmUgYW5kCisgKiAgICAgcG90ZW50aWFsIHBlZXIgbGlzdHMuICBJZiBlaXRoZXIgc2lkZSBkb2VzIG5vdCByZWNlaXZlIGFuIE1LUERVIGZyb20KKyAqICAgICB0aGUgb3RoZXIgZm9yIDYgc2Vjb25kcyB0aGV5IG11c3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGVpciBwZWVyIGxpc3RzLikKKyAqIDEyLiBXaGVuIHRoZSBPTFQgZGV0ZXJtaW5lcyB0aGF0IGEgbmV3IFNBSyBpcyBuZWVkZWQgdGhpcyBwcm90b2NvbCB3aWxsCisgKiAgICAgcmVwZWF0IHN0ZXBzIDUtMTEuIChtb2RpZmljYXRpb25zIHRvIHRoZSBwZWVyIGxpc3RzLCBzdWNoIGFzIDdhLCBzaG91bGQKKyAqICAgICBub3QgYmUgcmVxdWlyZWQpCisgKgorICogIEBkZWZncm91cCBta2EgTUtBCisgKiAgQGluZ3JvdXAgY21DdHJsCisgKgorICovCisKKyNpbmNsdWRlICJta2EuaCIKKyNpbmNsdWRlICJkcG9lX3NlY191dGlsLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfZnNtLmgiCisKKy8qIFRoZSBkZXN0aW5hdGlvbiBtdWx0aWNhc3QgTUFDIGFkZHJlc3MgZm9yIE1LQSBwYWNrZXRzLiAqLworc3RhdGljIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzIG1rYV9kc3RfbWFjX2FkZHIgPSB7IC51OCA9IHsgMHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMyB9IH07CisKKyNpZiAwCitzdGF0aWMgY29uc3QgY2hhciAqbWthX3N0YXRlX25hbWVzW01LQV9TVEFURV9fQ09VTlRdID0KK3sKKyAgICAiSW5pdGlhbCIsCisgICAgIldhaXRpbmdJbml0aWFsUGVlclJlc3AiLAorICAgICJTYWtTZW50IiwKKyAgICAiTWthRG9uZSIKK307CisjZW5kaWYKKworI2RlZmluZSBNS0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNS0FfU0VSVkVSX1BSSU9SSVRZICAgICAgICAgMHgzMAorI2RlZmluZSBNS0FfSU5JVF9SRVRSWV9DTlQgICAgICAgICAgMworI2RlZmluZSBNS0FfQkFTSUNfUEFSQU1fU0VUX0xFTiAgICAgNDQgLyogNDggLSBoZWFkZXIgbGVuICg0IGJ5dGUpICovCisjZGVmaW5lIE1LQV9CQVNJQ19QQVJBTV9TRVRfT1BUICAgICAweDYwIC8qIEtleVNlcnZlcjowLCBNQUNzZWNEZXNpcmVkOjEsIE1BQ3NlYyBDYXBhYmlsaXR5OjIgJiBoaWdoIDQgYml0cyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgc2V0IGJvZHkgbGVuZ3RoICgwKSAqLworCisjZGVmaW5lIE1LQV9BTEdPUklUSE1fQUdJTElUWSAgICAgICAweDAwODBjMjAxCisjZGVmaW5lIE1LQV9NTl9MRU4gICAgICAgICAgICAgICAgICA0IC8qIE1lc3NhZ2UgTnVtYmVyICovCisjZGVmaW5lIE1LQV9LTl9MRU4gICAgICAgICAgICAgICAgICA0IC8qIEtleSBOdW1iZXIgKi8KKyNkZWZpbmUgTUtBX1BEVV9NQVhfRlJBTUVfTEVOICAgICAgIDMwMAorI2RlZmluZSBNS0FfSEVMTE9fVElNRSAgICAgICAgICAgICAgMjAwMCAvKiBNcywgMiBzZWNvbmRzICovCisjZGVmaW5lIE1LQV9NQVhfSEVMTE9fUkVUUklFUyAgICAgICAzIC8qIE1heCBIZWxsbyByZXRyaWVzICovCisjZGVmaW5lIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gICAgICA3NiAvKiBiYXNpYyBwYXJhbSBzZXQoNDgpICsgbnVsbCBsaXZlIHBlZXIgbGlzdCAoNCkgKyBudWxsIHBvdGVudGlhbCBwZWVyIGxpc3QgKDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEljdiBJbmRpY2F0b3IgKDQpICsgSUNWKDE2KSAqLworI2RlZmluZSBNS0FfT05FX1BFRVJfTEVOICAgICAgICAgICAgMTYgLyogb25lIGxpdmUgcGVlciBsZW4gKi8KKyNkZWZpbmUgTUtBX0RJU1RSSUJVVEVEX1NBS19MRU4gICAgIDMyCisjZGVmaW5lIE1LQV9JQ1ZfTEVOICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBNS0FfUERVX01JTl9MRU5HVEggICAgICAgICAgMzIKKyNkZWZpbmUgTUtBX0tFWV9XUkFQUEVEX1NBS19MRU4gICAgIDI0CisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX0JPRFlfTEVOICA0MAorI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9MRU0gICAgICAgNDQKKyNkZWZpbmUgTUtBX01BWF9BQ0NFUFRBQkxFX1BOICAgICAgIDB4QzAwMDAwMDAKKworI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9BTl9TSElGVCAgICAgICAgICA2CisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX0xLX1RYX1NISUZUICAgICAgIDUKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fTEtfUlhfU0hJRlQgICAgICAgNAorI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX0FOX01BU0sgICAzCisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfQU5fU0ZUICAgIDIKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fT0xEX0tFWV9UWF9SWCAgICAgMworI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9TRUNPTkRfT1BUX0JZVEUgICAweEMwCisKKyNkZWZpbmUgTUtBX0tFWV9MRU4gICAgICAgICAgICAgICAgIDE2IC8qIGNvbW1vbiBrZXkgc2l6ZSAqLworCisjZGVmaW5lIE1LQV9LRUtfTEFCRUxfTEVOICAgICAgICAgICAxMiAvKiBsYWJlbCBsZW5ndGggKi8KKyNkZWZpbmUgTUtBX0tFS19DT05URVhUX0xFTiAgICAgICAgIDE2CisKKyNkZWZpbmUgTUtBX1NBS19LRVlfV1JBUFBFRF9MRU4gICAgIDI0CisKKyNkZWZpbmUgTUtBX0lDS19MQUJFTF9MRU4gICAgICAgICAgIDEyIC8qIGxhYmVsIGxlbmd0aCAqLworI2RlZmluZSBNS0FfSUNLX0NPTlRFWFRfTEVOICAgICAgICAgMTYKKworI2RlZmluZSBNS0FfQ0tOX0xBQkVMX0xFTiAgICAgICAgICAgMTYgLyogbGFiZWwgbGVuZ3RoICovCisjZGVmaW5lIE1LQV9DS05fQ09OVEVYVF9MRU4gICAgICAgICAoU0laRV9PRl9FQVBfU0VTU0lPTl9JRCArIChCQ01PU19FVEhfQUxFTiAqIDIpKSAvKiA3NyAqLworCisjZGVmaW5lIE1LQV9DQUtfTEFCRUxfTEVOICAgICAgICAgICAxNiAvKiBsYWJlbCBsZW5ndGggKi8KKyNkZWZpbmUgTUtBX0NBS19DT05URVhUX0xFTiAgICAgICAgIDEyIC8qIGNvbnRleHQgbGVuZ3RoICovCisKKy8qIE1LUERVIFBhcmFtZXRlciBzZXQgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUICAgICAgPSAxLAorICAgIE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUID0gMiwKKyAgICBNS1BEVV9QQVJBTV9TRVRfTUFDU0VDX1NBS19VU0UgICAgICA9IDMsCisgICAgTUtQRFVfUEFSQU1fU0VUX0RJU1RfU0FLICAgICAgICAgICAgPSA0LAorICAgIE1LUERVX1BBUkFNX1NFVF9ESVNUX0NBSyAgICAgICAgICAgID0gNSwKKyAgICBNS1BEVV9QQVJBTV9TRVRfS01EICAgICAgICAgICAgICAgICA9IDYsCisgICAgTUtQRFVfUEFSQU1fU0VUX0FOTk9VTkNFTUVOVCAgICAgICAgPSA3LAorICAgIE1LUERVX1BBUkFNX1NFVF9JQ1ZfSU5ESUNBVE9SICAgICAgID0gMjU1LAorfSBta3BkdV9wYXJhbV9zZXRfdHlwZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgTUtBX01TR19USU1FT1VULAorICAgIE1LQV9NU0dfREFUQV9JTkQKK30gbWthX21zZ190eXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG1rYV9tc2dfdHlwZSB0eXBlOworICAgIGVhcG9sX21zZ19oZHIgKm1zZzsKKyAgICBiY21vbHRfYnVmICpidWY7Cit9IG1rYV9ldmVudDsKKworLyogQ2FsY3VsYXRlIEtleSBFbmNyeXB0aW9uIEtleSAqLworc3RhdGljIHZvaWQgX21rYV9jYWxjX2tlayh1aW50OF90ICprZWssIHVpbnQ4X3QgKmNhaywgdWludDhfdCAqY2tuKQoreworICAgIGNoYXIga2VrX2xhYmVsW01LQV9LRUtfTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgS0VLIjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGtlayA9PSBOVUxMKTsKKyAgICBCVUdfT04oY2FrID09IE5VTEwpOworICAgIEJVR19PTihja24gPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19hZXNfY21hY19rZGYoY2FrLCBrZWtfbGFiZWwsIGNrbiwgTUtBX0tFS19DT05URVhUX0xFTiwga2VrKTsKK30KKworLyogQ2FsY3VsYXRlIEludGVncml0eSBDaGVjayB2YWx1ZSBLZXkgKi8KK3N0YXRpYyB2b2lkIF9ta2FfY2FsY19pY2sodWludDhfdCAqaWNrLCB1aW50OF90ICpjYWssIHVpbnQ4X3QgKmNrbikKK3sKKyAgICBjaGFyIGlja19sYWJlbFtNS0FfSUNLX0xBQkVMX0xFTiArIDFdID0gIklFRUU4MDIxIElDSyI7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihpY2sgPT0gTlVMTCk7CisgICAgQlVHX09OKGNhayA9PSBOVUxMKTsKKyAgICBCVUdfT04oY2tuID09IE5VTEwpOworCisgICAgZHBvZV9zZWNfYWVzX2NtYWNfa2RmKGNhaywgaWNrX2xhYmVsLCBja24sIE1LQV9JQ0tfQ09OVEVYVF9MRU4sIGljayk7Cit9CisKKy8qIGNhbGN1bGF0ZSBJbnRlZ3JpdHkgQ2hlY2sgVmFsdWUgKi8KK3N0YXRpYyB2b2lkIF9ta2FfY2FsY19pY3YodWludDhfdCAqaWN2LCB1aW50OF90ICppY2ssIHVpbnQ4X3QgKm1zZHUsIHVpbnQxNl90IG1zZHVfbGVuKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGljdiA9PSBOVUxMKTsKKyAgICBCVUdfT04oaWNrID09IE5VTEwpOworICAgIEJVR19PTihtc2R1ID09IE5VTEwpOworCisgICAgZHBvZV9zZWNfYWVzX2NtYWMoaWNrLCBtc2R1LCBtc2R1X2xlbiwgaWN2KTsKK30KKworLyogQ2FsY3VsYXRlIFNlY3VyZSBDb25uZWN0aXZpdHkgQXNzb2NpYXRpb24gS2V5IE5hbWUgKi8KK3N0YXRpYyB2b2lkIF9ta2FfY2FsY19ja24oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCB1aW50OF90IGVhcF9zZXNzX2lkX2xlbikKK3sKKyAgICBjaGFyIGNrbl9sYWJlbFtNS0FfQ0tOX0xBQkVMX0xFTiArIDFdID0gIklFRUU4MDIxIEVBUCBDS04iOworICAgIHVpbnQ4X3QgY2tuX2NvbnRleHRbTUtBX0NLTl9DT05URVhUX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbiA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1hc3Rlcl9zZXNzaW9uX2tleSA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNlc3Npb25faWQgPT0gTlVMTCk7CisKKyAgICBtZW1jcHkoJmNrbl9jb250ZXh0WzBdLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2Vzc2lvbl9pZCwgZWFwX3Nlc3NfaWRfbGVuKTsKKyAgICBtZW1jcHkoJmNrbl9jb250ZXh0W2VhcF9zZXNzX2lkX2xlbl0sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGVzc2VyX21hYy51OCwgQkNNT1NfRVRIX0FMRU4pOworICAgIG1lbWNweSgmY2tuX2NvbnRleHRbZWFwX3Nlc3NfaWRfbGVuICsgQkNNT1NfRVRIX0FMRU5dLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmdyZWF0ZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgZHBvZV9zZWNfYWVzX2NtYWNfa2RmKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tYXN0ZXJfc2Vzc2lvbl9rZXksIGNrbl9sYWJlbCwgY2tuX2NvbnRleHQsIE1LQV9DS05fQ09OVEVYVF9MRU4sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuKTsKK30KKworLyogQ2FsY3VsYXRlIFNlY3VyZSBDb25uZWN0aXZpdHkgQXNzb2NpYXRpb24gS2V5ICovCitzdGF0aWMgdm9pZCBfbWthX2NhbGNfY2FrKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBjaGFyIGNha19sYWJlbFtNS0FfQ0FLX0xBQkVMX0xFTiArIDFdID0gIklFRUU4MDIxIEVBUCBDQUsiOworICAgIHVpbnQ4X3QgY2FrX2NvbnRleHRbTUtBX0NBS19DT05URVhUX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNhayA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1hc3Rlcl9zZXNzaW9uX2tleSA9PSBOVUxMKTsKKworICAgIG1lbWNweSgmY2FrX2NvbnRleHRbMF0sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGVzc2VyX21hYy51OCwgQkNNT1NfRVRIX0FMRU4pOworICAgIG1lbWNweSgmY2FrX2NvbnRleHRbQkNNT1NfRVRIX0FMRU5dLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmdyZWF0ZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgZHBvZV9zZWNfYWVzX2NtYWNfa2RmKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tYXN0ZXJfc2Vzc2lvbl9rZXksIGNha19sYWJlbCwgY2FrX2NvbnRleHQsIE1LQV9DQUtfQ09OVEVYVF9MRU4sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrKTsKK30KKworLyogR2V0IE9MVCBwb3J0IE1hYyBhbmQgbGluayBNYWMgJiBjb21wYXJlLiBUaGlzIGlzIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgQ0FLICovCitzdGF0aWMgdm9pZCBfbWthX2dldF9vbHRfYW5kX2xpbmtfbWFjKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgLyogY29tcGFyZSBPTFQgYW5kIExpbmsgTUFDIGFkZHJlc3NlcyAqLworICAgIGlmIChtZW1jbXAobGlua19yZWMtPm5pX21hYy51OCwgbGlua19yZWMtPmtleS5tYWNfYWRkcmVzcy51OCwgc2l6ZW9mKEJDTU9TX0VUSF9BTEVOKSkgPj0gMCkKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGVzc2VyX21hYyA9IGxpbmtfcmVjLT5rZXkubWFjX2FkZHJlc3M7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMgPSBsaW5rX3JlYy0+bmlfbWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxlc3Nlcl9tYWMgPSBsaW5rX3JlYy0+bmlfbWFjOworICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmdyZWF0ZXJfbWFjID0gbGlua19yZWMtPmtleS5tYWNfYWRkcmVzczsKKyAgICB9Cit9CisKKy8qIEluaXRpYWxpemUgbGluayBNS0EgaW5mbyBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB2b2lkIF9ta2FfaW5pdF9saW5rX2luZm8oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBpbml0aWFsaXplIGFsbCBsb2NhbCB2YWx1ZXMgKi8KKyAgICBtZW1zZXQobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAwLCBzaXplb2YoKmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbykpOworICAgIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b2x0X21lbWJlcl9pZCwgTUtBX01JX0xFTik7CisgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jdXJyX21zZ19udW0gPSAxOyAvKiBzdGFydCBmcm9tIDEgKi8KKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgPSAxOyAvKiBzdGFydCBmcm9tIDEgKi8KKyAgICBfbWthX2dldF9vbHRfYW5kX2xpbmtfbWFjKGxpbmtfcmVjKTsKKyAgICBfbWthX2NhbGNfY2FrKGxpbmtfcmVjKTsKKyAgICBfbWthX2NhbGNfY2tuKGxpbmtfcmVjLCBTSVpFX09GX0VBUF9TRVNTSU9OX0lEKTsKKyAgICBfbWthX2NhbGNfaWNrKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+aWNrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNhaywgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ja24pOworICAgIF9ta2FfY2FsY19rZWsobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbik7Cit9CisKK3N0YXRpYyB2b2lkIF9ta2FfY2xlYXJfbGlua19pbmZvKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBtZW1zZXQobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAwLCBzaXplb2YoKmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbykpOworfQorCisvKiBCdWlsZCBFQVBPTCBoZWFkZXIgZm9yIE1LUERVICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKm91dF9idWYsIHVpbnQxNl90IGxlbmd0aCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04ob3V0X2J1ZiA9PSBOVUxMKTsKKworICAgIHJldHVybgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKG91dF9idWYsIG1rYV9kc3RfbWFjX2FkZHIpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3Mob3V0X2J1ZiwgbGlua19yZWMtPm5pX21hYykgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUob3V0X2J1ZiwgRVRIRVJUWVBFX0VBUE9MKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIEVBUE9MX1BST1RPQ09MX1ZFUlNJT05fRFBPRSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBFQVBPTF9UWVBFX01LQSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUob3V0X2J1ZiwgbGVuZ3RoKTsKK30KKworLyogQnVpbGQgQmFzaWMgcGFyYW1ldGVyIHNldC4gVGhpcyBwYXJhbWV0ZXIgc2V0IGlzIHJlcXVpcmVkIGZvciBldmVyeSBNS1BEVSAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqb3V0X2J1ZikKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04ob3V0X2J1ZiA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgcmV0dXJuCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX1ZFUlNJT04pICYmIC8qIFZlcnNpb24gTnVtYmVyLCA4MDIuMVggUGcuOTggKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfU0VSVkVSX1BSSU9SSVRZKSAmJiAvKiBLZXkgU2VydmVyIFByaW9yaXR5ICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX0JBU0lDX1BBUkFNX1NFVF9PUFQpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX0JBU0lDX1BBUkFNX1NFVF9MRU4pICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3Mob3V0X2J1ZiwgbGlua19yZWMtPm5pX21hYykgJiYgLyogNiBieXRlIG9mIFNDSSAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bGxpZCkgJiYgLyogbG93ZXIgMiBieXRlIFNDSSAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b2x0X21lbWJlcl9pZCwgTUtBX01JX0xFTikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jdXJyX21zZ19udW0rKykgJiYgLyogSW1wb3J0YW50ICEhICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIE1LQV9BTEdPUklUSE1fQUdJTElUWSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbiwgTUtBX0NLTl9MRU4gLyA4KTsgLyogQ0FLIE5hbWUoQ0tOKSAqLworfQorCisvKiBCdWlsZCBhbiBlbXB0eSBMaXZlIFBlZXIgb3IgUG90ZW50aWFsIFBlZXIgbGlzdCBwYXJhbWV0ZXIgc2V0ICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdChiY21vbHRfYnVmICpvdXRfYnVmLCB1aW50OF90IHR5cGUpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04ob3V0X2J1ZiA9PSBOVUxMKTsKKworICAgIHJldHVybgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIHR5cGUpICYmIC8qIFBhcmFtZXRlciBzZXQgdHlwZSAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYgLyogb3B0aW9ucyAmIDQgYml0IGxlbmd0aCAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApOyAvKiBQYXJhbWV0ZXIgc2V0IGJvZHkgbGVuZ3RoLiAqLworfQorCisvKiBCdWlsZCBMaXZlIFBlZXIgTGlzdCBvciBQb3RlbnRpYWwgUGVlciBMaXN0IHBhcmFtZXRlciBzZXQgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfcGVlcl9saXN0KAorICAgIGJjbW9sdF9idWYgKm91dF9idWYsCisgICAgdWludDhfdCB0eXBlLAorICAgIGNvbnN0IHVpbnQ4X3QgKm1lbWJlcl9pZCwKKyAgICB1aW50MzJfdCBtZXNzYWdlX251bSkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworICAgIEJVR19PTihtZW1iZXJfaWQgPT0gTlVMTCk7CisKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCB0eXBlKSAmJiAvKiBQYXJhbWV0ZXIgc2V0IHR5cGUgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmIC8qIG9wdGlvbnMgJiA0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfTUlfTEVOICsgc2l6ZW9mKHVpbnQzMl90KSkgJiYgLyogUGFyYW1ldGVyIHNldCBib2R5IGxlbmd0aC4gKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBtZW1iZXJfaWQsIE1LQV9NSV9MRU4pICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIG1lc3NhZ2VfbnVtKTsKK30KKworLyogQnVpbGQgSUNWIEluZGljYXRvciBwYXJhbWV0ZXIgc2V0ICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2ljdl9pbmRpY2F0b3IoYmNtb2x0X2J1ZiAqb3V0X2J1ZikKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworCisgICAgcmV0dXJuCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX0lDVl9JTkRJQ0FUT1IpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJiAvKiBvcHRpb25zICYgNCBiaXQgbGVuZ3RoICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX0lDVl9MRU4pOyAvKiBQYXJhbWV0ZXIgc2V0IGJvZHkgbGVuZ3RoLiAqLworfQorCisvKiBCdWlsZCBEaXN0cmlidXRlZCBTQUsgcGFyYW1ldGVyIHNldCAoR0NNLUFFUy0xMjgpICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2Rpc3RyaWJ1dGVkX3NhaygKKyAgICBjb25zdCBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCisgICAgYmNtb2x0X2J1ZiAqb3V0X2J1ZiwKKyAgICBjb25zdCB1aW50OF90ICprZXlfd3JhcHBlZF9zYWspCit7CisgICAgdWludDhfdCBvcHRpb247CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworICAgIEJVR19PTihrZXlfd3JhcHBlZF9zYWsgPT0gTlVMTCk7CisKKyAgICAvKiBuZWVkIERpc3RyaWJ1dGVkIEFOICYgQ29uZmlkZW50aWFsaXR5IE9mZnNldCAoYml0IDUsNC4gdXNlIDApICovCisgICAgb3B0aW9uID0gbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5hc3NvY2lhdGlvbl9udW1iZXI7CisKKyAgICBvcHRpb24gPDw9IE1LQV9TQUtfVVNFX1BBUkFNX0FOX1NISUZUOyAvKiBtb3ZlIHRvIGJpdCA3LDYgKi8KKworICAgIC8qIGtleSBudW1iZXIgJiBBTiB3aWxsIGJlIGluY3JlYXNlZCBmcm9tIHRoZSBjYWxsZXIgKi8KKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX0RJU1RfU0FLKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBvcHRpb24pIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApIHx8IC8qIG9wdGlvbnMgJiA0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX0tFWV9XUkFQUEVEX1NBS19MRU4gKyBNS0FfS05fTEVOKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBrZXlfd3JhcHBlZF9zYWssIE1LQV9LRVlfV1JBUFBFRF9TQUtfTEVOKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qIEJ1aWxkIE1BQ3NlYyBTQUsgVXNlIHBhcmFtYXRlciBzZXQgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfc2FrX3VzZV9wYXJhbSgKKyAgICBjb25zdCBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCisgICAgYmNtb2x0X2J1ZiAqb3V0X2J1ZiwKKyAgICBiY21vc19ib29sIHNldF90eCwKKyAgICBiY21vc19ib29sIHNldF9yeCkKK3sKKyAgICB1aW50OF90IG9wdGlvbjEgPSAwOworICAgIHVpbnQ4X3Qgb3B0aW9uMiA9IDA7CisgICAgdWludDhfdCB0bXAgPSAwOworICAgIHVpbnQzMl90IG9sZF9rbjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CisKKyAgICAvKiBvcHRpb24gMTogTGF0ZXN0IEtleSBBTig3OjYpLCBMYXRlc3QgS2V5IFR4KDUpLCBMYXRlc3QgS2V5IFJ4KDQpIE9sZCBLZXkgQU4oMzoyKSwgT2xkIEtleSBUeCgxKSwgT2xkIEtleSBSeCgwKSAqLworICAgIG9wdGlvbjEgPSBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlcjsKKyAgICBvcHRpb24xIDw8PSBNS0FfU0FLX1VTRV9QQVJBTV9BTl9TSElGVDsgLyogbW92ZSB0byBiaXQgNyw2IChBTikgKi8KKworICAgIGlmIChzZXRfdHgpCisgICAgeworICAgICAgICB0bXAgPSAxIDw8IE1LQV9TQUtfVVNFX1BBUkFNX0xLX1RYX1NISUZUOyAvKiBMYXRlc3QgS2V5IFRYICovCisgICAgfQorICAgIGlmIChzZXRfcngpCisgICAgeworICAgICAgICB0bXAgPSB0bXAgfCAoMSA8PCBNS0FfU0FLX1VTRV9QQVJBTV9MS19SWF9TSElGVCk7IC8qIExhdGVzdCBLZXkgUnggKi8KKyAgICB9CisKKyAgICAvKiBmb3IgZmlyc3QgZnJhbWUsIGFsbCAwIGlzIHVzZWQgZm9yIG9sZCBrZXkgaW5mbyAqLworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnJlZnJlc2hfY250ICE9IDApCisgICAgeworICAgICAgICAvKiBmb3IgT0xEIEFOLCB0eCwgcnggYml0cyAqLworICAgICAgICB0bXAgPSB0bXAgfCAoKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+YXNzb2NpYXRpb25fbnVtYmVyICYgTUtBX1NBS19VU0VfUEFSQU1fT0xEX0tFWV9BTl9NQVNLKSA8PCBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX0FOX1NGVCk7CisgICAgICAgIHRtcCA9IHRtcCB8IE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfVFhfUlg7IC8qIHNob3VsZCBoYXZlIGJlZW4gdHggJiByeCAqLworICAgIH0KKyAgICBvcHRpb24xIHw9IHRtcDsKKworICAgIC8qIG9wdGlvbiAyOiBvbmx5IHNldCBiaXQgNyw2KHBsYWluIHR4ICYgcGxhaW4gcngpLiBhbGwgb3RoZXIgYml0cyBpbmNsdWRpbmcgNCBiaXRzIGxlbmd0aCBmaWVsZCBzaG91bGQgYmUgMCAqLworICAgIG9wdGlvbjIgPSBNS0FfU0FLX1VTRV9QQVJBTV9TRUNPTkRfT1BUX0JZVEU7CisKKyAgICAvKiBuZWVkIHRvIGRlY3JlbWVudCBrZXkgbnVtYmVyIGZvciBvbGQga2V5IChiZWNhdXNlIGtleSBudW1lciBtYXkgYmUgYWxyZWFkeSBpbmNyZW1lbnRlZCkgKi8KKyAgICBpZiAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyID09IDEpIC8qIGluaXRpYWwgbnVtYmVyICovCisgICAgeworICAgICAgICBvbGRfa24gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvbGRfa24gPSBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgLSAxOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfTUFDU0VDX1NBS19VU0UpIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIG9wdGlvbjEpIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIG9wdGlvbjIpIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9TQUtfVVNFX1BBUkFNX0JPRFlfTEVOKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9sdF9tZW1iZXJfaWQsIE1LQV9NSV9MRU4pIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIpIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCAxKSB8fCAvKiBMb3dlc3QgYWNjZXB0YWJsZSBQTiwgc3RhcnQgZnJvbSAxICovCisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b2x0X21lbWJlcl9pZCwgTUtBX01JX0xFTikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIG9sZF9rbikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKiBDYWxjdWxhdGUgSUNWIGFuZCBhdHRhY2ggaXQgYXQgdGhlIGVuZCBvZiBNS1BEVSAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9jYWxjX2FuZF9hdHRhY2hfaWN2KG1rYV9saW5rX2luZm8gKm1rYV9pbmZvLCBiY21vbHRfYnVmICpvdXRfYnVmKQoreworICAgIHVpbnQ4X3QgaWNrW01LQV9LRVlfTEVOXTsKKyAgICB1aW50OF90IGljdltNS0FfS0VZX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihta2FfaW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04ob3V0X2J1ZiA9PSBOVUxMKTsKKworICAgIF9ta2FfY2FsY19pY2soaWNrLCBta2FfaW5mby0+Y2FrLCBta2FfaW5mby0+Y2tuKTsKKworICAgIC8qIElDViB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBEQSB0byBlbmQgb2YgSUNWIGluZGljYXRvciAqLworICAgIF9ta2FfY2FsY19pY3YoaWN2LCBpY2ssIG91dF9idWYtPnN0YXJ0LCAodWludDE2X3QpYmNtb2x0X2J1Zl9nZXRfdXNlZChvdXRfYnVmKSk7CisKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBpY3YsIE1LQV9LRVlfTEVOKTsKK30KKworLyogU2VuZCB0aGUgZmlyc3QgTUtBIGZyYW1lIHRvIE9OVSAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9zZW5kX2luaXRfZnJhbWUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9sdF9idWYgb3V0X2J1ZjsKKyAgICB1aW50OF90IGZyYW1lW01LQV9QRFVfTUFYX0ZSQU1FX0xFTl07CisgICAgYmNtb3NfYm9vbCByZXQgPSBCQ01PU19GQUxTRTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJm91dF9idWYsIE1LQV9QRFVfTUFYX0ZSQU1FX0xFTiwgZnJhbWUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICAvKiBjb25zdHJ1Y3QgZnJhbWUgKi8KKyAgICBpZiAoIV9ta2FfYnVpbGRfZWFwb2xfaGVhZGVyKGxpbmtfcmVjLCAmb3V0X2J1ZiwgTUtBX09MVF9JTklUX0ZSQU1FX0xFTikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfYmFzaWNfcGFyYW1ldGVyX3NldChsaW5rX3JlYywgJm91dF9idWYpIHx8CisgICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKSB8fAorICAgICAgICAhX21rYV9idWlsZF9lbXB0eV9wZWVyX2xpc3QoJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUKSB8fAorICAgICAgICAhX21rYV9idWlsZF9pY3ZfaW5kaWNhdG9yKCZvdXRfYnVmKSB8fAorICAgICAgICAhX21rYV9jYWxjX2FuZF9hdHRhY2hfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgJm91dF9idWYpKSAvKiBsYXN0IGltcG9ydGFudCBzdGVwLiBDYWxjICYgYXR0YWNoIElDViAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSBkcG9lX3NlY19zZW5kX2VhcG9sKGxpbmtfcmVjLT5kZXZpY2UsICZsaW5rX3JlYy0+a2V5LCBmcmFtZSwgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmb3V0X2J1ZikpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCBNS0FfTElGRV9USU1FICogMTAwMCk7CisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lciwgTUtBX0hFTExPX1RJTUUgKiAxMDAwKTsKKyAgICAgICAgcmV0ID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBHZW5lcmF0ZSBhIFNBSyB1c2luZyBSTkcgKi8KK3ZvaWQgbWthX2dlbmVyYXRlX3NhayhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9zX2Jvb2wgaW5pdGlhbCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgLyogR2VuZXJhdGUgU0FLICovCisgICAgaWYgKGluaXRpYWwpCisgICAgeworICAgICAgICBfbWthX2NhbGNfa2VrKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2VrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNhaywgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ja24pOworICAgICAgICBkcG9lX3NlY19nZW5lcmF0ZV9uX2J5dGVfcmFuZG9tX251bWJlcihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgTUtBX0tFWV9MRU4pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkcG9lX3NlY19nZW5lcmF0ZV9uX2J5dGVfcmFuZG9tX251bWJlcihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm5ld19zYWssIE1LQV9LRVlfTEVOKTsKKyAgICB9Cit9CisKKy8qIFNlbmQgdGhlIFNBSyB0byB0aGUgT05VICovCitiY21vc19lcnJubyBta2Ffc2VuZF9zYWsoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCB1aW50OF90ICpzYWspCit7CisgICAgYmNtb2x0X2J1ZiBvdXRfYnVmOworICAgIHVpbnQ4X3QgZnJhbWVbTUtBX1BEVV9NQVhfRlJBTUVfTEVOXTsKKyAgICB1aW50OF90IGtleV93cmFwcGVkX3Nha1tNS0FfS0VZX0xFTiAqIDJdID0ge307CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICBkcG9lX3NlY19hZXNfa2V5IGFlc19rZXk7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZvdXRfYnVmLCBNS0FfUERVX01BWF9GUkFNRV9MRU4sIGZyYW1lLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgLyoga2V5IHdyYXAgc2FrIHVzaW5nIGtlayAqLworICAgIGRwb2Vfc2VjX2Flc19zZXRfZW5jcnlwdF9rZXkobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZWssIE1LQV9LRUtfTEVOLCAmYWVzX2tleSk7CisgICAgZHBvZV9zZWNfYWVzX3dyYXBfa2V5KCZhZXNfa2V5LCBrZXlfd3JhcHBlZF9zYWssIHNhaywgTUtBX1NBS19MRU4pOworCisgICAgLyogY29uc3RydWN0IGZyYW1lICovCisgICAgaWYgKCFfbWthX2J1aWxkX2VhcG9sX2hlYWRlcigKKyAgICAgICAgICAgIGxpbmtfcmVjLAorICAgICAgICAgICAgJm91dF9idWYsCisgICAgICAgICAgICBNS0FfT0xUX0lOSVRfRlJBTUVfTEVOICsgTUtBX09ORV9QRUVSX0xFTiArIE1LQV9ESVNUUklCVVRFRF9TQUtfTEVOICsgTUtBX1NBS19VU0VfUEFSQU1fTEVNKSB8fAorICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfcGVlcl9saXN0KAorICAgICAgICAgICAgJm91dF9idWYsCisgICAgICAgICAgICBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QsCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtKSB8fAorICAgICAgICAhX21rYV9idWlsZF9lbXB0eV9wZWVyX2xpc3QoJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUKSB8fAorICAgICAgICAhX21rYV9idWlsZF9kaXN0cmlidXRlZF9zYWsobGlua19yZWMsICZvdXRfYnVmLCBrZXlfd3JhcHBlZF9zYWspIHx8CisgICAgICAgICFfbWthX2J1aWxkX3Nha191c2VfcGFyYW0obGlua19yZWMsICZvdXRfYnVmLCBCQ01PU19GQUxTRSwgQkNNT1NfVFJVRSkgfHwgLyogc2V0IFJYIG9ubHkgKi8KKyAgICAgICAgIV9ta2FfYnVpbGRfaWN2X2luZGljYXRvcigmb3V0X2J1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICAvKiBsYXN0IGltcG9ydGFudCBzdGVwLiBDYWxjICYgYXR0YWNoIElDViAqLworICAgIF9ta2FfY2FsY19hbmRfYXR0YWNoX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sICZvdXRfYnVmKTsKKworICAgIGlmIChCQ01fRVJSX09LID09IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIGZyYW1lLCBiY21vbHRfYnVmX2dldF91c2VkKCZvdXRfYnVmKSkpCisgICAgeworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+dHhfdGltZXIsIE1LQV9IRUxMT19USU1FICogMTAwMCk7CisgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFJlY2VpdmVkIFNBSyByZXNwb25zZS4gU2VuZCBjb25maXJtIGZyYW1lIHRvIE9OVSAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9zZW5kX3Nha19jb25maXJtX2ZyYW1lKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vbHRfYnVmIG91dF9idWY7CisgICAgdWludDhfdCBmcmFtZVtNS0FfUERVX01BWF9GUkFNRV9MRU5dOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmb3V0X2J1ZiwgTUtBX1BEVV9NQVhfRlJBTUVfTEVOLCBmcmFtZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmICghX21rYV9idWlsZF9lYXBvbF9oZWFkZXIobGlua19yZWMsICZvdXRfYnVmLCBNS0FfT0xUX0lOSVRfRlJBTUVfTEVOICsgTUtBX09ORV9QRUVSX0xFTiArIE1LQV9TQUtfVVNFX1BBUkFNX0xFTSkgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfYmFzaWNfcGFyYW1ldGVyX3NldChsaW5rX3JlYywgJm91dF9idWYpIHx8CisgICAgICAgICFfbWthX2J1aWxkX3BlZXJfbGlzdCgKKyAgICAgICAgICAgICZvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QsCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtKSB8fAorICAgICAgICAhX21rYV9idWlsZF9lbXB0eV9wZWVyX2xpc3QoJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUKSB8fAorICAgICAgICAhX21rYV9idWlsZF9zYWtfdXNlX3BhcmFtKGxpbmtfcmVjLCAmb3V0X2J1ZiwgQkNNT1NfVFJVRSwgQkNNT1NfVFJVRSkgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfaWN2X2luZGljYXRvcigmb3V0X2J1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyogbGFzdCBpbXBvcnRhbnQgc3RlcC4gQ2FsYyAmIGF0dGFjaCBJQ1YgKi8KKyAgICBfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAmb3V0X2J1Zik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSyA9PSBkcG9lX3NlY19zZW5kX2VhcG9sKGxpbmtfcmVjLT5kZXZpY2UsICZsaW5rX3JlYy0+a2V5LCBmcmFtZSwgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmb3V0X2J1ZikpOworfQorCisvKiBzZW5kIGtlZXAtYWxpdmUgZnJhbWUgZXZlcnkgMiBzZWNvbmRzICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3NlbmRfa2VlcGFsaXZlX2ZyYW1lKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vbHRfYnVmIG91dF9idWY7CisgICAgdWludDhfdCBmcmFtZVtNS0FfUERVX01BWF9GUkFNRV9MRU5dOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmb3V0X2J1ZiwgTUtBX1BEVV9NQVhfRlJBTUVfTEVOLCBmcmFtZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmICghX21rYV9idWlsZF9lYXBvbF9oZWFkZXIobGlua19yZWMsICZvdXRfYnVmLCBNS0FfT0xUX0lOSVRfRlJBTUVfTEVOICsgTUtBX09ORV9QRUVSX0xFTikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfYmFzaWNfcGFyYW1ldGVyX3NldChsaW5rX3JlYywgJm91dF9idWYpIHx8CisgICAgICAgICFfbWthX2J1aWxkX3BlZXJfbGlzdCgKKyAgICAgICAgICAgICZvdXRfYnVmLAorICAgICAgICAgICAgTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNULAorICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21lbWViZXJfaWQsCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSkgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfZW1wdHlfcGVlcl9saXN0KCZvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfUE9URU5USUFMX1BFRVJfTElTVCkgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfaWN2X2luZGljYXRvcigmb3V0X2J1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyogbGFzdCBpbXBvcnRhbnQgc3RlcC4gQ2FsYyAmIGF0dGFjaCBJQ1YgKi8KKyAgICBfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAmb3V0X2J1Zik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSyA9PSBkcG9lX3NlY19zZW5kX2VhcG9sKGxpbmtfcmVjLT5kZXZpY2UsICZsaW5rX3JlYy0+a2V5LCBmcmFtZSwgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmb3V0X2J1ZikpOworfQorCisvKiBFbnRyeSBwb2ludCBmb3IgTUtBIHByb2Nlc3MuIEl0IGlzIGNhbGxlZCB0byBzdGFydCB0aGUgTUtBIGV4Y2hhbmdlIHdpdGggdGhlIE9OVSB0aGF0IG93bnMgdGhlIHNwZWNpZmllZCBsaW5rLiAqLworYmNtb3NfZXJybm8gbWthX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBpbml0aWFsaXplIGxpbmsgTUtBIGluZm8gKi8KKyAgICBfbWthX2luaXRfbGlua19pbmZvKGxpbmtfcmVjKTsKKworICAgIC8qIHNlbmQgaW5pdGlhbCBmcmFtZSAoYmFzaWMgcGFyYW0gKyBlbXB0eSBsaXZlICYgcG90ZW50aWFsIHBlZXIgbGlzdCAqLworICAgIGlmIChfbWthX3NlbmRfaW5pdF9mcmFtZShsaW5rX3JlYykpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBDYWxjdWxhdGUgdGhlIElDViBvdmVyIHRoZSBtZXNzYWdlIGFuZCBjb21wYXJlIHdpdGggdGhlIElDViBpbiB0aGUgbWVzc2FnZS4gKi8KK3N0YXRpYyBiY21vc19lcnJubyBfbWthX2NvbXBhcmVfaWN2KG1rYV9saW5rX2luZm8gKmluZm8sIGNvbnN0IG1rYV9ldmVudCAqbXNnLCB1aW50OF90ICpyeF9pY3YpCit7CisgICAgdWludDE2X3QgbGVuID0gMDsKKyAgICB1aW50OF90IGljdltNS0FfSUNWX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihpbmZvID09IE5VTEwpOworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisKKyAgICAvKiBJZiB0aGUgSUNWIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiB0aGVyZSB3YXMgbm8gSUNWIGluIHRoZSByZWNlaXZlZCBNS0EgcGFja2V0LiBKdXN0IHJldHVybiBhbiBlcnJvci4gKi8KKyAgICBpZiAocnhfaWN2ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgb3ZlciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIElDVi4gKi8KKyAgICBsZW4gPSAoRUFQT0xfTVNHX0hEUl9TSVpFICsgbXNnLT5tc2ctPmVhcG9sX2xlbmd0aCkgLSBNS0FfSUNWX0xFTjsKKworICAgIF9ta2FfY2FsY19pY3YoaWN2LCBpbmZvLT5pY2ssIG1zZy0+YnVmLT5zdGFydCwgbGVuKTsKKworICAgIGlmIChtZW1jbXAoaWN2LCByeF9pY3YsIHNpemVvZihpY3YpKSAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBQYXJzZSB0aGUgQmFzaWMgUGFyYW1ldGVyIFNldCBpbiBNS0EgUERVcyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KAorICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywKKyAgICBiY21vbHRfYnVmICpidWYsCisgICAgdWludDE2X3QgKmJ5dGVzX3JlYWQsCisgICAgdWludDE2X3QgYm9keV9sZW4sCisgICAgdWludDhfdCAqc2NpLAorICAgIHVpbnQ4X3QgKm1lbWJlcl9pZCwKKyAgICB1aW50MzJfdCAqbXNnX251bSkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworICAgIEJVR19PTihieXRlc19yZWFkID09IE5VTEwpOworCisgICAgLyogUmVhZCB0aGUgT05VIFNDSSAqLworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1Ziwgc2NpLCBNS0FfU0NJX0xFTikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBNZW1iZXIgSUQgKi8KKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIG1lbWJlcl9pZCwgTUtBX01JX0xFTikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBPTlUgbWVzc2FnZSBudW1iZXIuICovCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyX2JlKGJ1ZiwgbXNnX251bSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICAvKiBUaGUgU0NJLCBNSSwgYW5kIE1OIHdlcmUgcmVhZCBmcm9tIHRoZSBwYWNrZXQuICovCisgICAgKmJ5dGVzX3JlYWQgPSBNS0FfU0NJX0xFTiArIE1LQV9NSV9MRU4gKyBNS0FfTU5fTEVOOworCisgICAgLyogU2tpcCB0aGUgcmVzdCAqLworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgYm9keV9sZW4gLSAqYnl0ZXNfcmVhZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2Ffd2FpdGluZ19pbml0aWFsX3Jlc3BvbnNlX2RhdGFfaW5kKG1rYV9ldmVudCAqbXNnLCBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUlNFOworICAgIHVpbnQ4X3QgKmljdl9wdHI7CisgICAgdWludDhfdCBwYXJhbV9zZXRfdHlwZTsKKyAgICB1aW50MTZfdCBib2R5X2xlbjsKKyAgICBiY21vc19ib29sIGJhc2ljX3BhcmFtX3NldF9leGlzdCA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgbGl2ZV9wZWVyX2xpc3RfZXhpc3QgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19ib29sIHBvdGVudGlhbF9wZWVyX2xpc3RfZXhpc3QgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50MTZfdCBieXRlc19yZWFkOworCisgICAgLyogVmFsaWRhdGUgdGhlIG1zZyBwb2ludGVyLiAqLworICAgIEJVR19PTihtc2ctPmJ1ZiA9PSBOVUxMKTsKKyAgICBCVUdfT04obXNnLT5tc2cgPT0gTlVMTCk7CisKKyAgICAvKiBtYXJrIElDViBmaWVsZCBvZmZzZXQgKi8KKyAgICBpY3ZfcHRyID0gbXNnLT5idWYtPmN1cnIgKyAobXNnLT5tc2ctPmVhcG9sX2xlbmd0aCAtIE1LQV9JQ1ZfTEVOKTsKKworICAgIC8qIFZhbGlkYXRlIHRoZSBJbnRlZ3JpdHkgQ2hlY2sgVmFsdWUgYmVmb3JlIGNvbnRpbnVpbmcgdG8gcHJvY2VzcyB0aGUgcGFja2V0LiAqLworICAgIHJjID0gX21rYV9jb21wYXJlX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIG1zZywgaWN2X3B0cik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gcmMsIHJjKTsKKworICAgIHdoaWxlIChiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShtc2ctPmJ1ZikgPiAwKQorICAgIHsKKyAgICAgICAgLyogRG9uJ3QgcGFyc2UgcGFzdCB0aGUgSUNWIFBhcmFtZXRlciBTZXQgKi8KKyAgICAgICAgaWYgKGJjbW9sdF9idWZfc25hcF9nZXQobXNnLT5idWYpID49IGljdl9wdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCB3aGF0IHNob3VsZCBiZSB0aGUgQmFzaWMgUGFyYW1ldGVyIFNldCBoZWFkZXIuICovCisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KG1zZy0+YnVmLCAmcGFyYW1fc2V0X3R5cGUpIHx8CisgICAgICAgICAgICAhYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCAxKSB8fAorICAgICAgICAgICAgIWJjbW9sdF9idWZfcmVhZF91MTZfYmUobXNnLT5idWYsICZib2R5X2xlbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogVGhlIGJvZHkgbGVuZ3RoIGlzIHJlYWxseSAxMi1iaXRzLiAqLworICAgICAgICBib2R5X2xlbiAmPSAweDBmZmY7CisKKyAgICAgICAgaWYgKHBhcmFtX3NldF90eXBlID09IE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbmVlZCB0byBmaW5kIG91dCB3aGV0aGVyIGl0IGlzIEJhc2ljIHBhcmFtZXRlciBzZXQgT1IgTGl2ZSBQZWVyIExpc3QgKi8KKyAgICAgICAgICAgIGlmIChib2R5X2xlbiA+PSBNS0FfQkFTSUNfUEFSQU1fU0VUX0xFTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KAorICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYywKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5idWYsCisgICAgICAgICAgICAgICAgICAgICZieXRlc19yZWFkLAorICAgICAgICAgICAgICAgICAgICBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbnVfc2NpLAorICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgInBhcnNlIGJhc2ljIHBhcmFtIHNldCBmYWlsZWQhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWFyayB0aGF0IHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IHdhcyBmb3VuZC4gKi8KKyAgICAgICAgICAgICAgICBiYXNpY19wYXJhbV9zZXRfZXhpc3QgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExpdmUgUGVlciBMaXN0LiBza2lwICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgInBhcnNlIGxpdmUgcGVlciBsaXN0IGZhaWxlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgTGl2ZSBQZWVyIExpc3QgUGFyYW1ldGVyIFNldCB3YXMgZm91bmQuICovCisgICAgICAgICAgICAgICAgbGl2ZV9wZWVyX2xpc3RfZXhpc3QgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhcmFtX3NldF90eXBlID09IE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG1pW01LQV9NSV9MRU5dOworCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChtc2ctPmJ1ZiwgbWksIHNpemVvZihtaSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgInBhcnNlIHBvdGVudGlhbCBwZWVyIGxpc3QgZmFpbGVkIVxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCB0aGUgT0xUIG1lbWJlciBJRCBpbiB0aGUgUG90ZW50aWFsIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIE9MVCBtZW1iZXIKKyAgICAgICAgICAgICAgIElELiAqLworICAgICAgICAgICAgaWYgKG1lbWNtcChtaSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIndyb25nIG1lbWJlciBJRCFcbiIpOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNraXAgdGhlIHJlbWFpbmluZyBieXRlcy4gKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbiAtIE1LQV9NSV9MRU4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgImJ1ZmZlciBvdmVyZmxvdyFcbiIpOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTWFyayB0aGF0IHRoZSBQb3RlbnRpYWwgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQgd2FzIGZvdW5kLiAqLworICAgICAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTa2lwIG90aGVyIFBhcmFtZXRlciBTZXQgZGF0YS4gKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiYnVmZmVyIG92ZXJmbG93IVxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChyYyA9PSBCQ01fRVJSX09LKSAmJgorICAgICAgICBiYXNpY19wYXJhbV9zZXRfZXhpc3QgJiYKKyAgICAgICAgbGl2ZV9wZWVyX2xpc3RfZXhpc3QgJiYKKyAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9leGlzdCAmJgorICAgICAgICAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5wZWVyX3N0YXRlICE9IE1LQV9QRUVSX1NUQVRFX0xJVkUpKQorICAgIHsKKyAgICAgICAgLyogcHJvY2VlZCB0byBuZXh0IHN0YXRlICovCisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cGVlcl9zdGF0ZSA9IE1LQV9QRUVSX1NUQVRFX0xJVkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBIYW5kbGVyIGZvciBpbml0aWFsIHJlc3BvbnNlIGZyb20gdGhlIE9OVSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2Ffd2FpdGluZ19pbml0aWFsX3Jlc3BvbnNlKG1rYV9ldmVudCAqbXNnLCBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obXNnID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgc3dpdGNoIChtc2ctPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIE1LQV9NU0dfVElNRU9VVDoKKyAgICAgICAgICAgIC8qIHJldHJ5IDMgdGltZXMgKi8KKyAgICAgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnJldHJ5X2NudCA8IE1LQV9JTklUX1JFVFJZX0NOVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnJldHJ5X2NudCsrOworICAgICAgICAgICAgICAgICh2b2lkKV9ta2Ffc2VuZF9pbml0X2ZyYW1lKGxpbmtfcmVjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbWthX2NsZWFyX2xpbmtfaW5mbyhsaW5rX3JlYyk7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1RJTUVPVVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1LQV9NU0dfREFUQV9JTkQ6CisgICAgICAgICAgICByYyA9IF9ta2Ffd2FpdGluZ19pbml0aWFsX3Jlc3BvbnNlX2RhdGFfaW5kKG1zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfbWthX2luaXRpYWxfc2FrX3NlbnRfZGF0YV9pbmQobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgdWludDhfdCAqaWN2X3B0cjsKKyAgICB1aW50OF90IHBhcmFtX3NldF90eXBlOworICAgIHVpbnQ4X3Qga3NfcHJpb3JpdHk7CisgICAgdWludDE2X3QgYm9keV9sZW47CisgICAgYmNtb3NfYm9vbCBiYXNpY19wYXJhbV9vayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgbGl2ZV9wZWVyX2xpc3Rfb2sgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19ib29sIHBvdGVudGlhbF9wZWVyX2xpc3Rfb2sgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19ib29sIHNha191c2VfcGFyYW1fb2sgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50MTZfdCBieXRlc19yZWFkOworCisgICAgLyogVmFsaWRhdGUgdGhlIG1zZyBwb2ludGVyLiAqLworICAgIEJVR19PTihtc2ctPm1zZyA9PSBOVUxMKTsKKyAgICBCVUdfT04obXNnLT5idWYgPT0gTlVMTCk7CisKKyAgICAvKiBtYXJrIElDViBmaWVsZCBvZmZzZXQgKi8KKyAgICBpY3ZfcHRyID0gbXNnLT5idWYtPmN1cnIgKyAobXNnLT5tc2ctPmVhcG9sX2xlbmd0aCAtIE1LQV9JQ1ZfTEVOKTsKKworICAgIC8qIFZhbGlkYXRlIHRoZSBJbnRlZ3JpdHkgQ2hlY2sgVmFsdWUgYmVmb3JlIGNvbnRpbnVpbmcgdG8gcHJvY2VzcyB0aGUgcGFja2V0LiAqLworICAgIHJjID0gX21rYV9jb21wYXJlX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIG1zZywgaWN2X3B0cik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gcmMsIHJjKTsKKworICAgIHdoaWxlIChiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShtc2ctPmJ1ZikgPiAwKQorICAgIHsKKyAgICAgICAgLyogRG9uJ3QgcGFyc2UgcGFzdCB0aGUgSUNWIFBhcmFtZXRlciBTZXQgKi8KKyAgICAgICAgaWYgKGJjbW9sdF9idWZfc25hcF9nZXQobXNnLT5idWYpID49IGljdl9wdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCB3aGF0IHNob3VsZCBiZSB0aGUgQmFzaWMgUGFyYW1ldGVyIFNldCBoZWFkZXIuICovCisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KG1zZy0+YnVmLCAmcGFyYW1fc2V0X3R5cGUpIHx8CisgICAgICAgICAgICAhYmNtb2x0X2J1Zl9yZWFkX3U4KG1zZy0+YnVmLCAma3NfcHJpb3JpdHkpIHx8CisgICAgICAgICAgICAhYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShtc2ctPmJ1ZiwgJmJvZHlfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgYm9keSBsZW5ndGggaXMgcmVhbGx5IDEyLWJpdHMuICovCisgICAgICAgIGJvZHlfbGVuICY9IDB4MGZmZjsKKworICAgICAgICBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgaXQgaXMgQmFzaWMgcGFyYW1ldGVyIHNldCBPUiBMaXZlIFBlZXIgTGlzdCAqLworICAgICAgICAgICAgaWYgKGJvZHlfbGVuID49IE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGluIG91ciBlbnZpcm9ubWVudCwgT05VIGNhbiBub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGxpdmUgcGVlci4gU28sIGp1c3Qgc2VlaW5nIHBhcmFtIHNldCBib2R5IGxlbgorICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBnb29kIGVub3VnaC4gKi8KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5rX21uOworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NpW01LQV9TQ0lfTEVOXTsKKyAgICAgICAgICAgICAgICB1aW50OF90IG1pW01LQV9NSV9MRU5dOworCisgICAgICAgICAgICAgICAgcmMgPSBfbWthX3BhcnNlX2Jhc2ljX3BhcmFtX3NldChsaW5rX3JlYywgbXNnLT5idWYsICZieXRlc19yZWFkLCBib2R5X2xlbiwgc2NpLCBtaSwgJmxpbmtfbW4pOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVmVyaWZ5IHRoYXQgT05VIFNDSSBpcyB3aGF0J3MgZXhwZWN0ZWQuICovCisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9udV9zY2ksIHNjaSwgTUtBX1NDSV9MRU4pICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgTUkgaXMgd2hhdCdzIGV4cGVjdGVkLiAqLworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21lbWViZXJfaWQsIG1pLCBNS0FfTUlfTEVOKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVmVyaWZ5IHRoYXQgdGhlIE1OIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPCBsaW5rX21uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29ycmVjdCBNTiEgKi8KKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPSBsaW5rX21uOworICAgICAgICAgICAgICAgICAgICBiYXNpY19wYXJhbV9vayA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExpdmUgUGVlciBMaXN0LiBza2lwICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWFyayB0aGF0IHRoZSBMaXZlIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IHdhcyBmb3VuZC4gKi8KKyAgICAgICAgICAgICAgICBsaXZlX3BlZXJfbGlzdF9vayA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNraXAgUG90ZW50aWFsIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0LiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgUG90ZW50aWFsIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IHdhcyBmb3VuZC4gKi8KKyAgICAgICAgICAgIHBvdGVudGlhbF9wZWVyX2xpc3Rfb2sgPSBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhcmFtX3NldF90eXBlID09IE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgb25seSBMYXRlc3Qga2V5IHR4ICYgcnggYml0cyAoYml0IDQgJiA1KSAqLworICAgICAgICAgICAgaWYgKChrc19wcmlvcml0eSAmIDB4MzApID09IDB4MzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2FrX3VzZV9wYXJhbV9vayA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNraXAgdGhlIE1LQSBTQUsgVXNlIFBhcmFtZXRlciBTZXQuICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNraXAgYWxsIG90aGVyIFBhcmFtZXRlciBTZXQgZGF0YS4gKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogRXZlcnl0aGluZyBsb29rcyBnb29kIHNvIGZhcj8gKi8KKyAgICBpZiAoKHJjID09IEJDTV9FUlJfT0spICYmCisgICAgICAgIGJhc2ljX3BhcmFtX29rICYmCisgICAgICAgIGxpdmVfcGVlcl9saXN0X29rICYmCisgICAgICAgIHBvdGVudGlhbF9wZWVyX2xpc3Rfb2sgJiYKKyAgICAgICAgc2FrX3VzZV9wYXJhbV9vaykKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkdvdCBnb29kIE1LQSBTQUsgcmVzcG9uc2VcbiIpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyogUmVzcG9uc2UgZnJhbWUgaGFuZGxlciBmb3IgdGhlIGZpcnN0IFNBSyBmcm9tIHRoZSBPTFQgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfbWthX2luaXRpYWxfc2FrX3NlbnQobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgTUtBX01TR19USU1FT1VUOgorICAgICAgICAgICAgX21rYV9jbGVhcl9saW5rX2luZm8obGlua19yZWMpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1RJTUVPVVQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1LQV9NU0dfREFUQV9JTkQ6CisgICAgICAgICAgICByYyA9IF9ta2FfaW5pdGlhbF9zYWtfc2VudF9kYXRhX2luZChtc2csIGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV9zYWtfZG9uZV9kYXRhX2luZChta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICB1aW50OF90ICppY3ZfcHRyOworICAgIHVpbnQ4X3QgcGFyYW1fc2V0X3R5cGU7CisgICAgdWludDE2X3QgYm9keV9sZW47CisgICAgdWludDhfdCBrc19wcmlvcml0eTsKKyAgICB1aW50MTZfdCBieXRlc19yZWFkOworCisgICAgLyogVmFsaWRhdGUgdGhlIG1zZyBwb2ludGVyLiAqLworICAgIEJVR19PTihtc2ctPm1zZyA9PSBOVUxMKTsKKyAgICBCVUdfT04obXNnLT5idWYgPT0gTlVMTCk7CisKKyAgICAvKiBtYXJrIElDViBmaWVsZCBvZmZzZXQgKi8KKyAgICBpY3ZfcHRyID0gbXNnLT5idWYtPmN1cnIgKyAobXNnLT5tc2ctPmVhcG9sX2xlbmd0aCAtIE1LQV9JQ1ZfTEVOKTsKKworICAgIC8qIFZhbGlkYXRlIHRoZSBJbnRlZ3JpdHkgQ2hlY2sgVmFsdWUgYmVmb3JlIGNvbnRpbnVpbmcgdG8gcHJvY2VzcyB0aGUgcGFja2V0LiAqLworICAgIHJjID0gX21rYV9jb21wYXJlX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIG1zZywgaWN2X3B0cik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gcmMsIHJjKTsKKworICAgIHdoaWxlIChiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShtc2ctPmJ1ZikgPiAwKQorICAgIHsKKyAgICAgICAgLyogRG9uJ3QgcGFyc2UgcGFzdCB0aGUgSUNWIFBhcmFtZXRlciBTZXQgKi8KKyAgICAgICAgaWYgKGJjbW9sdF9idWZfc25hcF9nZXQobXNnLT5idWYpID49IGljdl9wdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCB3aGF0IHNob3VsZCBiZSB0aGUgQmFzaWMgUGFyYW1ldGVyIFNldCBoZWFkZXIuICovCisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KG1zZy0+YnVmLCAmcGFyYW1fc2V0X3R5cGUpIHx8CisgICAgICAgICAgICAhYmNtb2x0X2J1Zl9yZWFkX3U4KG1zZy0+YnVmLCAma3NfcHJpb3JpdHkpIHx8CisgICAgICAgICAgICAhYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShtc2ctPmJ1ZiwgJmJvZHlfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgYm9keSBsZW5ndGggaXMgcmVhbGx5IDEyLWJpdHMuICovCisgICAgICAgIGJvZHlfbGVuICY9IDB4MGZmZjsKKworICAgICAgICBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgaXQgaXMgQmFzaWMgcGFyYW1ldGVyIHNldCBPUiBMaXZlIFBlZXIgTGlzdCAqLworICAgICAgICAgICAgaWYgKGJvZHlfbGVuID49IE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGluIG91ciBlbnZpcm9ubWVudCwgT05VIGNhbiBub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGxpdmUgcGVlci4gU28sIGp1c3Qgc2VlaW5nIHBhcmFtIHNldCBib2R5IGxlbgorICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBnb29kIGVub3VnaC4gKi8KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5rX21uOworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NpW01LQV9TQ0lfTEVOXTsKKyAgICAgICAgICAgICAgICB1aW50OF90IG1pW01LQV9NSV9MRU5dOworCisgICAgICAgICAgICAgICAgcmMgPSBfbWthX3BhcnNlX2Jhc2ljX3BhcmFtX3NldChsaW5rX3JlYywgbXNnLT5idWYsICZieXRlc19yZWFkLCBib2R5X2xlbiwgc2NpLCBtaSwgJmxpbmtfbW4pOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVmVyaWZ5IHRoYXQgT05VIFNDSSBpcyB3aGF0J3MgZXhwZWN0ZWQuICovCisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9udV9zY2ksIHNjaSwgTUtBX1NDSV9MRU4pICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgTUkgaXMgd2hhdCdzIGV4cGVjdGVkLiAqLworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21lbWViZXJfaWQsIG1pLCBNS0FfTUlfTEVOKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtIDwgbGlua19tbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvcnJlY3QgTU4hICovCisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtID0gbGlua19tbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX01BQ1NFQ19TQUtfVVNFKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBsbHBuOworCisgICAgICAgICAgICAvKiBTa2lwIHRvIHRoZSBMTFBOLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIE1LQV9NSV9MRU4gKyBNS0FfS05fTEVOKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJlYWQgTGF0ZXN0IExvd2VzdCBBY2NlcHRhYmxlIFBOICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzJfYmUobXNnLT5idWYsICZsbHBuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsbHBuID4gTUtBX01BWF9BQ0NFUFRBQkxFX1BOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNldCBmbGFnIHRvIGluZGljYXRlIFNBSyByZWZyZXNoIGlzIG5lZWRlZC4gKi8KKyAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNha19yZWZyZXNoX25lZWRlZCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIG9ubHkgTGF0ZXN0IGtleSB0eCAmIHJ4IGJpdHMgKGJpdCA0ICYgNSkgKi8KKyAgICAgICAgICAgIGlmICgoa3NfcHJpb3JpdHkgJiAweDMwKSAhPSAweDMwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFdyb25nIExLIEZsYWcgKi8gLyogVE9ETzogd2h5IGlzbid0IHRoaXMgYW4gZXJyb3I/ICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRoZSBNSSwgS04sIGFuZCBMTFBOIHdlcmUgcmVhZC4gKi8KKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBib2R5X2xlbiAtIChNS0FfTUlfTEVOICsgTUtBX0tOX0xFTiArIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgICAgICAvKiBTa2lwIHRoZSByZXN0ICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYnl0ZXNfcmVhZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2tpcCBhbGwgb3RoZXIgUGFyYW1ldGVyIFNldCBkYXRhLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWZyZXNoIHJldHJ5IGNvdW50LiBUaGlzIGlzIGEgQ3JpdGljYWwgY291bnRlciAqLworICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmV0cnlfY250ID0gMDsKKworICAgIHJldHVybiByYzsKK30KKworLyogTUtBIGZyYW1lIGhhbmRsZXIgZm9yIHN0YWJsZSBzdGF0ZSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2Ffc2FrX2RvbmUobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgTUtBX01TR19USU1FT1VUOgorICAgICAgICAgICAgLyogc2VuZCBrZWVwYWxpdmUgZnJhbWUgYXQgZXZlcnkgMiBzZWNvbmRzICovCisgICAgICAgICAgICAodm9pZClfbWthX3NlbmRfa2VlcGFsaXZlX2ZyYW1lKGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtBX01TR19EQVRBX0lORDoKKyAgICAgICAgICAgIHJjID0gX21rYV9zYWtfZG9uZV9kYXRhX2luZChtc2csIGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBWYWxpZGF0ZSB0aGUgTUtBIHBhY2tldC4gKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfdmFsaWRhdGVfcGt0KGJjbW9sdF91OF9saXN0X3UxNiBta2FfbXNnLCBlYXBvbF9tc2dfaGRyICplYXBvbCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihlYXBvbCA9PSBOVUxMKTsKKworICAgIC8qIFRoaXMgaGFkIGJldHRlciBiZSBhbiBNS0EgcGFja2V0LiAqLworICAgIGlmIChlYXBvbC0+ZWFwb2xfcGFja2V0X3R5cGUgIT0gRUFQT0xfVFlQRV9NS0EpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyogVGhlIEVBUE9MIGxlbmd0aCBwbHVzIHRoZSBzaXplIG9mIHRoZSBFYXBvbE1zZ0hkciBtdXN0IGVxdWFsIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBhY2tldC4gKi8KKyAgICBpZiAobWthX21zZy5sZW4gIT0gKGVhcG9sLT5lYXBvbF9sZW5ndGggKyBFQVBPTF9NU0dfSERSX1NJWkUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIC8qIFRoZSBFQVBPTCBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gc3VwcG9ydGVkIGxlbmd0aCwgRXRoZXJuZXQgKyBFQVBPTCBoZWFkZXIgbGVuZ3RoLiAqLworICAgIGlmIChlYXBvbC0+ZWFwb2xfbGVuZ3RoIDwgTUtBX1BEVV9NSU5fTEVOR1RIKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIC8qIFRoZSBFQVBPTCBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIGZvdXIuICovCisgICAgaWYgKChlYXBvbC0+ZWFwb2xfbGVuZ3RoICUgNCkgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyogV3JhcHBlciBpbnRvIHRoZSBNS0EgY29kZSB0aGF0IHNlbmRzIGFuIFNBSyBDb25maXJtIHJlc3BvbnNlIHRvIHRoZSBPTlUuICovCitiY21vc19lcnJubyBta2Ffc2VuZF9zYWtfY29uZmlybShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIC8qIHByb2NlZWQgdG8gbmV4dCBzdGF0ZSAqLworICAgIGlmIChfbWthX3NlbmRfc2FrX2NvbmZpcm1fZnJhbWUobGlua19yZWMpKQorICAgIHsKKyAgICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBnb29kIHNvIGZhci4gVXBkYXRlIEFOIGFuZCBLZXkgTnVtYmVyICovCisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciArPSAxOworICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlciArPSAxOworICAgICAgICBpZiAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5hc3NvY2lhdGlvbl9udW1iZXIgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIGFzc29jaWF0aW9uIG51bWJlciBpcyBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgT0xUIFNDSSB0byBpZGVudGlmeSBhIHNlY3VyZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIE9MVCBhbmQKKyAgICAgICAgICAgICAgIE9OVS4gVGhlIEFOIHZhbHVlIHN0YXJ0cyBhdCB6ZXJvIGFuZCBjeWNsZXMgdGhyb3VnaCB2YWx1ZXMgMCAtIDMgYXMgYSBuZXcgU0FLIGlzIGRpc3RyaWJ1dGVkIHRvIHRoZSBPTlUuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5hc3NvY2lhdGlvbl9udW1iZXIgPSAwOyAvKiBBTiA9IDAgfiAzICovCisgICAgICAgIH0KKworICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnN0YXRlID0gTUtBX1NUQVRFX01LQV9ET05FOworICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnJlZnJlc2hfY250ICs9IDE7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmV0cnlfY250ID0gMDsKKworICAgICAgICAvKiBzdGFydCBrZWVwYWxpdmUgdGltZXIgKDIgc2Vjb25kKSAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+dHhfdGltZXIsIE1LQV9IRUxMT19USU1FICogMTAwMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBXcmFwcGVyIGludG8gdGhlIE1LQSBjb2RlIHRoYXQgaGFuZGxlcyBNS0EgUERVcyBmcm9tIHRoZSBPTlUuICovCitiY21vc19lcnJubyBta2FfcHJvY2Vzc19wYWNrZXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfdThfbGlzdF91MTYgcnhfZnJhbWUsIG1rYV9vcF90eXBlIG9wX3R5cGUpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUk07CisgICAgbWthX2V2ZW50IG1rYV9tc2c7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgZWFwb2xfbXNnX2hkciBlYXBvbDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihyeF9mcmFtZS52YWwgPT0gTlVMTCk7CisgICAgQlVHX09OKChvcF90eXBlIDw9IE1LQV9PUF9fSU5WQUxJRCkgfHwgKG9wX3R5cGUgPiBNS0FfT1BfS0VFUF9BTElWRSkpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIHJ4X2ZyYW1lLmxlbiwgcnhfZnJhbWUudmFsLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFkcG9lX3NlY19lYXBvbF91bnBhY2soJmJ1ZiwgJmVhcG9sKSkKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgImZhaWxlZCB0byB1bnBhY2sgRUFQT0wgaGVhZGVyIVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIHRoZSBNS0EgcGFja2V0IGxlbmd0aCBiZWZvcmUgcHJvY2Vzc2luZy4gKi8KKyAgICBpZiAoIV9ta2FfdmFsaWRhdGVfcGt0KHJ4X2ZyYW1lLCAmZWFwb2wpKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiSW52YWxpZCBNS0EgcGFja2V0IVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgaGFuZGxlci4gKi8KKyAgICBta2FfbXNnLnR5cGUgPSBNS0FfTVNHX0RBVEFfSU5EOworICAgIG1rYV9tc2cubXNnID0gJmVhcG9sOworICAgIG1rYV9tc2cuYnVmID0gJmJ1ZjsKKworICAgIC8qIFByb2Nlc3MgdGhlIE1LQSBwYWNrZXQuICovCisgICAgc3dpdGNoIChvcF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBNS0FfT1BfU1RBUlRfUlNQOgorICAgICAgICAgICAgcmMgPSBfbWthX3dhaXRpbmdfaW5pdGlhbF9yZXNwb25zZSgmbWthX21zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtBX09QX1NBS19SU1A6CisgICAgICAgICAgICByYyA9IF9ta2FfaW5pdGlhbF9zYWtfc2VudCgmbWthX21zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtBX09QX0tFRVBfQUxJVkU6CisgICAgICAgICAgICByYyA9IF9ta2Ffc2FrX2RvbmUoJm1rYV9tc2csIGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBXcmFwcGVyIGludG8gdGhlIE1LQSBjb2RlIHRoYXQgaGFuZGxlcyBNS0EgdGltZW91dHMuICovCitiY21vc19lcnJubyBta2FfcHJvY2Vzc190aW1lb3V0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgbWthX29wX3R5cGUgb3BfdHlwZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICBta2FfZXZlbnQgbWthX21zZzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTigob3BfdHlwZSA8IE1LQV9PUF9TVEFSVF9USU1FT1VUKSB8fCAob3BfdHlwZSA+PSBNS0FfT1BfX0NPVU5UKSk7CisKKyAgICAvKiBQYXNzIHRoZSBwYWNrZXQgdG8gdGhlIGhhbmRsZXIuICovCisgICAgbWthX21zZy50eXBlID0gTUtBX01TR19USU1FT1VUOworCisgICAgLyogUHJvY2VzcyB0aGUgTUtBIHBhY2tldC4gKi8KKyAgICBzd2l0Y2ggKG9wX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIE1LQV9PUF9TVEFSVF9USU1FT1VUOgorICAgICAgICAgICAgcmMgPSBfbWthX3dhaXRpbmdfaW5pdGlhbF9yZXNwb25zZSgmbWthX21zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtBX09QX1NBS19USU1FT1VUOgorICAgICAgICAgICAgcmMgID0gX21rYV9pbml0aWFsX3Nha19zZW50KCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0FfT1BfU0VORF9LRUVQX0FMSVZFOgorICAgICAgICAgICAgcmMgPSBfbWthX3Nha19kb25lKCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvbWthLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5NTg2NAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvbWthLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZiAhZGVmaW5lZChNS0FfSCkKKyNkZWZpbmUgTUtBX0gKKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorCisjZGVmaW5lIE1LQV9MSUZFX1RJTUUgICAgICAgICAgICAgICA2MDAwIC8qIE1zLCA2IHNlY29uZHMgKi8KKworI2RlZmluZSBNS0FfU0NJX0xFTiAgICAgICAgICAgICAgICAgOCAvKiBjb21tb24gU0NJIHNpemUgKi8KKyNkZWZpbmUgTUtBX01JX0xFTiAgICAgICAgICAgICAgICAgIDEyIC8qIE1lbWJlciBJZGVudGlmaWVyICovCisKKy8qIEtFSyAqLworI2RlZmluZSBNS0FfS0VLX0xFTiAgICAgICAgICAgICAgICAgMTI4IC8qIGJpdCBsZW5ndGguIDE2IGJ5dGVzICovCisKKy8qIFNBSyAqLworI2RlZmluZSBNS0FfU0FLX0xFTiAgICAgICAgICAgICAgICAgMTYKKworLyogSUNLICovCisjZGVmaW5lIE1LQV9JQ0tfTEVOICAgICAgICAgICAgICAgICAxMjggLyogYml0IGxlbmd0aC4gMTYgYnl0ZXMgKi8KKworLyogQ0tOICovCisjZGVmaW5lIE1LQV9DS05fTEVOICAgICAgICAgICAgICAgICAxMjggLyogYml0IGxlbmd0aC4gMTYgYnl0ZXMgKi8KKworLyogQ0FLICovCisjZGVmaW5lIE1LQV9DQUtfTEVOICAgICAgICAgICAgICAgICAxMjggLyogYml0IGxlbmd0aC4gMTYgYnl0ZXMgKi8KKworLyogZm9yIE1BQ1NlYyBLZXkgQWdyZWVtZW50ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBNS0FfU1RBVEVfSU5JVElBTCAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgTUtBX1NUQVRFX1dBSVRJTkdfSU5JVElBTF9QRUVSX1JFU1AgPSAxLAorICAgIE1LQV9TVEFURV9TQUtfU0VOVCAgICAgICAgICAgICAgICAgID0gMiwKKyAgICBNS0FfU1RBVEVfTUtBX0RPTkUgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICBNS0FfU1RBVEVfX0NPVU5UCit9IG1rYV9zdGF0ZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgTUtBX1BFRVJfU1RBVEVfTk9ORSA9IDAsCisgICAgTUtBX1BFRVJfU1RBVEVfTElWRSA9IDEsCisgICAgTUtBX1BFRVJfU1RBVEVfUE9URU5USUFMID0gMiwKK30gbWthX3BlZXJfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgb251X3NjaVtNS0FfU0NJX0xFTl07IC8qKjwgT05VJ3MgU0NJICovCisgICAgdWludDhfdCAgb2x0X21lbWJlcl9pZFtNS0FfTUlfTEVOXTsgLyoqPCBPTFQgTUkgKi8KKyAgICB1aW50MzJfdCBjdXJyX21zZ19udW07IC8qKjwgQ3VycmVudCBPTFQgTU4gKi8KKyAgICB1aW50OF90ICBsaW5rX21lbWViZXJfaWRbTUtBX01JX0xFTl07IC8qKjwgTGluayBNSSAqLworICAgIHVpbnQzMl90IGxpbmtfbXNnX251bTsgLyoqPCBDdXJyZW50IExpbmsgTU4gKi8KKyAgICB1aW50OF90ICBjYWtbTUtBX0NBS19MRU4vOF07IC8qKjwgRGVyaXZlZCBDQUsgKi8KKyAgICB1aW50OF90ICBja25bTUtBX0NLTl9MRU4vOF07IC8qKjwgRGVyaXZlZCBDS04gKi8KKyAgICB1aW50OF90ICBzYWtbTUtBX1NBS19MRU5dOyAvKio8IERlcml2ZWQgU0FLIChhLmsuYSBURUspICovCisgICAgdWludDhfdCAgbmV3X3Nha1tNS0FfU0FLX0xFTl07IC8qKjwgTmV3IGRlcml2ZWQgU0FLIGZvciBrZXkgcmVmcmVzaCAqLworICAgIHVpbnQ4X3QgIGtla1tNS0FfS0VLX0xFTi84XTsgLyoqPCBEZXJpdmVkIEtFSyAqLworICAgIHVpbnQ4X3QgIGlja1tNS0FfSUNLX0xFTi84XTsgLyoqPCBEZXJpdmVkIElDSyAqLworICAgIHVpbnQzMl90IGtleV9udW1iZXI7IC8qKjwgQ3VycmVudCBLTiAqLworICAgIHVpbnQ4X3QgIGFzc29jaWF0aW9uX251bWJlcjsgLyoqPCBBTiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGxlc3Nlcl9tYWM7IC8qKjwgTG93ZXN0IE1BQyBhZGRyZXNzIG9mIE1LQSBwZWVycyAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGdyZWF0ZXJfbWFjOyAvKio8IEdyZWF0ZXN0IE1BQyBhZGRyZXNzIG9mIE1LQSBwZWVycyAqLworICAgIG1rYV9zdGF0ZSBzdGF0ZTsgLyoqPCBTdGF0ZSBvZiBNS0EgcHJvcGVyIFNNICovCisgICAgbWthX3BlZXJfc3RhdGUgcGVlcl9zdGF0ZTsgLyoqPCBTdGF0ZSBvZiBNS0EgcGVlciAqLworICAgIHVpbnQ4X3QgIHJldHJ5X2NudDsgLyoqPCBNS0EgbWVzc2FnZSByZXRyeSBjb3VudCAqLworICAgIHVpbnQ4X3QgIHJlZnJlc2hfY250OyAvKio8IEltcG9ydGFudCBmb3IgYnVpbGRpbmcgU0FLIFVzZSBQYXJhbSBzZXQgKi8KKyAgICBiY21vc19ib29sIHNha19yZWZyZXNoX25lZWRlZDsgLyoqPCBTQUsgcmVmcmVzaCBuZWVkZWQgZmxhZyAqLworfSBta2FfbGlua19pbmZvOworCisvKiBUaGUgdHlwZSBvZiBNS0Egb3BlcmF0aW9uIHRvIHByb2Nlc3MuICovCit0eXBlZGVmIGVudW0gbWthX29wX3R5cGUKK3sKKyAgICBNS0FfT1BfX0lOVkFMSUQgPSAtMSwKKworICAgIC8qIFBhY2tldCBvcGVyYXRpb25zLiAqLworICAgIE1LQV9PUF9TVEFSVF9SU1AsCisgICAgTUtBX09QX1NBS19SU1AsCisgICAgTUtBX09QX0tFRVBfQUxJVkUsCisKKyAgICAvKiBUaW1lb3V0IG9wZXJhdGlvbnMuICovCisgICAgTUtBX09QX1NUQVJUX1RJTUVPVVQsCisgICAgTUtBX09QX1NBS19USU1FT1VULAorICAgIE1LQV9PUF9TRU5EX0tFRVBfQUxJVkUsCisKKyAgICBNS0FfT1BfX0NPVU5UCit9IG1rYV9vcF90eXBlOworCitzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWM7CisKK2JjbW9zX2Vycm5vIG1rYV9zdGFydChzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmspOworCit2b2lkIG1rYV9nZW5lcmF0ZV9zYWsoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCBiY21vc19ib29sIGluaXRpYWwpOworCitiY21vc19lcnJubyBta2Ffc2VuZF9zYWsoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCB1aW50OF90ICpzYWspOworCitiY21vc19lcnJubyBta2Ffc2VuZF9zYWtfY29uZmlybShzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmspOworCitiY21vc19lcnJubyBta2FfcHJvY2Vzc19wYWNrZXQoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCBiY21vbHRfdThfbGlzdF91MTYgcnhfZnJhbWUsIG1rYV9vcF90eXBlIG9wX3R5cGUpOworCitiY21vc19lcnJubyBta2FfcHJvY2Vzc190aW1lb3V0KHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluaywgbWthX29wX3R5cGUgb3BfdHlwZSk7CisKKyNlbmRpZiAvKiBNS0FfSCAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzRjM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIyBFUE9OIE9BTSBOZWdvdGlhdGlvbiB1c2VyIGFwcGxpY2F0aW9uCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCisJTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX2VvbgorCU1PRF9UWVBFID0gbGliCisJTU9EX0RFUFMgPSBob3N0X2FwaSBiY21fdXNlcl9hcHBsX2Vwb25fb2FtIGNvbW1vbl9lcG9uX29hbQorCisJaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKwllbmRpZgorCisJc3JjcyA9IGJjbW9sdF9lb24uYyBvYW1fc2V0cy9vYW1fY29tbW9uLmMKKworCUVOQUJMRV9EUE9FX09BTSA/PSB5CisJaWZlcSAoIiQoRU5BQkxFX0RQT0VfT0FNKSIsICJ5IikKKwkJRVhUUkFfREVGSU5FUyArPSAtREVPTl9PQU1fU0VUX0RQT0VfU1VQUE9SVEVECisJCXNyY3MgKz0gb2FtX3NldHMvZHBvZS9kcG9lLmMKKwllbmRpZiAjIEVOQUJMRV9EUE9FX09BTQorCisJRU5BQkxFX0JSQ01fT0FNID89IHkKKwlpZmVxICgiJChFTkFCTEVfQlJDTV9PQU0pIiwgInkiKQorCQlFWFRSQV9ERUZJTkVTICs9IC1ERU9OX09BTV9TRVRfQlJDTV9TVVBQT1JURUQKKwkJc3JjcyArPSBvYW1fc2V0cy9icmNtL2JyY20uYworCWVuZGlmICMgRU5BQkxFX0JSQ01fT0FNCisKKwlFTkFCTEVfQ1RDX09BTSA/PSB5CisJaWZlcSAoIiQoRU5BQkxFX0NUQ19PQU0pIiwgInkiKQorCQlFWFRSQV9ERUZJTkVTICs9IC1ERU9OX09BTV9TRVRfQ1RDX1NVUFBPUlRFRAorCQlzcmNzICs9IG9hbV9zZXRzL2N0Yy9jdGMuYworCWVuZGlmICMgRU5BQkxFX0NUQ19PQU0KKworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9lb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTkzMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5jCkBAIC0wLDAgKzEsNzgzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qICBUaGlzIGZpbGUgaXMgdGhlIG1hc3RlciBldmVudCBoYW5kbGVyIGZvciB0aGUgRVBPTiBPQU0gbmVnb3RpYXRpb24gdGFzayAtCisgICAgSXQgYWNjZXB0cyBldmVudHMgZnJvbSB0aGUgZW1iZWRkZWQgc29mdHdhcmUgYW5kIHRoZSBob3N0IGludGVyZmFjZSwgc3VwcG9ydGVkIGV2ZW50cyBhcmUKKyAgICAxLiAgU3RhcnQgT0FNIG5lZ290aWF0b24gKGZyb20gaG9zdCBpbnRlcmZhY2UpCisgICAgMi4gIFN0b3AgT0FNIG5lZ290aWF0aW9uIChmcm9tIGhvc3QgaW50ZXJmYWNlKQorICAgIDMuICBSWCBGcmFtZSAoZnJvbSBPTlUgdmlhIGVtYmVkZGVkIGZpcm13YXJlKQorICAgIDQuICBUaW1lb3V0CisKKyAgICBJdCBkaXNwYXRjaGVzIHRoZXNlIGV2ZW50cyB0byB0aGUgT0FNIHNwZWNpZmljIHN0YXRlIG1hY2hpbmUuIEN1cnJlbnRseSB3ZSBzdXBwb3J0CisgICAgT0FNIG5lZ290aWF0aW9uIGZvciBCUkNNLCBEUG9FLCBhbmQgQ1RDIE9BTSBzdGFuZGFyZHMuCisqLworCisjaW5jbHVkZSAiYmNtb2x0X2Vvbl9wcml2YXRlLmgiCisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgIm9hbV9zZXRzL29hbV9jb21tb24uaCIKKworI2RlZmluZSBFT05fVEFTS19NU0dfUV9TSVpFIDY0CisKK3R5cGVkZWYgZW51bQoreworICAgIEVPTl9FVkVOVF9UWVBFX0ZSQU1FX1JYLAorICAgIEVPTl9FVkVOVF9UWVBFX09BTV9ORUdfU1RBUlQsCisgICAgRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVE9QLAorICAgIEVPTl9FVkVOVF9UWVBFX09BTV9USU1FUl9FWFBJUkUsCisKKyAgICBFT05fRVZFTlRfVFlQRV9DT1VOVAorfSBlb25fZXZlbnRfdHlwZTsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGVvbl9mcmFtZV9kYXRhIGZyYW1lX3J4OworfSBlb25fZXZlbnRfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlb25fZXZlbnRfdHlwZSB0eXBlOworICAgIGVvbl9saW5rX3N0YXRlICpsaW5rOworICAgIGVvbl9ldmVudF9kYXRhIGRhdGE7Cit9IGVvbl9ldmVudDsKKwordHlwZWRlZiBiY21vc19lcnJubyAoKmVvbl9ldmVudF9oYW5kbGVyKShjb25zdCBlb25fZXZlbnQqIGluX2V2ZW50KTsKKworc3RhdGljIGNvbnN0IGNoYXIqIF9ldm5hbWVbRU9OX0VWRU5UX1RZUEVfQ09VTlRdID0KK3sKKyAgICBbRU9OX0VWRU5UX1RZUEVfRlJBTUVfUlhdID0gImVvbl9ldmVudF90eXBlX2ZyYW1lX3J4IiwKKyAgICBbRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVEFSVF0gPSAiZW9uX2V2ZW50X3R5cGVfb2FtX25lZ19zdGFydCIsCisgICAgW0VPTl9FVkVOVF9UWVBFX09BTV9ORUdfU1RPUF0gPSAiZW9uX2V2ZW50X3R5cGVfb2FtX25lZ19zdG9wIiwKKyAgICBbRU9OX0VWRU5UX1RZUEVfT0FNX1RJTUVSX0VYUElSRV0gPSAiZW9uX2V2ZW50X3R5cGVfb2FtX3RpbWVyX2V4cGlyZSIKK307CisKK3N0YXRpYyBiY21jbGlfZW51bV92YWwgZW9uX29hbV9zZXRfaWRfdGFibGVbRU9OX09BTV9TRVRfSURfQ09VTlQrMV0gPQoreworICAgIHsgLm5hbWUgPSAiZHBvZSIsIC52YWwgPSBFT05fT0FNX1NFVF9JRF9EUE9FIH0sCisgICAgeyAubmFtZSA9ICJicmNtIiwgLnZhbCA9IEVPTl9PQU1fU0VUX0lEX0JSQ00gfSwKKyAgICB7IC5uYW1lID0gImN0YyIsIC52YWwgPSBFT05fT0FNX1NFVF9JRF9DVEMgfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCitlb25fZ2xvYmFsX3N0YXRlIGVvbl9zdGF0ZVtCQ01UUl9NQVhfT0xUU10gPSB7fTsKKworI2RlZmluZSBIRUFSVEJFQVRfU0VORF9QRVJJT0QgMQorI2RlZmluZSBIRUFSVEJFQVRfU0VORF9PRkZTRVQgMTUKKyNkZWZpbmUgSEVBUlRCRUFUX1JFQ0VJVkVfVElNRU9VVCA1CisjZGVmaW5lIE9BTV9USU1FT1VUX1VTIChIRUFSVEJFQVRfUkVDRUlWRV9USU1FT1VUICogMTAwMCAqIDEwMDApCisKK3N0YXRpYyBiY21vc19ib29sICBlcG9uX29hbV9uZWdfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworCitzdGF0aWMgaW5saW5lIGludCBfbGlua19rZXlfY21wKGNvbnN0IGVvbl9saW5rX3N0YXRlKiBhLCBjb25zdCBlb25fbGlua19zdGF0ZSogYikKK3sKKyAgICByZXR1cm4gbWVtY21wKCZhLT5saW5rX2tleS5saW5rLCAmYi0+bGlua19rZXkubGluaywgc2l6ZW9mKGEtPmxpbmtfa2V5LmxpbmspKTsKK30KKworUkJfR0VORVJBVEVfSU5MSU5FKGxpbmtfc3RhdGVfbWFwLCBlb25fbGlua19zdGF0ZSwgcmJfZW50cnksIF9saW5rX2tleV9jbXApOworCisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2luaXRfdGFzayhiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gZW9uX3N0YXRlW2RldmljZV0udGFza19uYW1lLAorICAgICAgICAucHJpb3JpdHkgICAgID0gVEFTS19QUklPUklUWV9VU0VSX0FQUExfRU9OLAorICAgICAgICAuY29yZSAgICAgICAgID0gQkNNT1NfQ1BVX0NPUkVfQU5ZLCAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICAgICAgLmluaXRfaGFuZGxlciA9IE5VTEwKKyAgICB9OworICAgIHNucHJpbnRmKGVvbl9zdGF0ZVtkZXZpY2VdLnRhc2tfbmFtZSwgc2l6ZW9mKGVvbl9zdGF0ZVtkZXZpY2VdLnRhc2tfbmFtZSksICJ1c2VyX2FwcGxfZW9uJXUiLCBkZXZpY2UpOworICAgIGJjbW9zX2Vycm5vIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJmVvbl9zdGF0ZVtkZXZpY2VdLnRhc2ssICZ0YXNrX3BhcmFtcyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25faW5pdF9tb2R1bGUoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9IHsgLm5hbWUgPSBlb25fc3RhdGVbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSwgLnNpemUgPSBFT05fVEFTS19NU0dfUV9TSVpFIH0sCisgICAgICAgIC5pbml0ID0gTlVMTAorICAgIH07CisgICAgc25wcmludGYoZW9uX3N0YXRlW2RldmljZV0ubXNnX3F1ZXVlX25hbWUsIHNpemVvZihlb25fc3RhdGVbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSksICJlb25fbXNnX3EldSIsIGRldmljZSk7CisgICAgcmV0dXJuIGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FT04gKyBkZXZpY2UsICZlb25fc3RhdGVbZGV2aWNlXS50YXNrLCAmbW9kdWxlX3BhcmFtcyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX3NlbmRfb3NfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX21zZ19pZCB0eXBlLCBlb25fdGFza19tc2dfZGF0YSAqZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBlb25fdGFza19tc2cgKm1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEVPTl9MT0coRVJST1IsIGRldmljZSwgIk9TIE1lc3NhZ2UgY2FsbG9jIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIG1zZy0+b3NfbXNnLmluc3RhbmNlID0gZGV2aWNlOworICAgIG1zZy0+b3NfbXNnLnR5cGUgPSB0eXBlOworICAgIG1zZy0+ZGF0YSA9ICpkYXRhOworICAgIHJjID0gYmNtb3NfbXNnX2Rpc3BhdGNoKCZtc2ctPm9zX21zZywgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEVPTl9MT0coRVJST1IsIGRldmljZSwgIk9TIE1lc3NhZ2Ugc2VuZCBmYWlsZWQgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9lb25fZGVzdHJveV9saW5rX3N0YXRlKGVvbl9saW5rX3N0YXRlKiBsaW5rX3N0YXRlKQoreworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiRGVzdHJveWluZyBsaW5rXG4iKTsKKyAgICBiY21vc190aW1lcl9kZXN0cm95KCZsaW5rX3N0YXRlLT5vYW1fdGltZXIpOworICAgIFJCX1JFTU9WRShsaW5rX3N0YXRlX21hcCwgJmVvbl9zdGF0ZVtsaW5rX3N0YXRlLT5saW5rX2tleS5kZXZpY2VfaWRdLmxpbmtfc3RhdGVfbWFwLCBsaW5rX3N0YXRlKTsKKyAgICBpZiAoTlVMTCAhPSBsaW5rX3N0YXRlLT50eC5wYXlsb2FkKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlLT50eC5wYXlsb2FkKTsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gbGlua19zdGF0ZS0+cngucGF5bG9hZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUobGlua19zdGF0ZS0+cngucGF5bG9hZCk7CisgICAgfQorICAgIGlmIChOVUxMICE9IGxpbmtfc3RhdGUtPm9yZ19zcGVjX3N0YXRlKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlLT5vcmdfc3BlY19zdGF0ZSk7CisgICAgfQorICAgIGJjbW9zX2ZyZWUobGlua19zdGF0ZSk7Cit9CisKK3N0YXRpYyBlb25fbGlua19zdGF0ZSogX2Vvbl9maW5kX2xpbmtfc3RhdGUoY29uc3QgZW9uX2xpbmtfa2V5KiBsaW5rX2tleSkKK3sKKyAgICBlb25fbGlua19zdGF0ZSBxdWVyeV9rZXkgPSB7IC5saW5rX2tleS5saW5rID0gbGlua19rZXktPmxpbmsgfTsKKworICAgIHJldHVybiBSQl9GSU5EKGxpbmtfc3RhdGVfbWFwLCAmZW9uX3N0YXRlW2xpbmtfa2V5LT5kZXZpY2VfaWRdLmxpbmtfc3RhdGVfbWFwLCAmcXVlcnlfa2V5KTsKK30KKworc3RhdGljIHZvaWQgX2Vvbl9kZWZhdWx0X2NhbGxiYWNrX2ZuKHZvaWQgKmNvbnRleHQsIGNvbnN0IGVvbl9saW5rX2tleSogbGlua19rZXksIGJjbW9zX2Vycm5vIHJlc3VsdCkKK3sKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IF9lb25fZmluZF9saW5rX3N0YXRlKGxpbmtfa2V5KTsKKworICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgSU5GTywgbGlua19rZXksICJPQU0gbmVnb3RpYXRpb24gY29tcGxldGVkICglcyksIGZsYWdzICUwNHhcbiIsIGJjbW9zX3N0cmVycm9yKHJlc3VsdCksIGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2luamVjdF9mcmFtZShlb25fbGlua19rZXkqIGxpbmtfa2V5LCB1aW50MTZfdCBwYXlsb2FkX2xlbmd0aCwgdWludDhfdCAqcGF5bG9hZF9hZGRyKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lIGluamVjdF9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBlcG9uX2xpbmtfa2V5ID0gbGlua19rZXktPmxpbms7CisgICAgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIGZyYW1lID0KKyAgICAgICAgeworICAgICAgICAgICAgLmZyYW1lX29jdGV0cyA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLmxlbiA9IHBheWxvYWRfbGVuZ3RoLAorICAgICAgICAgICAgICAgIC52YWwgPSBwYXlsb2FkX2FkZHIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZpbmplY3RfZnJhbWUsIGVwb25fbGluaywgaW5qZWN0X2ZyYW1lLCBlcG9uX2xpbmtfa2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGZyYW1lLCBmcmFtZSk7CisgICAgcmMgPSBiY21vbHRfcHJveHlfc2VuZChsaW5rX2tleS0+ZGV2aWNlX2lkLCAmaW5qZWN0X2ZyYW1lLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBFT05fTElOS19MT0coRVJST1IsIGxpbmtfa2V5LCAiaW5qZWN0IG9wZXJhdGlvbiBmYWlsZWQgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2NsZWFyX3Byb3YoZW9uX2xpbmtfa2V5ICpsaW5rX2tleSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0gbGlua19rZXktPmxpbms7CisgICAgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3Agc3RvcF9vcGVyOworICAgIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyBoYl9jZmcgPSB7fTsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBsaW5rX2NmZzsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJnN0b3Bfb3BlciwgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AsIGtleSk7CisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGxpbmtfa2V5LT5kZXZpY2VfaWQsICZzdG9wX29wZXIuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGhiX2NmZy50cmFuc21pdF9mcmFtZS5sZW4gPSAwOworICAgIGhiX2NmZy50cmFuc21pdF9mcmFtZS52YWwgPSBOVUxMOworICAgIGhiX2NmZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbiA9IDA7CisgICAgaGJfY2ZnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMudmFsID0gTlVMTDsKKyAgICBoYl9jZmcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbiA9IDA7CisgICAgaGJfY2ZnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwgPSBOVUxMOworICAgIGhiX2NmZy5yZWNlaXZlX3RpbWVvdXQgPSA1OworICAgIGhiX2NmZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSA9IDA7CisgICAgQkNNT0xUX0NGR19JTklUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnLCBoYl9jZmcpOworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGxpbmtfa2V5LT5kZXZpY2VfaWQsICZsaW5rX2NmZy5oZHIpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fc2V0X29hbV9oZWFydGJlYXRfY29uZmlnKGNvbnN0IGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyBvYW1faGVhcnRiZWF0X2NvbmZpZyA9IHt9OworCisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcucmVjZWl2ZV90aW1lb3V0ID0gSEVBUlRCRUFUX1JFQ0VJVkVfVElNRU9VVDsKKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSA9IGxpbmtfc3RhdGUtPm1heF9wZHVfc2l6ZTsKKworICAgIC8qIFRoZSBCQ002ODYyMCBUWCBoZWFydGJlYXQgcHJvdmlzaW9uaW5nIGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpcnN0IDE1IGJ5dGVzIC0gU0EsIERBLCBFdGhlclR5cGUgb3IgU3VidHlwZSAqLworICAgIG9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lLnZhbCA9ICZsaW5rX3N0YXRlLT50eC5wYXlsb2FkW0hFQVJUQkVBVF9TRU5EX09GRlNFVF07CisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcudHJhbnNtaXRfZnJhbWUubGVuID0gbGlua19zdGF0ZS0+dHgubGVuZ3RoIC0gSEVBUlRCRUFUX1NFTkRfT0ZGU0VUOworCisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwgPSBsaW5rX3N0YXRlLT5yeC5wYXlsb2FkOworICAgIG9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuID0gbGlua19zdGF0ZS0+cngubGVuZ3RoOworCisgICAgLyogZm9yd2FyZCBPQU0gZnJhbWVzIHdpdGggYW55IGRpZmZlcmVuY2VzIHRvIHRoZSBob3N0ICovCisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IGJjbW9zX2NhbGxvYyhsaW5rX3N0YXRlLT5yeC5sZW5ndGgpOworICAgIGlmIChOVUxMICE9IG9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwpCisgICAgeworICAgICAgICBtZW1zZXQob2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCwgMHhGRiwgbGlua19zdGF0ZS0+cngubGVuZ3RoKTsKKyAgICAgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbiA9IGxpbmtfc3RhdGUtPnJ4Lmxlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgbGlua19jZmc7CisgICAgQkNNT0xUX0NGR19JTklUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBsaW5rX3N0YXRlLT5saW5rX2tleS5saW5rKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZywgb2FtX2hlYXJ0YmVhdF9jb25maWcpOworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQobGlua19zdGF0ZS0+bGlua19rZXkuZGV2aWNlX2lkLCAmbGlua19jZmcuaGRyKTsgLyogY2FsbCBBUEkgKi8KKworICAgIGJjbW9zX2ZyZWUob2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX3N0YXJ0X29hbV9oZWFydGJlYXQoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IF9lb25fc2V0X29hbV9oZWFydGJlYXRfY29uZmlnKGxpbmtfc3RhdGUpOworICAgIGlmIChCQ01fRVJSX09LID09IHJjKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgZW1iX2xpbmtfa2V5ID0gbGlua19zdGF0ZS0+bGlua19rZXkubGluazsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IHN0YXJ0X2hlYXJ0YmVhdF9vcDsKKyAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgmc3RhcnRfaGVhcnRiZWF0X29wLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQsIGVtYl9saW5rX2tleSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKAorICAgICAgICAgICAgJnN0YXJ0X2hlYXJ0YmVhdF9vcCwKKyAgICAgICAgICAgIGVwb25fbGluaywKKyAgICAgICAgICAgIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQsCisgICAgICAgICAgICBzZW5kX3BlcmlvZCwKKyAgICAgICAgICAgIEhFQVJUQkVBVF9TRU5EX1BFUklPRCk7CisgICAgICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGxpbmtfc3RhdGUtPmxpbmtfa2V5LmRldmljZV9pZCwgJnN0YXJ0X2hlYXJ0YmVhdF9vcC5oZHIpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJrZWVwYWxpdmUgc3RhcnQgb3BlcmF0aW9uIHN1Ym1pdCBmYWlsZWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiZmFpbGVkIHRvIHNldCBoZWFydGJlYXQgY29uZmlndXJhdGlvbiglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9zZW5kX2luZm9fZnJhbWUoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUpCit7CisgICAgZW9uX2ZyYW1lX2RhdGEgZnJhbWVfdHhfcmVxOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBidWlsZF90eF9pbmZvX2ZyYW1lKGxpbmtfc3RhdGUsICZmcmFtZV90eF9yZXEpOworICAgIGlmIChCQ01fRVJSX09LID09IHJjKQorICAgIHsKKyAgICAgICAgcmMgPSBfZW9uX2luamVjdF9mcmFtZSgmbGlua19zdGF0ZS0+bGlua19rZXksIGZyYW1lX3R4X3JlcS5sZW5ndGgsIGZyYW1lX3R4X3JlcS5wYXlsb2FkKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3N0YXRlLT5vYW1fdGltZXIsIE9BTV9USU1FT1VUX1VTKTsgLyogc3RhcnQgdGltZXIgZm9yIHJ4IGZyYW1lICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coV0FSTklORywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiZmFpbGVkIHRvIGluamVjdCBmcmFtZSAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICB9CisgICAgICAgIGJjbW9zX2ZyZWUoZnJhbWVfdHhfcmVxLnBheWxvYWQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fY29tcGxldGVfbmVnb3RpYXRpb24oZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIHVpbnQ4X3QgKnJ4X3BheWxvYWQsIHVpbnQxNl90IHJ4X2xlbmd0aCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBlb25fZnJhbWVfZGF0YSBmcmFtZV90eF9yZXE7CisKKyAgICByYyA9IGJ1aWxkX3R4X2luZm9fZnJhbWUobGlua19zdGF0ZSwgJmZyYW1lX3R4X3JlcSk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIGxpbmtfc3RhdGUtPnR4LnBheWxvYWQgPSBmcmFtZV90eF9yZXEucGF5bG9hZDsKKyAgICBsaW5rX3N0YXRlLT50eC5sZW5ndGggPSBmcmFtZV90eF9yZXEubGVuZ3RoOworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiU2V0dGluZyBUWCBwYXlsb2FkXG4iKTsKKworICAgIGxpbmtfc3RhdGUtPnJ4LnBheWxvYWQgPSBiY21vc19jYWxsb2MocnhfbGVuZ3RoKTsKKyAgICBpZiAoTlVMTCA9PSBsaW5rX3N0YXRlLT5yeC5wYXlsb2FkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIG1lbWNweShsaW5rX3N0YXRlLT5yeC5wYXlsb2FkLCByeF9wYXlsb2FkLCByeF9sZW5ndGgpOworICAgIGxpbmtfc3RhdGUtPnJ4Lmxlbmd0aCA9IHJ4X2xlbmd0aDsKKyAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlNldHRpbmcgUlggbWFza1xuIik7CisKKyAgICBpZiAobGlua19zdGF0ZS0+aXNfaGVhcnRiZWF0X2F1dG9zdGFydCkKKyAgICB7CisgICAgICAgIHJjID0gX2Vvbl9zdGFydF9vYW1faGVhcnRiZWF0KGxpbmtfc3RhdGUpOworICAgICAgICBFT05fTElOS19MT0coSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic3RhcnQgT0FNIGhlYXJ0YmVhdDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorICAgIGxpbmtfc3RhdGUtPmNhbGxiYWNrKGxpbmtfc3RhdGUtPmNvbnRleHQsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgcmMpOworICAgIF9lb25fZGVzdHJveV9saW5rX3N0YXRlKGxpbmtfc3RhdGUpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXJfZnJhbWVfcngoY29uc3QgZW9uX2V2ZW50KiBldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmV2ZW50LT5saW5rLT5saW5rX2tleSwgInJlY2VpdmVkICV1LWJ5dGUgZnJhbWUgYmVnaW5uaW5nIGF0ICVwXG4iLAorICAgICAgICAgICAgICAgICBldmVudC0+ZGF0YS5mcmFtZV9yeC5sZW5ndGgsIGV2ZW50LT5kYXRhLmZyYW1lX3J4LnBheWxvYWQpOworCisgICAgLyogdmFsaWRhdGVzIGZyYW1lLCB1cGRhdGVzIGZsYWdzICovCisgICAgcmMgPSBoYW5kbGVfcnhfaW5mb19mcmFtZShldmVudC0+bGluaywgZXZlbnQtPmRhdGEuZnJhbWVfcngubGVuZ3RoLCBldmVudC0+ZGF0YS5mcmFtZV9yeC5wYXlsb2FkKTsKKyAgICBzd2l0Y2ggKHJjKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01fRVJSX09LOiAvKiBDb21wbGV0ZWQgTmVnb3RpYXRpb24gKi8KKyAgICAgICAgICAgIHJjID0gX2Vvbl9jb21wbGV0ZV9uZWdvdGlhdGlvbihldmVudC0+bGluaywgZXZlbnQtPmRhdGEuZnJhbWVfcngucGF5bG9hZCwgZXZlbnQtPmRhdGEuZnJhbWVfcngubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTV9FUlJfSU5fUFJPR1JFU1M6CisgICAgICAgICAgICByYyA9IF9lb25fc2VuZF9pbmZvX2ZyYW1lKGV2ZW50LT5saW5rKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTV9FUlJfUEFSU0U6CisgICAgICAgICAgICBFT05fTElOS19MT0coSU5GTywgJmV2ZW50LT5saW5rLT5saW5rX2tleSwgInJlY2VpdmVkIG5vbiBpbmZvIGZyYW1lOyBpZ25vcmluZ1xuIik7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfT0s7IC8qIC4uLmFuZCBrZWVwIHJ1bm5pbmcgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9ldmVudF9oYW5kbGVyX3N0YXJ0KGNvbnN0IGVvbl9ldmVudCogZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IF9lb25fY2xlYXJfcHJvdigmZXZlbnQtPmxpbmstPmxpbmtfa2V5KTsKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSByYykKKyAgICB7CisgICAgICAgIGV2ZW50LT5saW5rLT5vYW1fc3RhdGUgPSBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkc7CisgICAgICAgIHJjID0gX2Vvbl9zZW5kX2luZm9fZnJhbWUoZXZlbnQtPmxpbmspOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXJfc3RvcChjb25zdCBlb25fZXZlbnQqIGV2ZW50KQoreworICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAiT0FNIHN0b3AgY29tbWFuZCByZWNlaXZlZFxuIik7CisgICAgX2Vvbl9kZXN0cm95X2xpbmtfc3RhdGUoZXZlbnQtPmxpbmspOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9ldmVudF9oYW5kbGVyX29hbV90aW1lcl9leHBpcmUoY29uc3QgZW9uX2V2ZW50KiBldmVudCkKK3sKKyAgICBFT05fTElOS19MT0coV0FSTklORywgJmV2ZW50LT5saW5rLT5saW5rX2tleSwgIk9BTSB0aW1lciBleHBpcmVkXG4iKTsKKyAgICByZXR1cm4gQkNNX0VSUl9USU1FT1VUOworfQorCitzdGF0aWMgY29uc3QgZW9uX2V2ZW50X2hhbmRsZXIgZXZlbnRfc21bRU9OX0VWRU5UX1RZUEVfQ09VTlRdID0KK3sKKyAgICBbRU9OX0VWRU5UX1RZUEVfRlJBTUVfUlhdID0gX2Vvbl9ldmVudF9oYW5kbGVyX2ZyYW1lX3J4LAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUQVJUXSA9IF9lb25fZXZlbnRfaGFuZGxlcl9zdGFydCwKKyAgICBbRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVE9QXSA9IF9lb25fZXZlbnRfaGFuZGxlcl9zdG9wLAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fVElNRVJfRVhQSVJFXSA9IF9lb25fZXZlbnRfaGFuZGxlcl9vYW1fdGltZXJfZXhwaXJlCit9OworCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9ldmVudF9oYW5kbGVyKGNvbnN0IGVvbl9ldmVudCogZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgaWYgKGV2ZW50LT50eXBlIDwgRU9OX0VWRU5UX1RZUEVfQ09VTlQpCisgICAgeworICAgICAgICBFT05fTElOS19MT0coREVCVUcsICZldmVudC0+bGluay0+bGlua19rZXksICJldmVudCAlc1xuIiwgX2V2bmFtZVtldmVudC0+dHlwZV0pOworICAgICAgICByYyA9IGV2ZW50X3NtW2V2ZW50LT50eXBlXShldmVudCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgJmV2ZW50LT5saW5rLT5saW5rX2tleSwgInVua25vd24gZXZlbnQgJWRcbiIsIGV2ZW50LT50eXBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9lb25fZXZlbnRfZGlzcGF0Y2goY29uc3QgZW9uX2V2ZW50KiBldmVudF9pbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gX2Vvbl9ldmVudF9oYW5kbGVyKGV2ZW50X2luKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGV2ZW50X2luLT5saW5rLT5jYWxsYmFjayhldmVudF9pbi0+bGluay0+Y29udGV4dCwgJmV2ZW50X2luLT5saW5rLT5saW5rX2tleSwgcmMpOworICAgICAgICBfZW9uX2Rlc3Ryb3lfbGlua19zdGF0ZShldmVudF9pbi0+bGluayk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgX2Vvbl9vYW1fdGltZXJfZXhwaXJlKGJjbW9zX3RpbWVyKiB0aW1lciwgbG9uZyBwVXNlcikKK3sKKyAgICBlb25fZXZlbnQgZXZlbnQgPSB7IC50eXBlID0gRU9OX0VWRU5UX1RZUEVfT0FNX1RJTUVSX0VYUElSRSwgLmxpbmsgPSAoZW9uX2xpbmtfc3RhdGUgKilwVXNlciB9OworCisgICAgX2Vvbl9ldmVudF9kaXNwYXRjaCgmZXZlbnQpOworCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9jcmVhdGVfbGlua19zdGF0ZSgKKyAgICBlb25fbGlua19zdGF0ZSAqKnN0YXRlLAorICAgIGVvbl9saW5rX2tleSogbGlua19rZXksCisgICAgZW9uX29hbV9zZXRfaWQgb2FtX3NldCwKKyAgICBiY21vbHRfZW9uX3Jlc3VsdF9jYiBjYiwKKyAgICB2b2lkICpjb250ZXh0LAorICAgIGJjbW9zX2Jvb2wgaXNfaGVhcnRiZWF0X2F1dG9zdGFydCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZTsKKworICAgIGxpbmtfc3RhdGUgPSBfZW9uX2ZpbmRfbGlua19zdGF0ZShsaW5rX2tleSk7CisgICAgaWYgKGxpbmtfc3RhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgbGlua19rZXksICJPQU0gbmVnb3RpYXRpb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzc1xuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorCisgICAgbGlua19zdGF0ZSA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmxpbmtfc3RhdGUpKTsKKyAgICBpZiAobGlua19zdGF0ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCBsaW5rX2tleSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdGF0ZSByZWNvcmRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9uaV9rZXkgbmlfa2V5ID0geyAuZXBvbl9uaSA9IGxpbmtfa2V5LT5saW5rLmVwb25fbmkgfTsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgbmlfY2ZnOworCisgICAgQkNNT0xUX0NGR19JTklUKCZuaV9jZmcsIGVwb25fbmksIG5pX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmbmlfY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7CisgICAgcmMgPSBiY21vbHRfY2ZnX2dldChsaW5rX2tleS0+ZGV2aWNlX2lkLCAmbmlfY2ZnLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgPT0gcmMpCisgICAgeworICAgICAgICBsaW5rX3N0YXRlLT5lcG9uX25pX21hY19hZGRyID0gbmlfY2ZnLmRhdGEubWFjX2FkZHJlc3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgbGlua19rZXksICJGYWlsZWQgdG8gcmV0cmlldmUgRVBPTiBOSSBNQUMgYWRkcmVzczogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIGJjbW9zX2ZyZWUobGlua19zdGF0ZSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBiY21vc190aW1lcl9wYXJtIHRpbWVyX3NwZWMgPQorICAgIHsKKyAgICAgICAgLm93bmVyICAgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIGxpbmtfa2V5LT5kZXZpY2VfaWQsCisgICAgICAgIC5oYW5kbGVyID0gX2Vvbl9vYW1fdGltZXJfZXhwaXJlLAorICAgICAgICAuZGF0YSAgICA9IChsb25nKWxpbmtfc3RhdGUKKyAgICB9OworICAgIHJjID0gYmNtb3NfdGltZXJfY3JlYXRlKCZsaW5rX3N0YXRlLT5vYW1fdGltZXIsICZ0aW1lcl9zcGVjKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgbGlua19rZXksICJGYWlsZWQgdG8gY3JlYXRlIHRpbWVyOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGxpbmtfc3RhdGUtPmxpbmtfa2V5ID0gKmxpbmtfa2V5OworICAgIGxpbmtfc3RhdGUtPmNhbGxiYWNrID0gY2IgPyBjYiA6IF9lb25fZGVmYXVsdF9jYWxsYmFja19mbjsKKyAgICBsaW5rX3N0YXRlLT5jb250ZXh0ID0gY29udGV4dDsKKyAgICBsaW5rX3N0YXRlLT5pc19oZWFydGJlYXRfYXV0b3N0YXJ0ID0gaXNfaGVhcnRiZWF0X2F1dG9zdGFydDsKKyAgICBsaW5rX3N0YXRlLT5vYW1fc2V0ID0gb2FtX3NldDsKKyAgICBsaW5rX3N0YXRlLT5tYXhfcGR1X3NpemUgPSAxNTM2OworCisgICAgUkJfSU5TRVJUKGxpbmtfc3RhdGVfbWFwLCAmZW9uX3N0YXRlW2xpbmtfa2V5LT5kZXZpY2VfaWRdLmxpbmtfc3RhdGVfbWFwLCBsaW5rX3N0YXRlKTsKKworICAgICpzdGF0ZSA9IGxpbmtfc3RhdGU7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2Vvbl90YXNrX3Byb2Nlc3NfcngoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgY29uc3QgYmNtb2x0X3Byb3h5X3J4ICpyeCkKK3sKKyAgICBlb25fZXZlbnQgZXZlbnQgID0geyAudHlwZSA9IEVPTl9FVkVOVF9UWVBFX0ZSQU1FX1JYIH07CisKKyAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSogZXBvbl9saW5rX2tleSA9IChjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSopKHJ4ICsgMSk7CisgICAgZW9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZGV2aWNlX2lkID0gZGV2aWNlX2lkLCAubGluayA9ICplcG9uX2xpbmtfa2V5IH07CisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUgPSBfZW9uX2ZpbmRfbGlua19zdGF0ZSgmbGlua19rZXkpOworCisgICAgaWYgKGxpbmtfc3RhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfa2V5LCAiZm91bmQgZXhpc3RpbmcgbGlua1xuIik7CisgICAgICAgIGNvbnN0IGJjbW9sdF91OF9saXN0X3UzMiBmcmFtZSA9ICgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopcngpLT5kYXRhLmZyYW1lOworICAgICAgICBldmVudC5saW5rID0gbGlua19zdGF0ZTsKKyAgICAgICAgZXZlbnQuZGF0YS5mcmFtZV9yeC5wYXlsb2FkID0gZnJhbWUudmFsOworICAgICAgICBldmVudC5kYXRhLmZyYW1lX3J4Lmxlbmd0aCAgPSBmcmFtZS5sZW47CisgICAgICAgIF9lb25fZXZlbnRfZGlzcGF0Y2goJmV2ZW50KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19rZXksICJyeCBvbiB1bmtub3duIGxpbmtcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX2Vvbl9oYW5kbGVfcHJveHlfcngoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZW9uX3Rhc2tfbXNnICptc2cgPSAoZW9uX3Rhc2tfbXNnKilvc19tc2c7CisKKyAgICBfZW9uX3Rhc2tfcHJvY2Vzc19yeChvc19tc2ctPmluc3RhbmNlLCBtc2ctPmRhdGEucHJveHlfcngucngpOworCisgICAgYmNtb2x0X21zZ19mcmVlKCZtc2ctPmRhdGEucHJveHlfcngucngtPmhkcik7IC8qIGZyZWUgY2xvbmVkIGluZGljYXRpb24gKi8KKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9lb25faGFuZGxlX3N0YXJ0KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKQoreworICAgIGVvbl90YXNrX21zZyAqbXNnID0gKGVvbl90YXNrX21zZyopb3NfbXNnOworICAgIGVvbl9saW5rX2tleSBsaW5rX2tleSA9IHsgLmRldmljZV9pZCA9IG9zX21zZy0+aW5zdGFuY2UsIC5saW5rID0gbXNnLT5kYXRhLnN0YXJ0Lmxpbmtfa2V5IH07CisgICAgZW9uX2V2ZW50IGV2ZW50ID0geyAudHlwZSA9IEVPTl9FVkVOVF9UWVBFX09BTV9ORUdfU1RBUlQgfTsKKworICAgIGlmIChCQ01fRVJSX09LID09IF9lb25fY3JlYXRlX2xpbmtfc3RhdGUoCisgICAgICAgICZldmVudC5saW5rLAorICAgICAgICAmbGlua19rZXksCisgICAgICAgIG1zZy0+ZGF0YS5zdGFydC5vYW1fc2V0LAorICAgICAgICBtc2ctPmRhdGEuc3RhcnQuY2IsCisgICAgICAgIG1zZy0+ZGF0YS5zdGFydC5jb250ZXh0LAorICAgICAgICBtc2ctPmRhdGEuc3RhcnQuaXNfaGVhcnRiZWF0X2F1dG9zdGFydCkpCisgICAgeworICAgICAgICBfZW9uX2V2ZW50X2Rpc3BhdGNoKCZldmVudCk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShvc19tc2cpOworfQorCitzdGF0aWMgdm9pZCBfZW9uX2hhbmRsZV9zdG9wKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKQoreworICAgIGVvbl90YXNrX21zZyAqbXNnID0gKGVvbl90YXNrX21zZyopb3NfbXNnOworICAgIGVvbl9saW5rX2tleSBsaW5rX2tleSA9IHsgLmRldmljZV9pZCA9IG9zX21zZy0+aW5zdGFuY2UsIC5saW5rID0gbXNnLT5kYXRhLnN0b3AubGlua19rZXkgfTsKKyAgICBlb25fZXZlbnQgZXZlbnQgPSB7IC50eXBlID0gRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVE9QLCAubGluayA9IF9lb25fZmluZF9saW5rX3N0YXRlKCZsaW5rX2tleSkgfTsKKworICAgIGlmIChOVUxMICE9IGV2ZW50LmxpbmspCisgICAgeworICAgICAgICBfZW9uX2V2ZW50X2Rpc3BhdGNoKCZldmVudCk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShvc19tc2cpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9jbWRfc3RhcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgZW9uX3Rhc2tfbXNnX2RhdGEgbXNnX2RhdGE7CisKKyAgICBtc2dfZGF0YS5zdGFydC5saW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBtc2dfZGF0YS5zdGFydC5saW5rX2tleS5tYWNfYWRkcmVzcyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKyAgICBtc2dfZGF0YS5zdGFydC5vYW1fc2V0ID0gKGVvbl9vYW1fc2V0X2lkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9zZXQiKS0+dmFsdWUuZW51bV92YWw7CisgICAgbXNnX2RhdGEuc3RhcnQuY2IgPSBOVUxMOworICAgIG1zZ19kYXRhLnN0YXJ0LmNvbnRleHQgPSBOVUxMOworICAgIG1zZ19kYXRhLnN0YXJ0LmlzX2hlYXJ0YmVhdF9hdXRvc3RhcnQgPSBCQ01PU19UUlVFOworCisgICAgcmMgPSBfZW9uX3NlbmRfb3NfbXNnKGN1cnJlbnRfZGV2aWNlLCBCQ01PU19NU0dfSURfRU9OX1NUQVJULCAmbXNnX2RhdGEpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9jbWRfc3RvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVvbl90YXNrX21zZ19kYXRhIG1zZ19kYXRhOworCisgICAgbXNnX2RhdGEuc3RvcC5saW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBtc2dfZGF0YS5zdG9wLmxpbmtfa2V5Lm1hY19hZGRyZXNzID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworCisgICAgcmMgPSBfZW9uX3NlbmRfb3NfbXNnKGN1cnJlbnRfZGV2aWNlLCBCQ01PU19NU0dfSURfRU9OX1NUT1AsICZtc2dfZGF0YSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fY21kX3Nob3coCisgICAgYmNtY2xpX3Nlc3Npb24gICAgICAgICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSAgcGFybVtdLAorICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgbl9wYXJtcykKK3sKKyAgICBlb25fbGlua19zdGF0ZSogICBsaW5rX3N0YXRlOworICAgIGJjbW9zX2Jvb2wgICAgICAgICAgbm9fbGlua3MgPSBCQ01PU19UUlVFOworCisgICAgUkJfRk9SRUFDSChsaW5rX3N0YXRlLCBsaW5rX3N0YXRlX21hcCwgJmVvbl9zdGF0ZVtjdXJyZW50X2RldmljZV0ubGlua19zdGF0ZV9tYXApCisgICAgeworICAgICAgICBub19saW5rcyA9IEJDTU9TX0ZBTFNFOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0+ICAiTElOS19LRVlfRk1UX1NUUiIgIE9BTSBzZXQgJXUgICBzdGF0ZSAlMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5LX0tFWV9EQVRBKCZsaW5rX3N0YXRlLT5saW5rX2tleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfc3RhdGUtPm9hbV9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSk7CisgICAgfQorICAgIGlmIChub19saW5rcykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJubyBsaW5rc1xuIik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vvbl9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gImVvbiI7CisKKyAgICBpZiAoYmNtY2xpX2Rpcl9maW5kKHRvcF9kaXIsIGRpcl9uYW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBiY21jbGlfZW50cnkgKmRpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUE9OIE9BTSBuZWdvdGlhdGlvbiBjb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCVUdfT04oZGlyID09IE5VTEwpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hvdyBjdXJyZW50IEVPTiBjb25maWd1cmF0aW9uIGFuZCBzdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW9uX2NtZF9zaG93KTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsCisgICAgICAgICAgICAgICAgICAgICJzdGFydF9vYW1fbmVnb3RpYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAiU3RhcnQgT0FNIG5lZ290aWF0aW9uIGZvciBhbiBFUE9OIGxpbmsiLAorICAgICAgICAgICAgICAgICAgICBfZW9uX2NtZF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAiTUFDIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9NQUMsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgib2FtX3NldCIsICJPQU0gc2V0IiwgZW9uX29hbV9zZXRfaWRfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkpOworCisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLAorICAgICAgICAgICAgICAgICAgICAic3RvcF9vYW1fbmVnb3RpYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAiU3RvcCBpbiBwcm9ncmVzcyBPQU0gbmVnb3RpYXRpb24gZm9yIGFuIEVQT04gbGluayIsCisgICAgICAgICAgICAgICAgICAgIF9lb25fY21kX3N0b3AsCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAiTUFDIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9NQUMsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkgKTsKK30KKworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZW9uX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChlcG9uX29hbV9uZWdfcnVubmluZykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAwOyBkZXZpY2UgPCBCQ01UUl9NQVhfT0xUUzsgZGV2aWNlKyspCisgICAgeworICAgICAgICByYyA9IF9lb25faW5pdF90YXNrKGRldmljZSk7CisgICAgICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKworICAgICAgICByYyA9IF9lb25faW5pdF9tb2R1bGUoZGV2aWNlKTsKKyAgICAgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgICAgIGNoYXIgbG9nX25hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV07CisgICAgICAgIHNucHJpbnRmKGxvZ19uYW1lLCBzaXplb2YobG9nX25hbWUpLCAidXNlcl9hcHBsX2VvbiV1IiwgZGV2aWNlKTsKKyAgICAgICAgZW9uX3N0YXRlW2RldmljZV0ubG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworCisgICAgICAgIGJjbW9zX21zZ19yZWdpc3RlcigKKyAgICAgICAgICAgIEJDTU9TX01TR19JRF9FT05fU1RBUlQsCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIGRldmljZSwKKyAgICAgICAgICAgIF9lb25faGFuZGxlX3N0YXJ0KTsKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0VPTl9TVE9QLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FT04gKyBkZXZpY2UsCisgICAgICAgICAgICBfZW9uX2hhbmRsZV9zdG9wKTsKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0VPTl9QUk9YWV9SWCwKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OICsgZGV2aWNlLAorICAgICAgICAgICAgX2Vvbl9oYW5kbGVfcHJveHlfcngpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHN0YXRlIG1hcAorICAgICAgICBSQl9JTklUKCZlb25fc3RhdGVbZGV2aWNlXS5saW5rX3N0YXRlX21hcCk7CisgICAgfQorCisgICAgZXBvbl9vYW1fbmVnX3J1bm5pbmcgPSBCQ01PU19UUlVFOworfQorCisvLyBwdWJsaWMgaW5kaWNhdGlvbiBoYW5kbGVyIGludGVyZmFjZSAtLSBjYWxsZWQgaW4gdHJhbnNwb3J0IGxheWVyIGNvbnRleHQKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfZW9uX3Byb2Nlc3NfcngoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X3Byb3h5X3J4ICpyeCkKK3sKKyAgICAgYmNtb3NfZXJybm8gcmM7CisgICAgIGVvbl90YXNrX21zZ19kYXRhIG1zZ19kYXRhID0ge307CisKKyAgICAgLyogTm90IHJ1bm5pbmcgLS0+IHNpbGVudGx5IGlnbm9yZSAgKi8KKyAgICAgaWYgKCFlcG9uX29hbV9uZWdfcnVubmluZykKKyAgICAgeworICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgIH0KKworICAgICAvKiBOb3Qgb3VyIG1lc3NhZ2UgLS0+IHNpbGVudHkgaWdub3JlICovCisgICAgIGlmICggKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LICE9IHJ4LT5oZHIub2JqX3R5cGUpIHx8CisgICAgICAgICAgKEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQgIT0gcngtPmhkci5zdWJncm91cCkgKQorICAgICB7CisgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgfQorCisgICAgIC8qIFRoaXMgaXMgc29tZXRoaW5nIHRoaXMgYXBwbGljYXRpb24gZG9lcyBjYXJlIGFib3V0IC0gc28gY2xvbmUgdGhlIG1lc3NhZ2UgaW50bworICAgICAgICBuZXdseS1hbGxvY2F0ZWQgbWVtb3J5IHNvIHdlIGNhbiBoYW5kbGUgaXQgYWZ0ZXIgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgaGFzIGJlZW4gZnJlZWQgKi8KKyAgICAgcmMgPSBiY21vbHRfbXNnX2Nsb25lKChiY21vbHRfbXNnKiopJm1zZ19kYXRhLnByb3h5X3J4LnJ4LCAmcngtPmhkcik7CisgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICB7CisgICAgICAgICBFT05fTE9HKEVSUk9SLCBkZXZpY2VfaWQsICJNZXNzYWdlIGNsb25lIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICByZXR1cm4gcmM7CisgICAgIH0KKworICAgICByYyA9IF9lb25fc2VuZF9vc19tc2coZGV2aWNlX2lkLCBCQ01PU19NU0dfSURfRU9OX1BST1hZX1JYLCAmbXNnX2RhdGEpOworICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgeworICAgICAgICAgYmNtb2x0X21zZ19mcmVlKCZtc2dfZGF0YS5wcm94eV9yeC5yeC0+aGRyKTsKKyAgICAgfQorICAgICByZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9lb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9lb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTNmY2QxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX0VPTl9IXworI2RlZmluZSBfQkNNT0xUX0VPTl9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCisvKiB1bmlxdWVseSBpZGVudGlmaWVzIHNwZWNpZmljIEVQT04gbGlua3MgdW5kZXIgbWFuYWdlbWVudCBieSB0aGlzIGFwcGxpY2F0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgICBiY21vbHRfZGV2aWQgICAgICAgICAgZGV2aWNlX2lkOworICAgICBiY21vbHRfZXBvbl9saW5rX2tleSAgbGluazsKK30gZW9uX2xpbmtfa2V5OworCit0eXBlZGVmIGVudW0KK3sKKyAgICAgRU9OX09BTV9TRVRfSURfRFBPRSwKKyAgICAgRU9OX09BTV9TRVRfSURfQlJDTSwKKyAgICAgRU9OX09BTV9TRVRfSURfQ1RDLAorCisgICAgIEVPTl9PQU1fU0VUX0lEX0NPVU5UCit9IGVvbl9vYW1fc2V0X2lkOworCisvKiBzaWduYXR1cmUgb2Ygb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCB0byByZXBvcnQgb3V0Y29tZXMgb2YgT0FNIG5lZ290aWF0aW9ucyAqLwordHlwZWRlZiB2b2lkICgqYmNtb2x0X2Vvbl9yZXN1bHRfY2IpKHZvaWQgKmNvbnRleHQsIGNvbnN0IGVvbl9saW5rX2tleSAqbGlua19rZXksIGJjbW9zX2Vycm5vIHJlc3VsdCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXk7CisgICAgZW9uX29hbV9zZXRfaWQgb2FtX3NldDsKKyAgICBiY21vbHRfZW9uX3Jlc3VsdF9jYiBjYjsKKyAgICB2b2lkICpjb250ZXh0OworICAgIGJjbW9zX2Jvb2wgaXNfaGVhcnRiZWF0X2F1dG9zdGFydDsKK30gZW9uX3Rhc2tfc3RhcnRfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleTsKK30gZW9uX3Rhc2tfc3RvcF9kYXRhOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9wcm94eV9yeCAqcng7Cit9IGVvbl90YXNrX3Byb3h5X3J4X2RhdGE7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBlb25fdGFza19zdGFydF9kYXRhIHN0YXJ0OworICAgIGVvbl90YXNrX3N0b3BfZGF0YSBzdG9wOworICAgIGVvbl90YXNrX3Byb3h5X3J4X2RhdGEgcHJveHlfcng7Cit9IGVvbl90YXNrX21zZ19kYXRhOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX21zZyBvc19tc2c7CisgICAgZW9uX3Rhc2tfbXNnX2RhdGEgZGF0YTsKK30gZW9uX3Rhc2tfbXNnOworCisvLyBpbml0aWFsaXplIHRoZSBFUE9OIE9BTSBuZWdvdGlhdGlvbiBhcHBsaWNhdGlvbiAoc2hvdWxkIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIHVzZXIgYXBwbGljYXRpb24gc3RhcnR1cCkKK2V4dGVybiB2b2lkIGJjbW9sdF91c2VyX2FwcGxfZW9uX2luaXQodm9pZCk7CisKKy8vIHByb2Nlc3MgYSBwcm94eSByeAorYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9lb25fcHJvY2Vzc19yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfcHJveHlfcnggKnByb3h5X3J4KTsKKworLy8gaW5pdGlhbGl6ZSBFT04gQ0xJCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZW9uX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbl9wcml2YXRlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDBiNDUzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbl9wcml2YXRlLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0JDTU9MVF9FT05fUFJJVkFURV9IXworCisvKiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKKyAgIHggVGhpcyBmaWxlIGlzIGZvciBpbnRlcm5hbCB1c2Ugd2l0aGluIHRoZSBFUE9OIE9BTSBuZWdvdGlhdGlvbiBhcHBsaWNhdGlvbi4geAorICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4CisgICB4IE91dHNpZGUgY29kZSBzaG91bGQgbm90IHJlZmVyIHRvIGFueXRoaW5nIGRlZmluZWQgb3IgZGVjbGFyZWQgaGVyZWluISAgICAgIHgKKyAgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCAqLworCisjaW5jbHVkZSAiYmNtb2x0X2Vvbi5oIiAvKiB0aGUgcHJpdmF0ZSBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUgcHVibGljIGludGVyZmFjZSAqLworI2luY2x1ZGUgImJjbW9sdF9lcG9uX29hbV90eXBlcy5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCogcGF5bG9hZDsgLyogcGF5bG9hZCBieXRlcyBpbiBbREEsRkNTKSAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyogZnJhbWUgbGVuZ3RoIGZyb20gREEgdG8ganVzdCBiZWZvcmUgRkNTICovCit9IGVvbl9mcmFtZV9kYXRhOworCisvKiBtYXAgY29udGFpbmluZyBzdGF0ZSBvZiBhbGwgRVBPTiBsaW5rcyB3aXRoIE9BTSBuZWdvdGlhdGlvbiB1bmRlcndheSBvciBjb21wbGV0ZWQgKi8KK3R5cGVkZWYgc3RydWN0IGVvbl9saW5rX3N0YXRlIGVvbl9saW5rX3N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgbGlua19zdGF0ZV9tYXAgbGlua19zdGF0ZV9tYXA7CitSQl9IRUFEKGxpbmtfc3RhdGVfbWFwLCBlb25fbGlua19zdGF0ZSk7CisKK3N0cnVjdCBlb25fbGlua19zdGF0ZQoreworICAgIGVvbl9saW5rX2tleSAgICAgICAgICAgICAgICAgbGlua19rZXk7ICAgICAgICAgICAgICAgICAgLyogZ2xvYmFsbHkgdW5pcXVlIG9wYXF1ZSBlbnRpdHkgaWQgKi8KKyAgICBiY21vc190aW1lciAgICAgICAgICAgICAgICAgIG9hbV90aW1lcjsgICAgICAgICAgICAgICAgIC8qIHRpbWVyIHVzZWQgd2hlbiBhd2FpdGluZyBvYW0gcmVzcG9uc2VzICovCisgICAgZW9uX29hbV9zZXRfaWQgICAgICAgICAgICAgICBvYW1fc2V0OyAgICAgICAgICAgICAgICAgICAvKiBPQU0gc2V0IGFwcGxpY2FibGUgdG8gdGhlIGxpbmsgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzICAgIG9hbV9zdGF0ZTsgICAgICAgICAgICAgICAgIC8qIE9BTSBsaW5rIG5lZ290aWF0aW9uIHN0YXRlICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjsgICAgICAgICAgICAgICAgICAvKiBMb2NhbCByZXZpc2lvbiAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgbWF4X3BkdV9zaXplOyAgICAgICAgICAgICAgLyogbWF4IFBEVSBzaXplICovCisgICAgYmNtb2x0X2Vvbl9yZXN1bHRfY2IgICAgICAgICBjYWxsYmFjazsgICAgICAgICAgICAgICAgICAvKiBjYWxsYmFjayB3aGVuIG5lZ290aWF0aW9uIGlzIGNvbXBsZXRlICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dDsgICAgICAgICAgICAgICAgICAvKiBjb250ZXh0IGZvciB0aGUgYWJvdmUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gcmVtb3RlX2luZm87ICAgICAgICAgIC8qIHByZXZpb3VzIFRMViByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUgKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyAgICAgICAgICAgIGVwb25fbmlfbWFjX2FkZHI7ICAgICAgICAgIC8qIE1BQyBhZGRyZXNzIHRvIHVzZSBmb3IgU0Egb2YgZWdyZXNzIE9BTSBmcmFtZXMgKi8KKyAgICBlb25fZnJhbWVfZGF0YSAgICAgICAgICAgICAgIHJ4OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmFsIHJlY2VpdmVkIE9BTSAqLworICAgIGVvbl9mcmFtZV9kYXRhICAgICAgICAgICAgICAgdHg7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmluYWwgc2VudCBPQU0gKi8KKyAgICBiY21vc19ib29sICAgICAgICAgICAgICAgICAgIGlzX2hlYXJ0YmVhdF9hdXRvc3RhcnQ7ICAgIC8qIHN0YXJ0IGhlYXJ0YmVhdCB1cG9uIHN1Y2Nlc3NmdWwgbmVnb3RpYXRpb24gY29tcGxldGlvbiAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqb3JnX3NwZWNfc3RhdGU7ICAgICAgICAgICAgLyogU3RhdGUgc3BlY2lmaWMgdG8gdGhlIHNlbGVjdGVkIE9BTSBzZXQgKi8KKyAgICBSQl9FTlRSWShlb25fbGlua19zdGF0ZSkgICAgIHJiX2VudHJ5OworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgY2hhciB0YXNrX25hbWVbTUFYX1RBU0tfTkFNRV9TSVpFXTsKKyAgICBjaGFyIG1zZ19xdWV1ZV9uYW1lW01BWF9NU0dfUVVFVUVfTkFNRV9TSVpFXTsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKKyAgICBsaW5rX3N0YXRlX21hcCBsaW5rX3N0YXRlX21hcDsKK30gZW9uX2dsb2JhbF9zdGF0ZTsKKworI2RlZmluZSBMSU5LX0tFWV9GTVRfU1RSICJQT04gJXUsICJCQ01PU19NQUNBRERSX0ZNVF9TVFIKKyNkZWZpbmUgTElOS19LRVlfREFUQShsa2V5KSAobGtleSktPmxpbmsuZXBvbl9uaSwgQkNNT1NfTUFDQUREUl9QQVJBTVMoJihsa2V5KS0+bGluay5tYWNfYWRkcmVzcykKKworI2RlZmluZSBFT05fTE9HKGxldmVsLCBkZXZpY2UsIGZvcm1hdCwgYXJncy4uLikgQkNNX0xPRyhsZXZlbCwgZW9uX3N0YXRlW2RldmljZV0ubG9nX2lkLCBmb3JtYXQsICMjYXJncykKKyNkZWZpbmUgRU9OX0xJTktfTE9HKGxldmVsLCBsaW5rX2tleSwgZm10LCBhcmdzLi4uKSBcCisgICAgQkNNX0xPRyhsZXZlbCwgZW9uX3N0YXRlWyhsaW5rX2tleSktPmRldmljZV9pZF0ubG9nX2lkLCBMSU5LX0tFWV9GTVRfU1RSIjogImZtdCwgTElOS19LRVlfREFUQShsaW5rX2tleSksICMjYXJncykKKworZXh0ZXJuIGVvbl9nbG9iYWxfc3RhdGUgZW9uX3N0YXRlW0JDTVRSX01BWF9PTFRTXTsKKworI2VuZGlmIC8vIF9CQ01PTFRfRU9OX1BSSVZBVEVfSF8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2JyY20vYnJjbS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvYnJjbS9icmNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxNzBmNgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2JyY20vYnJjbS5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBzcGVjaWZpYyB0byBCUkNNIE9BTS4gKi8KKworI2luY2x1ZGUgImJjbW9sdF9lb25fcHJpdmF0ZS5oIgorI2luY2x1ZGUgIi4uL29hbV9jb21tb24uaCIKKyNpbmNsdWRlICJicmNtLmgiCisKKy8qIE9yZyBzcGVjaWZpYyBUTFYgdG8gc2VuZCB0byB0aGUgT05VICovCitzdGF0aWMgY29uc3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIGJyY21fdHhfdGx2ID0KK3sKKyAgICAub3VpID0gQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSywKKyAgICAudSA9CisgICAgeworICAgICAgICAudGVrID0KKyAgICAgICAgeworICAgICAgICAgICAgLnRsdnMgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC50eXBlID0gQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JULAorICAgICAgICAgICAgICAgIC51ID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC5leHRlbnNpb25fc3VwcG9ydCA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBvcnRfbW9kZSA9IEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVTX1RFS05PVlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgLnByZWZlcnJlZF9yZXBvcnRfbW9kZSA9IEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVTX1RFS05PVlVTCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCit2b2lkIGJyY21fdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKQoreworICAgIGlmIChMT0NBTF9TVEFCTEVfUkVNT1RFX1NUQUJMRSA9PSBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpCisgICAgeworICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM7CisgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUgPSBicmNtX3R4X3RsdjsKKyAgICAgICAgb2FtLT51LmluZm8udGx2c19jb3VudCsrOworICAgIH0KK30KKwordm9pZCBicmNtX3J4X3RsdigKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwKKyAgICBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjLAorICAgIGJjbW9zX2Vycm5vICpyYykKK3sKKyAgICBpZiAobGlua19zdGF0ZS0+b2FtX3N0YXRlID09IExPQ0FMX1NUQUJMRV9SRU1PVEVfU1RBQkxFKQorICAgIHsKKyAgICAgICAgaWYgKChOVUxMID09IG9yZ19zcGVjKSB8fAorICAgICAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUsgIT0gb3JnX3NwZWMtPm91aSkgfHwKKyAgICAgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfRVhURU5TSU9OX1NVUFBPUlQgIT0gb3JnX3NwZWMtPnUudGVrLnRsdnMudHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJEaWRuJ3QgZ2V0IEJSQ00gVExWXG4iKTsKKyAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgwICE9IG9yZ19zcGVjLT51LnRlay50bHZzLnUuZXh0ZW5zaW9uX3N1cHBvcnQudmVyc2lvbikgfHwKKyAgICAgICAgICAgICAgICAoMCA9PQorICAgICAgICAgICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVEVLTk9WVVMgJiBvcmdfc3BlYy0+dS50ZWsudGx2cy51LmV4dGVuc2lvbl9zdXBwb3J0LnJlcG9ydF9tb2RlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICBJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJCUkNNIFRMViBjb250YWluZWQgYmFkIGluZm86IHZlcnNpb24gJXUgcnB0IG1vZGVzICUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LnRlay50bHZzLnUuZXh0ZW5zaW9uX3N1cHBvcnQudmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC5yZXBvcnRfbW9kZSk7CisgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChOVUxMICE9IG9yZ19zcGVjKQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiR290IHVuZXhwZWN0ZWQgb3JnYW5pemF0aW9uIHNwZWNpZmljIFRMVlxuIik7CisgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvYnJjbS9icmNtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9icmNtL2JyY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGM4ODc4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvYnJjbS9icmNtLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX0JSQ01fSF8KKyNkZWZpbmUgX0JDTU9MVF9FT05fQlJDTV9IXworCit2b2lkIGJyY21fdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKTsKKwordm9pZCBicmNtX3J4X3RsdigKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwKKyAgICBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjLAorICAgIGJjbW9zX2Vycm5vICpyYyk7CisKKyNlbmRpZiAvLyBfQkNNT0xUX0VPTl9CUkNNX0hfCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2N0Yy9jdGMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2N0Yy9jdGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhjOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBzcGVjaWZpYyB0byBDVEMgT0FNLiAqLworCisjaW5jbHVkZSAiYmNtb2x0X2Vvbl9wcml2YXRlLmgiCisjaW5jbHVkZSAiLi4vb2FtX2NvbW1vbi5oIgorI2luY2x1ZGUgImN0Yy5oIgorCisjZGVmaW5lIENUQ19FWFRFTlNJT05fU1VQUE9SVCAweDEKKyNkZWZpbmUgQ1RDX1BSRUZFUlJFRF9WRVJTSU9OIDB4MzAKKwordHlwZWRlZiBlbnVtCit7CisgICAgQ1RDX05FR19BRFZFUlRJU0lORywKKyAgICBDVENfTkVHX0NPTkZJUk1JTkcsCisgICAgQ1RDX05FR19ET05FCit9IGN0Y19uZWdfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY3RjX25lZ19zdGF0ZSBzdGF0ZTsKKyAgICB1aW50OF90IHNlbGVjdGVkX3ZlcnNpb247Cit9IGN0Y19zdGF0ZTsKKworc3RhdGljIGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciBjdGNfYWR2ZXJ0aXNlZF92ZXJzaW9uc1tdID0KK3sKKyAgICB7IC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDLCAudmVyc2lvbiA9IDB4MzAgfSwKKyAgICB7IC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDLCAudmVyc2lvbiA9IDB4MjEgfSwKKyAgICB7IC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDLCAudmVyc2lvbiA9IDB4MjAgfSwKKyAgICB7IC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDLCAudmVyc2lvbiA9IDB4MTMgfSwKKyAgICB7IC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDLCAudmVyc2lvbiA9IDB4MDEgfQorfTsKKworLyogT3JnIHNwZWNpZmljIFRMViB0byBzZW5kIHRvIHRoZSBPTlUgKi8KK3N0YXRpYyBjb25zdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gY3RjX3R4X2FkdmVydGlzZV90bHYgPQoreworICAgIC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDLAorICAgIC51ID0KKyAgICB7CisgICAgICAgIC5jdGMgPQorICAgICAgICB7CisgICAgICAgICAgICAuZXh0ZW5zaW9uX3N1cHBvcnQgPSBDVENfRVhURU5TSU9OX1NVUFBPUlQsCisgICAgICAgICAgICAudmVyc2lvbiA9IENUQ19QUkVGRVJSRURfVkVSU0lPTiwKKyAgICAgICAgICAgIC5zdXBwX3ZlcnNpb25fY291bnQgPSBOVU1fRUxFTShjdGNfYWR2ZXJ0aXNlZF92ZXJzaW9ucyksCisgICAgICAgICAgICAuc3VwcF92ZXJzaW9uID0gY3RjX2FkdmVydGlzZWRfdmVyc2lvbnMKKyAgICAgICAgfQorICAgIH0KK307CisKK3ZvaWQgY3RjX3R4X2FkZF90bHYoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKm9hbSkKK3sKKyAgICBjdGNfc3RhdGUgKmN0YyA9IGxpbmtfc3RhdGUtPm9yZ19zcGVjX3N0YXRlOworCisgICAgaWYgKGN0YyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChjdGMtPnN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfQURWRVJUSVNJTkc6CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS50eXBlID0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOworICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUgPSBjdGNfdHhfYWR2ZXJ0aXNlX3RsdjsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzX2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfQ09ORklSTUlORzoKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM7CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS5vdWkgPQorICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOworICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5jdGMuZXh0ZW5zaW9uX3N1cHBvcnQgPQorICAgICAgICAgICAgICAgICAgICBDVENfRVhURU5TSU9OX1NVUFBPUlQ7CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmN0Yy52ZXJzaW9uID0KKyAgICAgICAgICAgICAgICAgICAgY3RjLT5zZWxlY3RlZF92ZXJzaW9uOworICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuY3RjLnN1cHBfdmVyc2lvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c19jb3VudCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDVENfTkVHX0RPTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGRvbid0IGFkZCBhIFRMViAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coRVJST1IsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlVua25vd24gQ1RDIHN0YXRlICVkXG4iLCBjdGMtPnN0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjdGNfcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKQoreworICAgICpyYyA9IEJDTV9FUlJfSU5fUFJPR1JFU1M7CisKKyAgICBpZiAobGlua19zdGF0ZS0+b3JnX3NwZWNfc3RhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGN0Y19zdGF0ZSAqY3RjID0gbGlua19zdGF0ZS0+b3JnX3NwZWNfc3RhdGU7CisKKyAgICAgICAgc3dpdGNoIChjdGMtPnN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfQURWRVJUSVNJTkc6CisgICAgICAgICAgICAgICAgaWYgKChOVUxMID09IG9yZ19zcGVjKSB8fCAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQyAhPSBvcmdfc3BlYy0+b3VpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJEaWRuJ3QgZ2V0IENUQyBhZHZlcnRpc2UgVExWXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgaGlnaGVzdCBjb21tb24gdmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICBjdGMtPnNlbGVjdGVkX3ZlcnNpb24gPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDhfdCBqID0gMDsgaiA8IE5VTV9FTEVNKGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zKTsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgob3JnX3NwZWMtPnUuY3RjLnN1cHBfdmVyc2lvbltpXS5vdWkgPT0gY3RjX2FkdmVydGlzZWRfdmVyc2lvbnNbal0ub3VpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JnX3NwZWMtPnUuY3RjLnN1cHBfdmVyc2lvbltpXS52ZXJzaW9uID09IGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zW2pdLnZlcnNpb24pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zW2pdLnZlcnNpb24gPiBjdGMtPnNlbGVjdGVkX3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0Yy0+c2VsZWN0ZWRfdmVyc2lvbiA9IGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zW2pdLnZlcnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0Yy0+c2VsZWN0ZWRfdmVyc2lvbiA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7IC8qIG5vIGNvbW1vbiB2ZXJzaW9uIGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGMtPnN0YXRlID0gQ1RDX05FR19DT05GSVJNSU5HOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDVENfTkVHX0NPTkZJUk1JTkc6CisgICAgICAgICAgICAgICAgaWYgKChOVUxMID09IG9yZ19zcGVjKSB8fCAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQyAhPSBvcmdfc3BlYy0+b3VpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJEaWRuJ3QgZ2V0IENUQyBjb25maXJtIFRMVlxuIik7CisgICAgICAgICAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAob3JnX3NwZWMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JnX3NwZWMtPnUuY3RjLnZlcnNpb24gIT0gY3RjLT5zZWxlY3RlZF92ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGMtPnN0YXRlID0gQ1RDX05FR19ET05FOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDVENfTkVHX0RPTkU6CisgICAgICAgICAgICAgICAgaWYgKChOVUxMICE9IG9yZ19zcGVjKSAmJiAob3JnX3NwZWMtPm91aSA9PSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgICAgICAgICAgICAgICAgIElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkdvdCB1bmV4cGVjdGVkIENUQyBUTFYgYWZ0ZXIgbmVnb3RpYXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgoTlVMTCAhPSBvcmdfc3BlYykgJiYgKG9yZ19zcGVjLT5vdWkgPT0gQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQykpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgICAgICAgICBJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJHb3QgdW5leHBlY3RlZCBDVEMgVExWIGJlZm9yZSBuZWdvdGlhdGlvblxuIik7CisgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMT0NBTF9TVEFCTEVfUkVNT1RFX1NUQUJMRSA9PSBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0Y19zdGF0ZSAqY3RjID0gYmNtb3NfY2FsbG9jKHNpemVvZihjdGNfc3RhdGUpKTsKKyAgICAgICAgICAgIGN0Yy0+c3RhdGUgPSBDVENfTkVHX0FEVkVSVElTSU5HOworICAgICAgICAgICAgbGlua19zdGF0ZS0+b3JnX3NwZWNfc3RhdGUgPSBjdGM7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2N0Yy9jdGMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2N0Yy9jdGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjEwN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX0VPTl9DVENfSF8KKyNkZWZpbmUgX0JDTU9MVF9FT05fQ1RDX0hfCisKK3ZvaWQgY3RjX3R4X2FkZF90bHYoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKm9hbSk7CisKK3ZvaWQgY3RjX3J4X3RsdigKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwKKyAgICBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjLAorICAgIGJjbW9zX2Vycm5vICpyYyk7CisKKyNlbmRpZiAvLyBfQkNNT0xUX0VPTl9DVENfSF8KKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9kcG9lL2Rwb2UuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2Rwb2UvZHBvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGFjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9kcG9lL2Rwb2UuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBpZWNlcyBvZiB0aGUgT0FNIG5lZ290aWF0aW9uIHN0YXRlIG1hY2hpbmUgdGhhdCBhcmUgc3BlY2lmaWMgdG8gRFBvRSBPQU0uICovCisKKyNpbmNsdWRlICJiY21vbHRfZW9uX3ByaXZhdGUuaCIKKyNpbmNsdWRlICIuLi9vYW1fY29tbW9uLmgiCisjaW5jbHVkZSAiZHBvZS5oIgorCisvKiBPcmcgc3BlY2lmaWMgVExWIHRvIHNlbmQgdG8gdGhlIE9OVSAqLworc3RhdGljIGNvbnN0IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyBkcG9lX3R4X3RsdiA9Cit7CisgICAgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FLAorICAgIC51ID0KKyAgICB7CisgICAgICAgIC5kcG9lID0KKyAgICAgICAgeworICAgICAgICAgICAgLmRwb2VfaW5mb190bHYgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC50eXBlID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JULAorICAgICAgICAgICAgICAgIC51ID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC5kcG9lX29hbV9zdXBwb3J0ID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLmRwb2Vfb2FtX3ZlcnNpb24gPSAweDExCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCit2b2lkIGRwb2VfdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKQoreworICAgIGlmICgoTE9DQUxfRVZBTF9SRU1PVEVfRVZBTCA9PSBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpIHx8CisgICAgICAgIChMT0NBTF9TVEFCTEVfUkVNT1RFX0VWQUwgPT0gbGlua19zdGF0ZS0+b2FtX3N0YXRlKSkKKyAgICB7CisgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udHlwZSA9IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzsKKyAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSA9IGRwb2VfdHhfdGx2OworICAgICAgICBvYW0tPnUuaW5mby50bHZzX2NvdW50Kys7CisgICAgfQorfQorCit2b2lkIGRwb2VfcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKQoreworICAgIGlmIChsaW5rX3N0YXRlLT5vYW1fc3RhdGUgPT0gTE9DQUxfU1RBQkxFX1JFTU9URV9TVEFCTEUpCisgICAgeworICAgICAgICBpZiAoTlVMTCAhPSBvcmdfc3BlYykKKyAgICAgICAgeworICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkdvdCB1bmV4cGVjdGVkIG9yZ2FuaXphdGlvbiBzcGVjaWZpYyBUTFZcbiIpOworICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChOVUxMID09IG9yZ19zcGVjKSB8fAorICAgICAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FICE9IG9yZ19zcGVjLT5vdWkpIHx8CisgICAgICAgICAgICAoQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUICE9IG9yZ19zcGVjLT51LmRwb2UuZHBvZV9pbmZvX3Rsdi50eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkRpZG4ndCBnZXQgRFBvRSBUTFZcbiIpOworICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKG9yZ19zcGVjLT51LmRwb2UuZHBvZV9pbmZvX3Rsdi51LmRwb2Vfb2FtX3N1cHBvcnQuZHBvZV9vYW1fdmVyc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjI6CisgICAgICAgICAgICAgICAgY2FzZSAweDIxOgorICAgICAgICAgICAgICAgIGNhc2UgMHgyMDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTE6IC8qIERQb0UgdjEuMCBJMDUgYW5kIGhpZ2hlciAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDE6IC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzYW1lIGFzIDB4MTAgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDB4MDI6IC8qIHByZS1EUG9FIE9BTSwgbm8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDB4MDM6IC8qIHByZS1EUG9FIE9BTSwgd2l0aCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgc3VwcG9ydCAqLworICAgICAgICAgICAgICAgIGNhc2UgMHgxMDogLyogRFBvRSB2MS4wIEkwNCBhbmQgbG93ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICAgICAgV0FSTklORywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIkRQb0UgVExWIGNvbnRhaW5lZCBvbGQgdmVyc2lvbjogJXUgKHNvbWUgZmVhdHVyZXMgbWF5IG5vdCB3b3JrKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LmRwb2UuZHBvZV9pbmZvX3Rsdi51LmRwb2Vfb2FtX3N1cHBvcnQuZHBvZV9vYW1fdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgwMDogLyogd29ya2Fyb3VuZCBmb3IgRUFTVy0xNzgzOSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiRFBvRSBUTFYgY29udGFpbmVkIGJhZCB2ZXJzaW9uOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LmRwb2UuZHBvZV9pbmZvX3Rsdi51LmRwb2Vfb2FtX3N1cHBvcnQuZHBvZV9vYW1fdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2Rwb2UvZHBvZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvZHBvZS9kcG9lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2ZDZmMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2Rwb2UvZHBvZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX0VPTl9EUE9FX0hfCisjZGVmaW5lIF9CQ01PTFRfRU9OX0RQT0VfSF8KKwordm9pZCBkcG9lX3R4X2FkZF90bHYoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKm9hbSk7CisKK3ZvaWQgZHBvZV9yeF90bHYoCisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsCisgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYywKKyAgICBiY21vc19lcnJubyAqcmMpOworCisjZW5kaWYgLy8gX0JDTU9MVF9FT05fRFBPRV9IXworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9vYW1fY29tbW9uLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9vYW1fY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5MmM5MgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL29hbV9jb21tb24uYwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBpZWNlcyBvZiB0aGUgT0FNIG5lZ290aWF0aW9uIHN0YXRlIG1hY2hpbmUgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBPQU0uICovCisKKyNpbmNsdWRlICJvYW1fY29tbW9uLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21hdGguaCIKKyNpbmNsdWRlICJiY21vbHRfZW9uX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgiCisjaW5jbHVkZSAiZHBvZS9kcG9lLmgiCisjaW5jbHVkZSAiYnJjbS9icmNtLmgiCisjaW5jbHVkZSAiY3RjL2N0Yy5oIgorCitzdGF0aWMgY29uc3Qgb2FtX2luZm9fYWRkX3RsdiBhZGRfb3JnX3NwZWNfdGx2W0VPTl9PQU1fU0VUX0lEX0NPVU5UXSA9Cit7CisgICAgW0VPTl9PQU1fU0VUX0lEX0RQT0VdID0gZHBvZV90eF9hZGRfdGx2LAorICAgIFtFT05fT0FNX1NFVF9JRF9CUkNNXSA9IGJyY21fdHhfYWRkX3RsdiwKKyAgICBbRU9OX09BTV9TRVRfSURfQ1RDXSA9IGN0Y190eF9hZGRfdGx2Cit9OworCitzdGF0aWMgY29uc3Qgb2FtX3J4X29yZ19zcGVjX3RsdiByeF9vcmdfc3BlY190bHZbRU9OX09BTV9TRVRfSURfQ09VTlRdID0KK3sKKyAgICBbRU9OX09BTV9TRVRfSURfRFBPRV0gPSBkcG9lX3J4X3RsdiwKKyAgICBbRU9OX09BTV9TRVRfSURfQlJDTV0gPSBicmNtX3J4X3RsdiwKKyAgICBbRU9OX09BTV9TRVRfSURfQ1RDXSA9IGN0Y19yeF90bHYKK307CisKK3N0YXRpYyB1aW50OF90IGdldF9vYW1fdmVyc2lvbih2b2lkKQoreworICAgIHJldHVybiAweDAxOyAvKiBvbmx5IHZlcnNpb24gY3VycmVudGx5IHN1cHBvcnRlZCAqLworfQorCitzdGF0aWMgdm9pZCBmaWxsX2xvY2FsX3Rsdihjb25zdCBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvICp0bHYpCit7CisgICAgdGx2LT5vYW1fdmVyc2lvbiA9IGdldF9vYW1fdmVyc2lvbigpOworICAgIHRsdi0+cmV2aXNpb24gPSBsaW5rX3N0YXRlLT5yZXZpc2lvbjsKKyAgICB0bHYtPnN0YXRlID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX1NUQVRFX1BBUlNFUl9BQ1RJT04xIHwKKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX1NUQVRFX01VTFRJUExFWEVSX0FDVElPTjsKKyAgICB0bHYtPm9hbV9jb25maWcgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX09BTV9NT0RFIHwKKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19VTklESVJFQ1RJT05BTF9TVVBQT1JUIHwKKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19MSU5LX0VWRU5UUzsKKyAgICB0bHYtPm1heF9wZHVfc2l6ZSA9IGxpbmtfc3RhdGUtPm1heF9wZHVfc2l6ZTsKKyAgICB0bHYtPm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs7CisgICAgdGx2LT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bMF0gPSAweDA2OworICAgIHRsdi0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzFdID0gMHg4NjsKKyAgICB0bHYtPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblsyXSA9IDB4MjA7CisgICAgdGx2LT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bM10gPSAweEEwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3N0ZF9pbmZvX3Rsdihjb25zdCBlb25fbGlua19rZXkgKmxpbmtfa2V5LCBjb25zdCBjaGFyICp0eXBlLCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gKmluZm8pCit7CisgICAgRU9OX0xJTktfTE9HKAorICAgICAgICBERUJVRywKKyAgICAgICAgbGlua19rZXksCisgICAgICAgICIlczogdmVyICUwMnggcmV2ICUwNHggc3RhdGUgJTAyeCBjZmcgJTAyeCBwZHUgJTV1IG91aSAlMDZ4IHZlbmRvciAlMDJ4JTAyeCUwMnglMDJ4XG4iLAorICAgICAgICB0eXBlLAorICAgICAgICBpbmZvLT5vYW1fdmVyc2lvbiwKKyAgICAgICAgaW5mby0+cmV2aXNpb24sCisgICAgICAgIGluZm8tPnN0YXRlLAorICAgICAgICBpbmZvLT5vYW1fY29uZmlnLAorICAgICAgICBpbmZvLT5tYXhfcGR1X3NpemUsCisgICAgICAgIGluZm8tPm91aSwKKyAgICAgICAgaW5mby0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzBdLAorICAgICAgICBpbmZvLT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bMV0sCisgICAgICAgIGluZm8tPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblsyXSwKKyAgICAgICAgaW5mby0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzNdKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9vcmdfc3BlY190bHYoY29uc3QgZW9uX2xpbmtfa2V5ICpsaW5rX2tleSwgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYykKK3sKKyAgICBzd2l0Y2ggKG9yZ19zcGVjLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICBpZiAoQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JUID09IG9yZ19zcGVjLT51LnRlay50bHZzLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICBERUJVRywgbGlua19rZXksICJCUkNNIEV4dCBTdXBwb3J0OiB2ZXIgJTAyeCBycHQgJTAyeCBwcmVmICUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LnRlay50bHZzLnUuZXh0ZW5zaW9uX3N1cHBvcnQudmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC5yZXBvcnRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC5wcmVmZXJyZWRfcmVwb3J0X21vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICBpZiAoQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUID09IG9yZ19zcGVjLT51LmRwb2UuZHBvZV9pbmZvX3Rsdi50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgICAgICAgICAgICAgREVCVUcsIGxpbmtfa2V5LCAiRFBvRSBTdXBwb3J0OiB2ZXIgJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgREVCVUcsIGxpbmtfa2V5LCAiQ1RDIEV4dGVuc2lvbiBTdXBwb3J0ICV1LCBQcmVmZXJyZWQgVmVyc2lvbiAweCUwMngsIFN1cHBvcnRzICgldSk6XG4iLAorICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LmN0Yy5leHRlbnNpb25fc3VwcG9ydCwKKyAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS5jdGMudmVyc2lvbiwKKyAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50KTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICBERUJVRywgbGlua19rZXksICJcdE9VSSAlMDZ4LCBWZXJzaW9uIDB4JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuY3RjLnN1cHBfdmVyc2lvbltpXS5vdWksIG9yZ19zcGVjLT51LmN0Yy5zdXBwX3ZlcnNpb25baV0udmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCBsaW5rX2tleSwgIk5vIHN1cHBvcnQgZm9yICUwNnhcbiIsIG9yZ19zcGVjLT5vdWkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX2luZm9fZnJhbWUoY29uc3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW0sIGNvbnN0IGVvbl9saW5rX3N0YXRlKiBsaW5rX3N0YXRlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBlbnRuYW1lW10gPSB7Ik9OVSIsIk9MVCJ9OworICAgIGNoYXIgZGFfYnVmW01BQ19TVFJfTEVOXTsKKyAgICBjaGFyIHNhX2J1ZltNQUNfU1RSX0xFTl07CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyBmbGFncyA9IG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5mbGFnczsKKyAgICB1aW50OF90IGlzX29sdCA9ICgwID09IG1lbWNtcChsaW5rX3N0YXRlLT5lcG9uX25pX21hY19hZGRyLnU4LCBvYW0tPnNhLnU4LCBCQ01PU19FVEhfQUxFTikpOworICAgIHVpbnQ4X3Qgb2x0X3N0YWIgPSAwICE9CisgICAgICAgIChmbGFncyAmIChpc19vbHQgPyBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSA6IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSkpOworICAgIHVpbnQ4X3Qgb251X3N0YWIgPSAwICE9CisgICAgICAgIChmbGFncyAmIChpc19vbHQgPyBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9TVEFCTEUgOiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSkpOworICAgIHVpbnQ4X3Qgb2x0X2V2YWwgPSAwICE9CisgICAgICAgIChmbGFncyAmIChpc19vbHQgPyBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkcgOiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9FVkFMVUFUSU5HKSk7CisgICAgdWludDhfdCBvbnVfZXZhbCA9IDAgIT0KKyAgICAgICAgKGZsYWdzICYgKGlzX29sdCA/IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcgOiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkcpKTsKKworICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgImZyb20gJXM6IE9MVCAlcyAgT05VICVzXG4iLCBlbnRuYW1lW2lzX29sdF0sCisgICAgICAgIG9sdF9zdGFiID8gInN0YWIiIDogKG9sdF9ldmFsID8gImV2YWwiIDogIk5PTkUiKSwKKyAgICAgICAgb251X3N0YWIgPyAic3RhYiIgOiAob251X2V2YWwgPyAiZXZhbCIgOiAiTk9ORSIpKTsKKworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiICAgICAgICAgICAgICAgZGEgICAgICAgICAgICAgICAgc2EgIGV0aCBzdSBmbGdzIGNkXG4iKTsKKyAgICBFT05fTElOS19MT0coCisgICAgICAgIERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICIlcyAlcyAlMDR4ICUwMnggJTA0eCAlMDJ4XG4iLAorICAgICAgICBiY21vc19tYWNfMl9zdHIoJm9hbS0+ZGEsIGRhX2J1ZiksIGJjbW9zX21hY18yX3N0cigmb2FtLT5zYSwgc2FfYnVmKSwKKyAgICAgICAgb2FtLT5wcm90b2NvbHNbMF0uZXRoZXJ0eXBlLCBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUuc3VidHlwZSwKKyAgICAgICAgb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzLAorICAgICAgICBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlKTsKKyAgICBFT05fTElOS19MT0coCisgICAgICAgIERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJUTFZTOiAoJXUpXG4iLAorICAgICAgICBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c19jb3VudCk7CisgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHN3aXRjaCAob2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbaV0udHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgICAgICBkdW1wX3N0ZF9pbmZvX3RsdigKKyAgICAgICAgICAgICAgICAgICAgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAiTE9DQUwiLAorICAgICAgICAgICAgICAgICAgICAmb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbaV0udS5sb2NhbC5pbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFOgorICAgICAgICAgICAgICAgIGR1bXBfc3RkX2luZm9fdGx2KAorICAgICAgICAgICAgICAgICAgICAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICJSRU1PVEUiLAorICAgICAgICAgICAgICAgICAgICAmb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbaV0udS5yZW1vdGUuaW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgICAgICBkdW1wX29yZ19zcGVjX3RsdigKKyAgICAgICAgICAgICAgICAgICAgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAmb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbaV0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYmNtb3NfZXJybm8gYnVpbGRfdHhfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgZW9uX2ZyYW1lX2RhdGEgKmZyYW1lX2RhdGEpCit7CisgICAgYmNtb3NfYm9vbCBoYXZlX3JlbW90ZV9pbmZvID0gbGlua19zdGF0ZS0+cmVtb3RlX2luZm8ub2FtX3ZlcnNpb24gPT0gZ2V0X29hbV92ZXJzaW9uKCk7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZSA9IHt9OworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbCA9IHt9OworICAgIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlIHRsdnNbNF0gPSB7fTsKKworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiQlVJTERJTkcgSU5GTyBGUkFNRSwgY3VycmVudCBzdGF0ZSAlMDR4XG4iLCBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpOworCisgICAgb2FtX2ZyYW1lLmRhID0gc2xvd19wcm90b2NvbF9tdWx0aWNhc3RfbWFjOworICAgIG9hbV9mcmFtZS5zYSA9IGxpbmtfc3RhdGUtPmVwb25fbmlfbWFjX2FkZHI7CisgICAgb2FtX2ZyYW1lLnByb3RvY29sc19jb3VudCA9IDE7CisgICAgb2FtX2ZyYW1lLnByb3RvY29scyA9ICZwcm90b2NvbDsKKyAgICBwcm90b2NvbC5ldGhlcnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9PQU07CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzID0gbGlua19zdGF0ZS0+b2FtX3N0YXRlOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LmNvZGUgPSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50ID0gMTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2cyA9IHRsdnM7CisgICAgdGx2c1swXS50eXBlID0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfTE9DQUw7CisgICAgZmlsbF9sb2NhbF90bHYobGlua19zdGF0ZSwgJnRsdnNbMF0udS5sb2NhbC5pbmZvKTsKKyAgICBpZiAoaGF2ZV9yZW1vdGVfaW5mbykKKyAgICB7CisgICAgICAgIHRsdnNbMV0udHlwZSA9IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX1JFTU9URTsKKyAgICAgICAgdGx2c1sxXS51LnJlbW90ZS5pbmZvID0gbGlua19zdGF0ZS0+cmVtb3RlX2luZm87CisgICAgICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50Kys7CisgICAgfQorICAgIGFkZF9vcmdfc3BlY190bHZbbGlua19zdGF0ZS0+b2FtX3NldF0obGlua19zdGF0ZSwgJnByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50KTsKKyAgICB0bHZzW3Byb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50XS50eXBlID0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50Kys7CisKKyAgICBkdW1wX2luZm9fZnJhbWUoJm9hbV9mcmFtZSwgbGlua19zdGF0ZSk7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19mcmFtZSgmb2FtX2ZyYW1lLCAmZnJhbWVfZGF0YS0+cGF5bG9hZCwgJmZyYW1lX2RhdGEtPmxlbmd0aCk7Cit9CisKKy8qIE9LID0gZG9uZQorICAgaW5fcHJvZ3Jlc3MgPSBzZW5kIG5leHQgZnJhbWUKKyAgIHBhcnNlID0gaWdub3JlCisgICBvdGhlciA9IHN0b3AKKyAgICovCitiY21vc19lcnJubyBoYW5kbGVfcnhfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgdWludDE2X3QgcnhfbGVuZ3RoLCB1aW50OF90ICpyeF9wYXlsb2FkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIHN0YXJ0X3N0YXRlOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgKnNwOworICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMgPSBOVUxMOworCisgICAgc3RhcnRfc3RhdGUgPSBsaW5rX3N0YXRlLT5vYW1fc3RhdGU7CisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJSRUNFSVZFRCBJTkZPIEZSQU1FLCBjdXJyZW50IHN0YXRlICUwNHhcbiIsIHN0YXJ0X3N0YXRlKTsKKworICAgIGZyYW1lID0gZXBvbl9vYW1fdW5wYWNrKGxpbmtfc3RhdGUtPmxpbmtfa2V5LmRldmljZV9pZCwgcnhfbGVuZ3RoLCByeF9wYXlsb2FkKTsKKworICAgIGlmICgoZnJhbWUtPnByb3RvY29sc19jb3VudCA9PSAwKSB8fAorICAgICAgICAoZnJhbWUtPnByb3RvY29sc1swXS5ldGhlcnR5cGUgIT0gQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTCkgfHwKKyAgICAgICAgKGZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnN1YnR5cGUgIT0gQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9PQU0pIHx8CisgICAgICAgIChmcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LmNvZGUgIT0gQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTykpCisgICAgeworICAgICAgICAvKiBub3QgYW4gaW5mbyBmcmFtZSwgaWdub3JlICovCisgICAgICAgIGJjbW9zX2ZyZWUoZnJhbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICBkdW1wX2luZm9fZnJhbWUoZnJhbWUsIGxpbmtfc3RhdGUpOworICAgIHNwID0gJmZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlOworCisgICAgLyogY2FwdHVyZSBsaW5rJ3MgVExWIGZvciBzdWJzZXF1ZW50IHJldHJhbnNtaXNzaW9uICovCisgICAgaWYgKChzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c19jb3VudCA+IDApICYmCisgICAgICAgIChzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1swXS50eXBlID09IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0xPQ0FMKSkKKyAgICB7CisgICAgICAgIGxpbmtfc3RhdGUtPnJlbW90ZV9pbmZvID0gc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMF0udS5sb2NhbC5pbmZvOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21vc19mcmVlKGZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT05VX0VSUl9SRVNQOyAvKiBubyBsb2NhbCBpbmZvICovCisgICAgfQorCisgICAgaWYgKDAgIT0gbWVtY21wKGZyYW1lLT5kYS51OCwgc2xvd19wcm90b2NvbF9tdWx0aWNhc3RfbWFjLnU4LCBzaXplb2Yoc2xvd19wcm90b2NvbF9tdWx0aWNhc3RfbWFjKSkpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICBFT05fTElOS19MT0coV0FSTklORywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAgIkRBIG1pc21hdGNoICJCQ01PU19NQUNBRERSX0ZNVF9TVFIiIGV4cGVjdGVkIHZzLiAiQkNNT1NfTUFDQUREUl9GTVRfU1RSIiBhY3R1YWxcbiIsCisgICAgICAgICAgICAgICAgICAgICBCQ01PU19NQUNBRERSX1BBUkFNUygmc2xvd19wcm90b2NvbF9tdWx0aWNhc3RfbWFjKSwgQkNNT1NfTUFDQUREUl9QQVJBTVMoJmZyYW1lLT5kYSkpOworICAgIH0KKworICAgIGlmICgwICE9IG1lbWNtcChmcmFtZS0+c2EudTgsICZsaW5rX3N0YXRlLT5saW5rX2tleS5saW5rLm1hY19hZGRyZXNzLCBzaXplb2YoZnJhbWUtPnNhKSkpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICBFT05fTElOS19MT0coV0FSTklORywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAgIlNBIG1pc21hdGNoICJCQ01PU19NQUNBRERSX0ZNVF9TVFIiICBleHBlY3RlZCB2cy4gIkJDTU9TX01BQ0FERFJfRk1UX1NUUiIgYWN0dWFsXG4iLAorICAgICAgICAgICAgICAgICAgICAgQkNNT1NfTUFDQUREUl9QQVJBTVMoJmxpbmtfc3RhdGUtPmxpbmtfa2V5LmxpbmsubWFjX2FkZHJlc3MpLCBCQ01PU19NQUNBRERSX1BBUkFNUygmZnJhbWUtPnNhKSk7CisgICAgfQorCisgICAgaWYgKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzBdLnUubG9jYWwuaW5mby5vYW1fdmVyc2lvbiAhPSBnZXRfb2FtX3ZlcnNpb24oKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJvYW0gdmVyc2lvbiBtaXNtYXRjaCAweCUwMnggZXhwZWN0ZWQgdnMuIDB4JTAyeCBhY3R1YWxcbiIsCisgICAgICAgICAgICAgICAgICAgICBnZXRfb2FtX3ZlcnNpb24oKSwgc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMF0udS5sb2NhbC5pbmZvLm9hbV92ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKiBJcyB0aGUgZmFyIGVuZCBlY2hvaW5nIHRoZSBUTFYgd2Ugc2VudD8gKi8KKyAgICBpZiAoKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50ID4gMSkgJiYKKyAgICAgICAgKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzFdLnR5cGUgPT0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFKSkKKyAgICB7CisgICAgICAgIGlmIChzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1swXS51LmxvY2FsLmluZm8ubWF4X3BkdV9zaXplICE9CisgICAgICAgICAgICBzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1sxXS51LnJlbW90ZS5pbmZvLm1heF9wZHVfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19zdGF0ZS0+bWF4X3BkdV9zaXplID0gTUlOKAorICAgICAgICAgICAgICAgIHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzBdLnUubG9jYWwuaW5mby5tYXhfcGR1X3NpemUsCisgICAgICAgICAgICAgICAgc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMV0udS5yZW1vdGUuaW5mby5tYXhfcGR1X3NpemUpOworICAgICAgICAgICAgbGlua19zdGF0ZS0+cmV2aXNpb24rKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyBsb2NfdGx2ID0ge307CisgICAgICAgICAgICBmaWxsX2xvY2FsX3RsdihsaW5rX3N0YXRlLCAmbG9jX3Rsdik7CisgICAgICAgICAgICBpZiAoMCA9PSBtZW1jbXAoJmxvY190bHYsICZzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1sxXS51LnJlbW90ZS5pbmZvLCBzaXplb2YobG9jX3RsdikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSA9IChsaW5rX3N0YXRlLT5vYW1fc3RhdGUgfCBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh+QkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9FVkFMVUFUSU5HKTsKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgInNldHRpbmcgTE9DQUwgU1RBQkxFIGZsYWdcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJSZW1vdGUgVExWIGZyb20gT05VIGRvZXMgTk9UIG1hdGNoIHdoYXQgd2Ugc2VudFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3AtPnUub2FtLmZsYWdzICYgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9FVkFMVUFUSU5HKQorICAgIHsKKyAgICAgICAgbGlua19zdGF0ZS0+b2FtX3N0YXRlID0gKGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKH5CQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9TVEFCTEUpOworICAgICAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgInNldHRpbmcgUkVNT1RFIEVWQUwgZmxhZ1xuIik7CisgICAgfQorCisgICAgaWYgKHNwLT51Lm9hbS5mbGFncyAmIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFKQorICAgIHsKKyAgICAgICAgbGlua19zdGF0ZS0+b2FtX3N0YXRlID0gKGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofkJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcpOworICAgICAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgInNldHRpbmcgUkVNT1RFIFNUQUJMRSBmbGFnXG4iKTsKKyAgICB9CisKKyAgICBpZiAoTE9DQUxfU1RBQkxFX1JFTU9URV9TVEFCTEUgPT0gbGlua19zdGF0ZS0+b2FtX3N0YXRlKQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09LOyAvKiBiYXNpYyBuZWdvdGlhdGlvbiBjb21wbGV0ZSAqLworICAgIH0KKworICAgIGlmICgoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQgPiAyKSAmJgorICAgICAgICAoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMl0udHlwZSA9PSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUMpKQorICAgIHsKKyAgICAgICAgb3JnX3NwZWMgPSAmc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMl0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWU7CisgICAgfQorICAgIHJ4X29yZ19zcGVjX3RsdltsaW5rX3N0YXRlLT5vYW1fc2V0XShsaW5rX3N0YXRlLCBvcmdfc3BlYywgJnJjKTsKKworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic3RhdGUgJTA0eCAtPiAlMDR4ICglcylcbiIsCisgICAgICAgICAgICAgICAgIHN0YXJ0X3N0YXRlLCBsaW5rX3N0YXRlLT5vYW1fc3RhdGUsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisKKyAgICBiY21vc19mcmVlKGZyYW1lKTsKKworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvb2FtX2NvbW1vbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvb2FtX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjA4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9vYW1fY29tbW9uLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBpZWNlcyBvZiB0aGUgT0FNIG5lZ290aWF0aW9uIHN0YXRlIG1hY2hpbmUgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBPQU0uICovCisKKyNpZm5kZWYgX09BTV9DT01NT05fSF8KKyNkZWZpbmUgX09BTV9DT01NT05fSF8KKworI2luY2x1ZGUgImJjbW9sdF9lb25fcHJpdmF0ZS5oIgorCisjZGVmaW5lIExPQ0FMX0VWQUxfUkVNT1RFX0VWQUxcCisgICAgKEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORyB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcpCisjZGVmaW5lIExPQ0FMX1NUQUJMRV9SRU1PVEVfRVZBTFwKKyAgICAoQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9TVEFCTEUgfCBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9FVkFMVUFUSU5HKQorI2RlZmluZSBMT0NBTF9TVEFCTEVfUkVNT1RFX1NUQUJMRVwKKyAgICAoQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9TVEFCTEUgfCBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9TVEFCTEUpCisKK3R5cGVkZWYgdm9pZCAoKm9hbV9pbmZvX2FkZF90bHYpKGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpvYW0pOworCit0eXBlZGVmIHZvaWQgKCpvYW1fcnhfb3JnX3NwZWNfdGx2KSgKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwKKyAgICBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjLAorICAgIGJjbW9zX2Vycm5vICpyYyk7CisKK2JjbW9zX2Vycm5vIGJ1aWxkX3R4X2luZm9fZnJhbWUoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIGVvbl9mcmFtZV9kYXRhICpmcmFtZV9kYXRhKTsKKworYmNtb3NfZXJybm8gaGFuZGxlX3J4X2luZm9fZnJhbWUoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIHVpbnQxNl90IHJ4X2xlbmd0aCwgdWludDhfdCAqcnhfcGF5bG9hZCk7CisKKyNlbmRpZiAvLyBfT0FNX0NPTU1PTl9ICisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjEwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgRVBPTiBIb3N0IERyaXZlbiBFbmNyeXB0aW9uDQorDQoraWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpDQorDQorCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9lcG9uX2hkZQ0KKwlNT0RfVFlQRSA9IGxpYg0KKwlNT0RfREVQUyA9IGhvc3RfYXBpDQorDQorCXNyY3MgPSBiY21vbHRfZXBvbl9oZGUuYyBlbmNyeXB0X29hbS5jDQorDQorZW5kaWYNCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9iY21vbHRfZXBvbl9oZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGNiMDczCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9iY21vbHRfZXBvbl9oZGUuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoKKyA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyBvZiB0aGUgc29mdHdhcmUuCisKKyBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIHdyaXR0ZW4gY29uc2VudC4KKworIDo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21jbGlfc2Vzc2lvbi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8ZW5jcnlwdF9vYW0uaD4KKyNpbmNsdWRlIDxvYW1fZGVmcy5oPgorI2luY2x1ZGUgImJjbW9sdF9lcG9uX2hkZS5oIgorCisjZGVmaW5lIEhERV9UQVNLX01TR19RX1NJWkUgNjQKKyNkZWZpbmUgRU5DX0tFWV9MRU5HVEhfS0VZIDE2CisjZGVmaW5lIEhERV9NQVhfTlVNX0xJTktTIDUxMgorI2RlZmluZSBLRVlfRVhDSEFOR0VfUEVSSU9EIDE1CisKK3R5cGVkZWYgZW51bQoreworICAgIEhERV9FVkVOVF9FTkFCTEVfRU5DUllQVElPTiwKKyAgICBIREVfRVZFTlRfRElTQUJMRV9FTkNSWVBUSU9OLAorICAgIEhERV9FVkVOVF9GUkFNRV9SWCwKKyAgICBIREVfRVZFTlRfT0FNX1RJTUVPVVQsCisgICAgSERFX0VWRU5UX19OVU1fT0YKK30gaGRlX2V2ZW50OworCit0eXBlZGVmIGVudW0KK3sKKyAgICBIREVfU1RBVEVfTk9UX0VOQ1JZUFRFRCwKKyAgICBIREVfU1RBVEVfRU5DUllQVEVELAorICAgIEhERV9TVEFURV9XQUlUSU5HX0ZPUl9PQU1fQUNLLAorICAgIEhERV9TVEFURV9fTlVNX09GCit9IGhkZV9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGJjbW9sdF9tc2cgKnJ4OworICAgIGhkZV9rZXkga2V5OworICAgIGhkZV9ldmVudCBldmVudDsKK30gaGRlX3Rhc2tfbXNnOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGhkZV9rZXkgaGRlX2xpbms7CisgICAgaGRlX3N0YXRlIHN0YXRlOworICAgIGJjbW9zX3RpbWVyIG9hbV90aW1lb3V0X3RpbWVyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBsaW5rX3JhdGU7CisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOworICAgIGJjbW9zX21hY19hZGRyZXNzIGNvcnJlc3BvbmRpbmdfcG9uX3BvcnRfbWFjOworfSBoZGVfbGlua19kYXRhOworCitzdGF0aWMgc3RydWN0Cit7CisgICAgYmNtb3NfdGFzayB0YXNrOworICAgIGRldl9sb2dfaWQgbG9nX2lkW0JDTVRSX01BWF9PTFRTXTsKKyAgICBoZGVfbGlua19kYXRhICpsaW5rczsKKyAgICB1aW50MTZfdCBudW1fbGlua3M7Cit9IGhkZV9kYXRhOworCitzdGF0aWMgYmNtb3NfYm9vbCBpc19ydW5uaW5nID0gQkNNT1NfRkFMU0U7CisKK3R5cGVkZWYgdm9pZCAoKmxpbmtfc3RhdGVfaGFuZGxlcikoaGRlX2xpbmtfZGF0YSAqaGRlX2xpbmssIGNvbnN0IGJjbW9sdF9tc2cgKmluZCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfc3RhdGVfc3RyaW5nKGhkZV9zdGF0ZSBzdGF0ZSkKK3sKKyAgICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICBjYXNlIEhERV9TVEFURV9OT1RfRU5DUllQVEVEOgorICAgICAgICByZXR1cm4gIm5vdCBlbmNyeXB0ZWQiOworICAgIGNhc2UgSERFX1NUQVRFX0VOQ1JZUFRFRDoKKyAgICAgICAgcmV0dXJuICJlbmNyeXB0ZWQiOworICAgIGNhc2UgSERFX1NUQVRFX1dBSVRJTkdfRk9SX09BTV9BQ0s6CisgICAgICAgIHJldHVybiAid2FpdGluZyBmb3Igb2FtIGFjayI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVTktOT1dOIFNUQVRFISEhIjsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBzZXRfbmV3X2tleShjb25zdCBoZGVfa2V5ICpoZGVfbGluaywgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICpuZXdfa2V5LCBiY21vbHRfZXBvbl9rZXlfY2hvaWNlIGtleV9jaG9pY2UsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSBtb2RlKQoreworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGxpbmtfY2ZnOworICAgIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIGVuY3J5cHRpb25fY29uZmlnID0geyB9OworCisgICAgLy8gVXAvZG93biBmb3JtYXQgbXVzdCBtYXRjaCBldmVuIHdoZW4gZG9pbmcgRFMgb25seQorICAgIGVuY3J5cHRpb25fY29uZmlnLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0ID0gbmV3X2tleS0+Zm9ybWF0OworCisgICAgZW5jcnlwdGlvbl9jb25maWcuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uID0gKm5ld19rZXk7CisgICAgZW5jcnlwdGlvbl9jb25maWcuZG93bnN0cmVhbV9rZXlfY2hvaWNlID0ga2V5X2Nob2ljZTsKKyAgICBlbmNyeXB0aW9uX2NvbmZpZy5kb3duc3RyZWFtX21vZGUgPSBtb2RlOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0KKyAgICB7CisgICAgICAgIC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmksCisgICAgICAgIC5tYWNfYWRkcmVzcyA9IGhkZV9saW5rLT5tYWNfYWRkcgorICAgIH07CisgICAgQkNNT0xUX0NGR19JTklUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBsaW5rX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmbGlua19jZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uLCBlbmNyeXB0aW9uX2NvbmZpZyk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZsaW5rX2NmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2V0X3Bvbl9lbmNyeXB0aW9uX2lmX25lZWRlZChjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICAvLyBGaXJzdCBjaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgUE9OJ3MgZW5jcnlwdGlvbiBtb2RlLgorICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBwb25fY2ZnOworICAgIGJjbW9sdF9lcG9uX25pX2tleSBwb25fa2V5ID0geyAuZXBvbl9uaSA9IGhkZV9saW5rLT5lcG9uX25pIH07CisgICAgQkNNT0xUX0NGR19JTklUKCZwb25fY2ZnLCBlcG9uX25pLCBwb25fa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZwb25fY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZyk7CisgICAgcmMgPSBiY21vbHRfY2ZnX2dldChoZGVfbGluay0+ZGV2aWNlX2lkLCAmcG9uX2NmZy5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5kZXZpY2VfaWRdLCAiRmFpbHVyZSAtIENhbm5vdCBxdWVyeSBQT04gZW5jcnlwdGlvbiBtb2RlIS5cbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKHBvbl9jZmcuZGF0YS5lbmNyeXB0aW9uX2NmZy5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSAhPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUykKKyAgICB7CisgICAgICAgIC8vIEVuY3J5cHRpb24gbW9kZSBpcyBub3QgY29ycmVjdGx5IHNldCBvbiB0aGUgUE9OLCBzbyBzZXQgaXQgbm93LgorICAgICAgICBwb25fY2ZnLmRhdGEuZW5jcnlwdGlvbl9jZmcuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUzsKKyAgICAgICAgcG9uX2NmZy5kYXRhLmVuY3J5cHRpb25fY2ZnLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9OT19FTkNSWVBUSU9OOworICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZwb25fY2ZnLmhkcik7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmRldmljZV9pZF0sICJGYWlsdXJlIC0gQ2Fubm90IHNldCBQT04gZW5jcnlwdGlvbiBtb2RlIS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vbHRfZXBvbl9saW5rX3JhdGUgZ2V0X2xpbmtfcmF0ZShjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBsaW5rX2NmZzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSA9CisgICAgeworICAgICAgICAuZXBvbl9uaSA9IGhkZV9saW5rLT5lcG9uX25pLAorICAgICAgICAubWFjX2FkZHJlc3MgPSBoZGVfbGluay0+bWFjX2FkZHIKKyAgICB9OworICAgIEJDTU9MVF9DRkdfSU5JVCgmbGlua19jZmcsIGVwb25fbGluaywgbGlua19rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxpbmtfcmF0ZSk7CisgICAgcmMgPSBiY21vbHRfY2ZnX2dldChoZGVfbGluay0+ZGV2aWNlX2lkLCAmbGlua19jZmcuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coCisgICAgICAgICAgICBFUlJPUiwKKyAgICAgICAgICAgIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+ZGV2aWNlX2lkXSwKKyAgICAgICAgICAgICJGYWlsdXJlIC0gY2Fubm90IHF1ZXJ5IGxpbmsgcmF0ZSBmb3IgbGluayAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCEuXG4iLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzBdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzFdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzJdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzNdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzRdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzVdKTsKKyAgICB9CisgICAgcmV0dXJuIGxpbmtfY2ZnLmRhdGEubGlua19yYXRlOworfQorCitzdGF0aWMgYmNtb3NfbWFjX2FkZHJlc3MgZ2V0X3Bvbl9tYWMoY29uc3QgaGRlX2tleSAqaGRlX2xpbmspCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIHBvbl9jZmc7CisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IHBvbl9rZXkgPSB7IC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmkgfTsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJnBvbl9jZmcsIGVwb25fbmksIHBvbl9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJnBvbl9jZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZwb25fY2ZnLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmRldmljZV9pZF0sICJGYWlsdXJlIC0gQ2Fubm90IHF1ZXJ5IFBPTiBtYWMgYWRkcmVzcyEuXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHBvbl9jZmcuZGF0YS5tYWNfYWRkcmVzczsKK30KKworc3RhdGljIGJjbW9sdF9lcG9uX2xsaWQgZ2V0X2xsaWQoY29uc3QgaGRlX2tleSAqaGRlX2xpbmspCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgbGlua19jZmc7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXkgPQorICAgIHsKKyAgICAgICAgLmVwb25fbmkgPSBoZGVfbGluay0+ZXBvbl9uaSwKKyAgICAgICAgLm1hY19hZGRyZXNzID0gaGRlX2xpbmstPm1hY19hZGRyCisgICAgfTsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxpbmtfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBsbGlkKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZsaW5rX2NmZy5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRygKKyAgICAgICAgICAgIEVSUk9SLAorICAgICAgICAgICAgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5kZXZpY2VfaWRdLAorICAgICAgICAgICAgIkZhaWx1cmUgLSBjYW5ub3QgcXVlcnkgTExJRCBmb3IgbGluayAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCEuXG4iLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzBdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzFdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzJdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzNdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzRdLAorICAgICAgICAgICAgaGRlX2xpbmstPm1hY19hZGRyLnU4WzVdKTsKKyAgICB9CisgICAgcmV0dXJuIGxpbmtfY2ZnLmRhdGEubGxpZDsKK30KKworLyogQnkgc3BlYyB0aGUgU0NJIGlzIHRoZSBMTElEIG9mIHRoZSBsaW5rIGFwcGVuZGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVwb24gcG9ydCBtYWMgYWRkcmVzcyAqLworc3RhdGljIHZvaWQgY3JlYXRlX3NjaShjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqZXBvbl9wb3J0X21hYywgYmNtb2x0X2Vwb25fbGxpZCBsbGlkLCB1aW50OF90ICpzY2kpCit7CisgICAgc2NpWzddID0gKHVpbnQ4X3QpIGxsaWQ7CisgICAgc2NpWzZdID0gKHVpbnQ4X3QpIChsbGlkID4+IDgpOworICAgIHNjaVs1XSA9IGVwb25fcG9ydF9tYWMtPnU4WzVdOworICAgIHNjaVs0XSA9IGVwb25fcG9ydF9tYWMtPnU4WzRdOworICAgIHNjaVszXSA9IGVwb25fcG9ydF9tYWMtPnU4WzNdOworICAgIHNjaVsyXSA9IGVwb25fcG9ydF9tYWMtPnU4WzJdOworICAgIHNjaVsxXSA9IGVwb25fcG9ydF9tYWMtPnU4WzFdOworICAgIHNjaVswXSA9IGVwb25fcG9ydF9tYWMtPnU4WzBdOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbm90X2VuY3J5cHRlZF9lbmFibGVfZW5jcnlwdGlvbihoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIGRwb2VfZW5jcnlwdF9tb2RlIG1vZGUgPSBEUE9FX0VOQ1JZUFRfTU9ERV9OT05FOworICAgIC8vIFJldHJlaXZlIHVzZWZ1bCBsaW5rIGluZm8gYW5kIHN0b3JlIGl0IHRvIHNhdmUgbWVzc2FnZXMgbGF0ZXIuCisgICAgaGRlX2xpbmstPmxpbmtfcmF0ZSA9IGdldF9saW5rX3JhdGUoJmhkZV9saW5rLT5oZGVfbGluayk7CisgICAgaGRlX2xpbmstPmNvcnJlc3BvbmRpbmdfcG9uX3BvcnRfbWFjID0gZ2V0X3Bvbl9tYWMoJmhkZV9saW5rLT5oZGVfbGluayk7CisgICAgaGRlX2xpbmstPmxsaWQgPSBnZXRfbGxpZCgmaGRlX2xpbmstPmhkZV9saW5rKTsKKworICAgIGlmIChoZGVfbGluay0+bGlua19yYXRlID09IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOIHx8IGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkUpCisgICAgeworICAgICAgICBtb2RlID0gRFBPRV9FTkNSWVBUX01PREVfMTBET1dOOworICAgIH0KKyAgICBlbHNlIGlmIChoZGVfbGluay0+bGlua19yYXRlID09IEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FKQorICAgIHsKKyAgICAgICAgbW9kZSA9IERQT0VfRU5DUllQVF9NT0RFXzFET1dOOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sICJGYWlsdXJlIC0gVU5LTk9XTiBMSU5LIFJBVEUhISEuXG4iKTsKKyAgICB9CisKKyAgICBkcG9lX2VuY3J5cHRfb2FtX3NldF9yZXF1ZXN0X3NlbmQoCisgICAgICAgICZoZGVfbGluay0+aGRlX2xpbmssCisgICAgICAgIEtFWV9FWENIQU5HRV9QRVJJT0QsCisgICAgICAgIG1vZGUsCisgICAgICAgIGhkZV9saW5rLT5jb3JyZXNwb25kaW5nX3Bvbl9wb3J0X21hYyk7CisKKyAgICBiY21vc190aW1lcl9zdGFydCgmaGRlX2xpbmstPm9hbV90aW1lb3V0X3RpbWVyLCBIREVfRU5BQkxFX09BTV9XQUlUX1VTICsgT0FNX1RJTUVPVVRfR1JBQ0VfUEVSSU9EX1VTKTsKKworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9XQUlUSU5HX0ZPUl9PQU1fQUNLOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZW5jcnlwdGVkX2Rpc2FibGVfZW5jcnlwdGlvbihoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBlbXB0eV9rZXkgPSB7IH07CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvLyBUdXJuIG9mZiBlbmNyeXB0aW9uIG9uIHRoZSBlbWJlZGRlZCBzaWRlLgorICAgIHJjID0gc2V0X25ld19rZXkoJmhkZV9saW5rLT5oZGVfbGluaywgJmVtcHR5X2tleSwgQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMCwgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT04pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5oZGVfbGluay5kZXZpY2VfaWRdLAorICAgICAgICAgICAgIkZhaWx1cmUgLSBDYW5ub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgZW1iZWRkZWQhLlxuIik7CisgICAgfQorCisgICAgLy8gU2VuZCB0aGUgZGlzYWJsZSBPQU0gdG8gdGhlIGxpbmsuIERvbid0IGJvdGhlciB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLgorICAgIGRwb2VfZW5jcnlwdF9vYW1fc2V0X3JlcXVlc3Rfc2VuZCgmaGRlX2xpbmstPmhkZV9saW5rLCAwLCBEUE9FX0VOQ1JZUFRfTU9ERV9OT05FLCBnZXRfcG9uX21hYygmaGRlX2xpbmstPmhkZV9saW5rKSk7CisKKyAgICBoZGVfbGluay0+c3RhdGUgPSBIREVfU1RBVEVfTk9UX0VOQ1JZUFRFRDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2VuY3J5cHRlZF9mcmFtZV9yeChoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmZyYW1lX2NhcHR1cmVkID0gKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQqKSBpbmQ7CisgICAgdWludDhfdCBuZXdfa2V5WzE2XTsKKyAgICBiY21vbHRfZXBvbl9rZXlfY2hvaWNlIGtleV9jaG9pY2U7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9mb3JfZW1iZWRkZWQ7CisgICAgcmMgPSBkcG9lX2VuY3J5cHRfb2FtX3BhcnNlX25ld19rZXkoJmZyYW1lX2NhcHR1cmVkLT5kYXRhLmZyYW1lLCBuZXdfa2V5LCAma2V5X2Nob2ljZSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvLyBOb3QgYSBEUG9FIG5ldyBrZXksIGlnbm9yZSBpdAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU4gfHwgaGRlX2xpbmstPmxpbmtfcmF0ZSA9PSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORSkKKyAgICB7CisgICAgICAgIHVpbnQ4X3Qgc2NpWzhdOworICAgICAgICBjcmVhdGVfc2NpKCZoZGVfbGluay0+Y29ycmVzcG9uZGluZ19wb25fcG9ydF9tYWMsIGhkZV9saW5rLT5sbGlkLCBzY2kpOworICAgICAgICBrZXlfZm9yX2VtYmVkZGVkLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjsKKyAgICAgICAgbWVtY3B5KGtleV9mb3JfZW1iZWRkZWQudS5jdHIua2V5LCBuZXdfa2V5LCBzaXplb2YobmV3X2tleSkpOworICAgICAgICBtZW1jcHkoa2V5X2Zvcl9lbWJlZGRlZC51LmN0ci5zY2ksIHNjaSwgc2l6ZW9mKHNjaSkpOworICAgIH0KKyAgICBlbHNlIGlmIChoZGVfbGluay0+bGlua19yYXRlID09IEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FKQorICAgIHsKKyAgICAgICAga2V5X2Zvcl9lbWJlZGRlZC5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI7CisgICAgICAgIG1lbWNweShrZXlfZm9yX2VtYmVkZGVkLnUuY2ZiLmtleSwgbmV3X2tleSwgc2l6ZW9mKG5ld19rZXkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5oZGVfbGluay5kZXZpY2VfaWRdLCAiRmFpbHVyZSAtIFVOS05PV04gTElOSyBSQVRFISEhLlxuIik7CisgICAgfQorCisgICAgcmMgPSBzZXRfbmV3X2tleSgmaGRlX2xpbmstPmhkZV9saW5rLCAma2V5X2Zvcl9lbWJlZGRlZCwga2V5X2Nob2ljZSwgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5oZGVfbGluay5kZXZpY2VfaWRdLAorICAgICAgICAgICAgIkZhaWx1cmUgLSBDYW5ub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgZW1iZWRkZWQhLlxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfd2FpdGluZ19mb3Jfb2FtX2Fja19vYW1fdGltZW91dChoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+aGRlX2xpbmsuZGV2aWNlX2lkXSwgIkZhaWx1cmUgLSBObyByZXNwb25zZSB0byBpbml0aWFsIE9BTS5cbiIpOworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfd2FpdGluZ19mb3Jfb2FtX2Fja19mcmFtZV9yeChoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmZyYW1lX2NhcHR1cmVkID0gKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQqKSBpbmQ7CisgICAgdWludDhfdCBlbmNyeXB0X21vZGVfcmVzcG9uc2U7CisgICAgdWludDhfdCBrZXlfZXhwaXJ5X3Jlc3BvbnNlOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBkcG9lX2VuY3J5cHRfb2FtX3BhcnNlX3NldF9yZXNwb25zZSgmZnJhbWVfY2FwdHVyZWQtPmRhdGEuZnJhbWUsICZlbmNyeXB0X21vZGVfcmVzcG9uc2UsICZrZXlfZXhwaXJ5X3Jlc3BvbnNlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8vIE5vdCBhIGVuY3J5cHRpb24gc2V0IHJlcG9uc2UsIGlnbm9yZSBpdAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogMCByZXByZXNlbnRzICdubyBlcnJvcicuICovCisgICAgaWYgKChlbmNyeXB0X21vZGVfcmVzcG9uc2UgIT0gMCkgfHwgKGtleV9leHBpcnlfcmVzcG9uc2UgIT0gMCkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sCisgICAgICAgICAgICAiRmFpbHVyZSAtIFRoZSBsaW5rIHJlZnVzZWQgb25lIG9mIHRoZSByZXF1ZXN0ZWQgVExWcy5cbiIpOworICAgICAgICBoZGVfbGluay0+c3RhdGUgPSBIREVfU1RBVEVfTk9UX0VOQ1JZUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgYW4gYXBwcm9wcmlhdGUgcmVzcG9uc2UsIHNvIG1vdmUgb24gbm9ybWFsbHkuCisgICAgYmNtb3NfdGltZXJfc3RvcCgmaGRlX2xpbmstPm9hbV90aW1lb3V0X3RpbWVyKTsKKyAgICBoZGVfbGluay0+c3RhdGUgPSBIREVfU1RBVEVfRU5DUllQVEVEOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfd2FpdGluZ19mb3Jfb2FtX2Fja19kaXNhYmxlX2VuY3J5cHRpb24oaGRlX2xpbmtfZGF0YSAqaGRlX2xpbmssIGNvbnN0IGJjbW9sdF9tc2cgKmluZCkKK3sKKyAgICBoZGVfbGluay0+c3RhdGUgPSBIREVfU1RBVEVfTk9UX0VOQ1JZUFRFRDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2lnbm9yZShoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIC8vIExpdGVyYWxseSBkbyBub3RoaW5nCit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9lcnJvcihoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+aGRlX2xpbmsuZGV2aWNlX2lkXSwgIlVuZXhwZWN0ZWQgZXZlbnQgaW4gc3RhdGUgJXNcbiIsCisgICAgICAgIGdldF9zdGF0ZV9zdHJpbmcoaGRlX2xpbmstPnN0YXRlKSk7Cit9CisKK3N0YXRpYyBsaW5rX3N0YXRlX2hhbmRsZXIgbGlua19zdGF0ZV9tYWNoaW5lW0hERV9TVEFURV9fTlVNX09GXVtIREVfRVZFTlRfX05VTV9PRl0gPQoreworICAgIFtIREVfU1RBVEVfTk9UX0VOQ1JZUFRFRF0gPQorICAgIHsKKyAgICAgICAgW0hERV9FVkVOVF9FTkFCTEVfRU5DUllQVElPTl0gPSBoYW5kbGVfbm90X2VuY3J5cHRlZF9lbmFibGVfZW5jcnlwdGlvbiwKKyAgICAgICAgW0hERV9FVkVOVF9ESVNBQkxFX0VOQ1JZUFRJT05dID0gaGFuZGxlX2Vycm9yLAorICAgICAgICBbSERFX0VWRU5UX0ZSQU1FX1JYXSA9IGhhbmRsZV9pZ25vcmUsCisgICAgICAgIFtIREVfRVZFTlRfT0FNX1RJTUVPVVRdID0gaGFuZGxlX2lnbm9yZSwKKyAgICB9LAorICAgIFtIREVfU1RBVEVfRU5DUllQVEVEXSA9CisgICAgeworICAgICAgICBbSERFX0VWRU5UX0VOQUJMRV9FTkNSWVBUSU9OXSA9IGhhbmRsZV9lcnJvciwKKyAgICAgICAgW0hERV9FVkVOVF9ESVNBQkxFX0VOQ1JZUFRJT05dID0gaGFuZGxlX2VuY3J5cHRlZF9kaXNhYmxlX2VuY3J5cHRpb24sCisgICAgICAgIFtIREVfRVZFTlRfRlJBTUVfUlhdID0gaGFuZGxlX2VuY3J5cHRlZF9mcmFtZV9yeCwKKyAgICAgICAgW0hERV9FVkVOVF9PQU1fVElNRU9VVF0gPSBoYW5kbGVfaWdub3JlLAorICAgIH0sCisgICAgW0hERV9TVEFURV9XQUlUSU5HX0ZPUl9PQU1fQUNLXSA9CisgICAgeworICAgICAgICBbSERFX0VWRU5UX0VOQUJMRV9FTkNSWVBUSU9OXSA9IGhhbmRsZV9lcnJvciwKKyAgICAgICAgW0hERV9FVkVOVF9ESVNBQkxFX0VOQ1JZUFRJT05dID0gaGFuZGxlX3dhaXRpbmdfZm9yX29hbV9hY2tfZGlzYWJsZV9lbmNyeXB0aW9uLAorICAgICAgICBbSERFX0VWRU5UX0ZSQU1FX1JYXSA9IGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX2ZyYW1lX3J4LAorICAgICAgICBbSERFX0VWRU5UX09BTV9USU1FT1VUXSA9IGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX29hbV90aW1lb3V0LAorICAgIH0KK307CisKK3N0YXRpYyBpbnQzMl90IGZpbmRfdGFibGVfaW5kZXgoY29uc3QgaGRlX2tleSAqaGRlX2xpbmspCit7CisgICAgdWludDE2X3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGRlX2RhdGEubnVtX2xpbmtzOyArK2kpCisgICAgeworICAgICAgICBpZiAobWVtY21wKGhkZV9saW5rLCAmaGRlX2RhdGEubGlua3NbaV0sIHNpemVvZigqaGRlX2xpbmspKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9saW5rX2Zyb21fdGFibGUoaW50MzJfdCBsaW5rX2luZGV4KQoreworICAgIGludDMyX3QgaTsKKyAgICBmb3IgKGkgPSBsaW5rX2luZGV4OyBpIDwgaGRlX2RhdGEubnVtX2xpbmtzIC0gMTsgKytpKQorICAgIHsKKyAgICAgICAgLyogQmFja3dhcmRzIGNvcHkgYWxsIGRhdGEgZXhwZWN0IGZvciB0aGUgdGltZXIgaGFuZGxlICovCisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2ldLmhkZV9saW5rID0gaGRlX2RhdGEubGlua3NbaSArIDFdLmhkZV9saW5rOworICAgICAgICBoZGVfZGF0YS5saW5rc1tpXS5saW5rX3JhdGUgPSBoZGVfZGF0YS5saW5rc1tpICsgMV0ubGlua19yYXRlOworICAgICAgICBoZGVfZGF0YS5saW5rc1tpXS5sbGlkID0gaGRlX2RhdGEubGlua3NbaSArIDFdLmxsaWQ7CisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2ldLnN0YXRlID0gaGRlX2RhdGEubGlua3NbaSArIDFdLnN0YXRlOworICAgIH0KKyAgICAvKiBhbHNvIGNsZWFyIHRoZSBzdGF0ZSBvZiB0aGUgbm93IGVtcHR5IGxpbmsgKi8KKyAgICBoZGVfZGF0YS5saW5rc1toZGVfZGF0YS5udW1fbGlua3MgLSAxXS5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworICAgIGhkZV9kYXRhLm51bV9saW5rcy0tOworfQorCitzdGF0aWMgdm9pZCBydW5fc3RhdGVfbWFjaGluZShpbnQzMl90IGxpbmtfaW5kZXgsIGNvbnN0IGhkZV90YXNrX21zZyAqdGFza19tc2cpCit7CisgICAgaWYgKGxpbmtfaW5kZXggPCAwKSAvLyBXZSBkb24ndCBrbm93IG9mIHRoaXMgbGluayB5ZXQuCisgICAgeworICAgICAgICBpZiAoaGRlX2RhdGEubnVtX2xpbmtzID09IEhERV9NQVhfTlVNX0xJTktTKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbdGFza19tc2ctPmtleS5kZXZpY2VfaWRdLCAiRmFpbHVyZSAtIENhbm5vdCBhZGQgYW55IG1vcmUgbGlua3MhLlxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBsaW5rX2luZGV4ID0gaGRlX2RhdGEubnVtX2xpbmtzOworICAgICAgICBoZGVfZGF0YS5saW5rc1tsaW5rX2luZGV4XS5oZGVfbGluayA9IHRhc2tfbXNnLT5rZXk7CisgICAgICAgIGxpbmtfc3RhdGVfbWFjaGluZVtoZGVfZGF0YS5saW5rc1tsaW5rX2luZGV4XS5zdGF0ZV1bdGFza19tc2ctPmV2ZW50XSgmaGRlX2RhdGEubGlua3NbbGlua19pbmRleF0sIHRhc2tfbXNnLT5yeCk7CisKKyAgICAgICAgaWYgKGhkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLnN0YXRlICE9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIGxpbmsgZGlkIG5vdCBlbmQgaW4gdGhlIHN0YXRlICdub3QgZW5jcnlwdGVkJywgc28gd2UgbmVlZCB0byBzdGFydCB0cmFja2luZyBoaW0uCisgICAgICAgICAgICArK2hkZV9kYXRhLm51bV9saW5rczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vIFdlIGFscmVhZHkga25vdyBvZiB0aGlzIGxpbmsuCisgICAgeworICAgICAgICBsaW5rX3N0YXRlX21hY2hpbmVbaGRlX2RhdGEubGlua3NbbGlua19pbmRleF0uc3RhdGVdW3Rhc2tfbXNnLT5ldmVudF0oJmhkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLCB0YXNrX21zZy0+cngpOworCisgICAgICAgIGlmIChoZGVfZGF0YS5saW5rc1tsaW5rX2luZGV4XS5zdGF0ZSA9PSBIREVfU1RBVEVfTk9UX0VOQ1JZUFRFRCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIGxpbmsgaGFzIGlzIG5vIGxvbmdlciBlbmNyeXB0ZWQgc28gbGV0cyBmb3JnZXQgYWJvdXQgaGltLgorICAgICAgICAgICAgcmVtb3ZlX2xpbmtfZnJvbV90YWJsZShsaW5rX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaGRlX2hhbmRsZV9ldmVudChiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBoZGVfdGFza19tc2cgKnRhc2tfbXNnID0gKGhkZV90YXNrX21zZyAqKSBvc19tc2c7CisKKyAgICBpbnQzMl90IGxpbmtfaW5kZXg7CisKKyAgICBsaW5rX2luZGV4ID0gZmluZF90YWJsZV9pbmRleCgmdGFza19tc2ctPmtleSk7CisgICAgcnVuX3N0YXRlX21hY2hpbmUobGlua19pbmRleCwgdGFza19tc2cpOworCisgICAgaWYgKHRhc2tfbXNnLT5yeCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKHRhc2tfbXNnLT5yeCk7CisgICAgfQorICAgIGJjbW9zX2ZyZWUodGFza19tc2cpOworfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgb2FtX3Jlc3BvbnNlX3RpbWVvdXQoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgaGRlX3Rhc2tfbXNnICp0YXNrX21zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKnRhc2tfbXNnKSk7CisKKyAgICBCVUdfVU5MRVNTKHRhc2tfbXNnKTsKKworICAgIHRhc2tfbXNnLT5rZXkgPSBoZGVfZGF0YS5saW5rc1tkYXRhXS5oZGVfbGluazsKKyAgICB0YXNrX21zZy0+ZXZlbnQgPSBIREVfRVZFTlRfT0FNX1RJTUVPVVQ7CisgICAgdGFza19tc2ctPm9zX21zZy5oYW5kbGVyID0gaGRlX2hhbmRsZV9ldmVudDsKKworICAgIGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fSERFLCAmdGFza19tc2ctPm9zX21zZywgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBoZGVfc2V0X2VuY3J5cHRpb24oaGRlX2tleSoga2V5LCBiY21vc19ib29sIGVuYWJsZWQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgaGRlX3Rhc2tfbXNnICp0YXNrX21zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKnRhc2tfbXNnKSk7CisKKyAgICBCVUdfVU5MRVNTKHRhc2tfbXNnKTsKKworICAgIHRhc2tfbXNnLT5rZXkgPSAqa2V5OworICAgIHRhc2tfbXNnLT5ldmVudCA9IGVuYWJsZWQgPyBIREVfRVZFTlRfRU5BQkxFX0VOQ1JZUFRJT04gOiBIREVfRVZFTlRfRElTQUJMRV9FTkNSWVBUSU9OOworICAgIHRhc2tfbXNnLT5vc19tc2cuaGFuZGxlciA9IGhkZV9oYW5kbGVfZXZlbnQ7CisKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fSERFLCAmdGFza19tc2ctPm9zX21zZywgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKyAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gaGRlX2NsaV9lbmFibGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGhkZV9rZXkga2V5ID0KKyAgICB7CisgICAgICAgIC5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZSwKKyAgICAgICAgLmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpKGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUubnVtYmVyKSwKKyAgICAgICAgLm1hY19hZGRyID0gKGJjbW9zX21hY19hZGRyZXNzKShiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWMpCisgICAgfTsKKworICAgIHJjID0gc2V0X3Bvbl9lbmNyeXB0aW9uX2lmX25lZWRlZCgma2V5KTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgcmV0dXJuIGhkZV9zZXRfZW5jcnlwdGlvbigma2V5LCBCQ01PU19UUlVFKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGhkZV9jbGlfZGlzYWJsZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBoZGVfa2V5IGtleSA9CisgICAgeworICAgICAgICAuZGV2aWNlX2lkID0gY3VycmVudF9kZXZpY2UsCisgICAgICAgIC5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKShiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLm51bWJlciksCisgICAgICAgIC5tYWNfYWRkciA9IChiY21vc19tYWNfYWRkcmVzcykoYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjKQorICAgIH07CisKKyAgICByZXR1cm4gaGRlX3NldF9lbmNyeXB0aW9uKCZrZXksIEJDTU9TX0ZBTFNFKTsKK30KKworLy8gcHVibGljIGluZGljYXRpb24gaGFuZGxlciBpbnRlcmZhY2UgLS0gY2FsbGVkIGluIHRyYW5zcG9ydCBsYXllciBjb250ZXh0CitiY21vc19lcnJubyBiY21vbHRfZXBvbl9oZGVfcHJvY2Vzc19yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50OF90IGluc3RhbmNlLCBiY21vbHRfcHJveHlfcnggKnJ4KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKiBhY3R1YWxfcng7CisgICAgaGRlX3Rhc2tfbXNnICp0YXNrX21zZzsKKyAgICBoZGVfa2V5IGtleTsKKworICAgIGlmICghaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8vIFdlIG9ubHkgbG9vayBhdCBtZXNzYWdlIHRhcmdldHRpbmcgZXBvbiBsaW5rcy4KKyAgICBpZiAocngtPmhkci5vYmpfdHlwZSAhPSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSykKKyAgICB7CisgICAgICAgIC8vIE5vdCBhbiBlcnJvciwgd2UganVzdCBkb24ndCBjYXJlIGFib3V0IHRoaXMgb2JqZWN0LgorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IGtpbmQgb2YgcHJveHkgUlggY3VycmVudGx5IHN1cHBvcnRlZC4KKyAgICBpZiAocngtPmhkci5zdWJncm91cCAhPSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBzYWZlIGR1ZSB0byB0aGUgYWJvdmUgc3ViZ3JvdXAgY2hlY2suCisgICAgYWN0dWFsX3J4ID0gKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQqKSByeDsKKyAgICBrZXkuZGV2aWNlX2lkID0gZGV2aWNlX2lkOworICAgIGtleS5lcG9uX25pID0gaW5zdGFuY2U7CisgICAga2V5Lm1hY19hZGRyID0gYWN0dWFsX3J4LT5rZXkubWFjX2FkZHJlc3M7CisKKyAgICB0YXNrX21zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKnRhc2tfbXNnKSk7CisgICAgaWYgKHRhc2tfbXNnID09IE5VTEwpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2cgKnJ4X2Nsb25lID0gTlVMTDsKKyAgICAgICAgcmMgPSBiY21vbHRfbXNnX2Nsb25lKCZyeF9jbG9uZSwgJnJ4LT5oZHIpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZSh0YXNrX21zZyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgYWN0dWFsX3J4ID0gKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQqKSByeF9jbG9uZTsKKworICAgICAgICB0YXNrX21zZy0+cnggPSByeF9jbG9uZTsKKyAgICAgICAgdGFza19tc2ctPmtleSA9IGtleTsKKyAgICAgICAgdGFza19tc2ctPmV2ZW50ID0gSERFX0VWRU5UX0ZSQU1FX1JYOworICAgICAgICB0YXNrX21zZy0+b3NfbXNnLmhhbmRsZXIgPSBoZGVfaGFuZGxlX2V2ZW50OworICAgICAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fSERFLCAmdGFza19tc2ctPm9zX21zZywgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtkZXZpY2VfaWRdLCAiTWVzc2FnZSBzZW5kIGZhaWxlZCFcbiIpOworICAgICAgICAgICAgYmNtb2x0X21zZ19mcmVlKHJ4X2Nsb25lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKwordm9pZCBiY21vbHRfZXBvbl9oZGVfYXBwbF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gImhkZSI7CisKKyAgICBpZiAoYmNtY2xpX2Rpcl9maW5kKHRvcF9kaXIsIGRpcl9uYW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBiY21jbGlfZW50cnkgKmRpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsIGRpcl9uYW1lLCAiRVBPTiBPQU0gbmVnb3RpYXRpb24gY29tbWFuZHMiLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCVUdfT04oZGlyID09IE5VTEwpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKAorICAgICAgICBkaXIsCisgICAgICAgICJlbmFibGUiLAorICAgICAgICAiRW5hYmxlIGVuY3J5cHRpb24gZm9yIGFuIEVQT04gbGluayIsCisgICAgICAgIGhkZV9jbGlfZW5hYmxlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJNQUMgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKAorICAgICAgICBkaXIsCisgICAgICAgICJkaXNhYmxlIiwKKyAgICAgICAgIkRpc2FibGUgZW5jcnlwdGlvbiBmb3IgYW4gRVBPTiBsaW5rIiwKKyAgICAgICAgaGRlX2NsaV9kaXNhYmxlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJNQUMgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworfQorCit2b2lkIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgaTsKKworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAubmFtZSA9ICJ1c2VyX2FwcGxfaGRlIiwKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9VU0VSX0FQUExfRVBPTl9IREUsCisgICAgICAgIC5jb3JlID0gQkNNT1NfQ1BVX0NPUkVfQU5ZLCAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICAgICAgLmluaXRfaGFuZGxlciA9IE5VTEwKKyAgICB9OworCisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJtID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gIm9hbV90aW1lb3V0X3RpbWVyIiwKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX05PTkUsCisgICAgICAgIC5wZXJpb2RpYyA9IEJDTU9TX0ZBTFNFLAorICAgICAgICAuaGFuZGxlciA9IG9hbV9yZXNwb25zZV90aW1lb3V0CisgICAgfTsKKworICAgIGlmIChpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlzX3J1bm5pbmcgPSBCQ01PU19UUlVFOworCisgICAgZm9yIChpPTA7IGk8QkNNVFJfTUFYX09MVFM7IGkrKykKKyAgICB7CisgICAgICAgIGNoYXIgbG9nX25hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV07CisgICAgICAgIHNucHJpbnRmKGxvZ19uYW1lLCBzaXplb2YobG9nX25hbWUpLTEsICJ1c2VyX2FwcGxfaGRlXyVkIiwgaSk7CisgICAgICAgIGhkZV9kYXRhLmxvZ19pZFtpXSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19uYW1lLCBERVZfTE9HX0xFVkVMX0VSUk9SLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgfQorCisgICAgaGRlX2RhdGEubGlua3MgPSBiY21vc19jYWxsb2MoSERFX01BWF9OVU1fTElOS1MgKiBzaXplb2YoaGRlX2RhdGEubGlua3NbMF0pKTsKKyAgICBCVUdfT04oaGRlX2RhdGEubGlua3MgPT0gTlVMTCk7CisKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZoZGVfZGF0YS50YXNrLCAmdGFza19wYXJhbXMpOworICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9ICJ1c2VyX2FwcGxfaGRlIiwgLnNpemUgPSBIREVfVEFTS19NU0dfUV9TSVpFIH0KKyAgICB9OworICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fSERFLCAmaGRlX2RhdGEudGFzaywgJm1vZHVsZV9wYXJhbXMpOworICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBIREVfTUFYX05VTV9MSU5LUzsgKytpKQorICAgIHsKKyAgICAgICAgdGltZXJfcGFybS5kYXRhID0gaTsKKyAgICAgICAgcmMgPSBiY21vc190aW1lcl9jcmVhdGUoJmhkZV9kYXRhLmxpbmtzW2ldLm9hbV90aW1lb3V0X3RpbWVyLCAmdGltZXJfcGFybSk7CisgICAgICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9iY21vbHRfZXBvbl9oZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTdmOTViCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9iY21vbHRfZXBvbl9oZGUuaApAQCAtMCwwICsxLDU1IEBACisvKgorIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIG9mIHRoZSBzb2Z0d2FyZS4KKworIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgd3JpdHRlbiBjb25zZW50LgorCisgOj4KKyAqLworCisjaWZuZGVmIEJDTU9MVF9FUE9OX0hERV9IXworI2RlZmluZSBCQ01PTFRfRVBPTl9IREVfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vbHRfdXRpbHMuaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHI7Cit9IGhkZV9rZXk7CisKKy8vIGluaXRpYWxpemUgdGhlIEVQT04gT0FNIG5lZ290aWF0aW9uIGFwcGxpY2F0aW9uIChzaG91bGQgYmUgY2FsbGVkIGFzIHBhcnQgb2YgdXNlciBhcHBsaWNhdGlvbiBzdGFydHVwKQordm9pZCBiY21vbHRfZXBvbl9oZGVfYXBwbF9pbml0KHZvaWQpOworCisvLyBwcm9jZXNzIGFuIGluZGljYXRpb24uCitiY21vc19lcnJubyBiY21vbHRfZXBvbl9oZGVfcHJvY2Vzc19yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50OF90IGluc3RhbmNlLCBiY21vbHRfcHJveHlfcnggKnJ4KTsKKworLy8gaW5pdGlhbGl6ZSBIREUgQ0xJCit2b2lkIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZiAvKiBCQ01PTFRfRVBPTl9IREVfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvZW5jcnlwdF9vYW0uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvZW5jcnlwdF9vYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VmNjMyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9lbmNyeXB0X29hbS5jCkBAIC0wLDAgKzEsMjkxIEBACisvKgorIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIG9mIHRoZSBzb2Z0d2FyZS4KKworIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgd3JpdHRlbiBjb25zZW50LgorCisgOj4KKyAqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgIm9hbV9kZWZzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21hdGguaCIKKyNpbmNsdWRlIDxlbmNyeXB0X29hbS5oPgorCitzdGF0aWMgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3Mgc2xvd19wcm90X21jYXN0X21hYyA9Cit7CisgICAgLnU4ID0geyAweDAxLCAweDgwLCAweEMyLCAweDAwLCAweDAwLCAweDAyIH0KK307CisKK3N0YXRpYyB1aW50OF90IG9hbV9idWZmZXJbT0FNX01BWF9QQUNLRVRfU0laRV07CisKK3N0YXRpYyBiY21vc19ib29sIG9hbV92YXJfYWRkX3Rsdl9oZWFkZXIoYmNtb2x0X2J1ZiAqYnVmLCBvYW1fdmFyX2JyYW5jaCBicmFuY2gsIHVpbnQxNl90IGxlYWYsIHVpbnQ4X3QgbGVuKQoreworICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOworICAgIHVpbnQ4X3QgKnNuYXAgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisKKyAgICBvayA9IG9rICYmIChsZW4gPD0gT0FNX01BWF9UTFZfTEVOR1RIKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgYnJhbmNoKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKGJ1ZiwgbGVhZik7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1Ziwgb2FtX3Zhcl90bHZfbGVuZ3RoX2VuY29kZShsZW4pKTsKKyAgICBvayA9IG9rICYmIChiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpID49IGxlbik7CisgICAgaWYgKCFvaykKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1Ziwgc25hcCk7CisgICAgfQorICAgIHJldHVybiBvazsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgZHBvZV9lbmNyeXB0X3Rsdl9hZGQoYmNtb2x0X2J1ZiAqb2FtYnVmLCB1aW50MTZfdCBwZXJpb2QsIGRwb2VfZW5jcnlwdF9tb2RlIG1vZGUpCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisKKyAgICAvLyBlbmNyeXB0aW9uIG1vZGUgVExWCisgICAgb2sgPSBvayAmJiBvYW1fdmFyX2FkZF90bHZfaGVhZGVyKG9hbWJ1ZiwgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9BVFRSSUJVVEUsICh1aW50MTZfdCkgT0FNX0RQT0VfQVRUUl9FTkNSWVBUX01PREUsIDEpOworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91OChvYW1idWYsICh1aW50OF90KSBtb2RlKTsKKworICAgIC8qIEtleSBFeHBpcnkgVGltZSBUTFYgKi8KKyAgICBvayA9IG9rICYmIG9hbV92YXJfYWRkX3Rsdl9oZWFkZXIob2FtYnVmLCBPQU1fVkFSX0JSQU5DSF9EUE9FX0FUVFJJQlVURSwgKHVpbnQxNl90KSBPQU1fRFBPRV9BVFRSX0tFWV9FWFBJUllfVElNRSwgMik7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShvYW1idWYsIHBlcmlvZCk7CisKKyAgICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIG9hbV9wZHVfYnVpbGRfY29tbW9uKGJjbW9zX21hY19hZGRyZXNzIHBvbl9tYWMsIGJjbW9sdF9idWYgKm91dGJ1ZikKK3sKKyAgICBiY21vc19ib29sIG9rID0gQkNNT1NfVFJVRTsKKworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRidWYsIHNsb3dfcHJvdF9tY2FzdF9tYWMpOyAgICAgICAgLy8gREEKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3Mob3V0YnVmLCBwb25fbWFjKTsgICAgICAgICAgICAgICAgICAgIC8vIFNBCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShvdXRidWYsIEVUSEVSVFlQRV9TTE9XUFJPVE9DT0xTKTsgICAgICAgICAvLyBUeXBlCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KG91dGJ1ZiwgKHVpbnQ4X3QpIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9PQU0pOyAvLyBTdWJ0eXBlCisKKyAgICByZXR1cm4gb2s7Cit9CisKKy8qIFNlbmRzIE9BTSBmcmFtZSAnZnJhbWUnIHRvIGEgbGluayB2aWEgdGhlIGluamVjdCBmcmFtZSBvcGVyYXRpb24gKi8KK3N0YXRpYyBiY21vc19ib29sIG9hbV9wZHVfdHJhbnNtaXQoY29uc3QgaGRlX2tleSogaGRlX2xpbmssIHVpbnQ4X3QgKmZyYW1lLCB1aW50MTZfdCBsZW4pCit7CisgICAgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZSAgaW5qZWN0X2ZyYW1lOworCisgICAgb2FtX2ZyYW1lLmZyYW1lX29jdGV0cy5sZW4gPSBsZW47CisgICAgb2FtX2ZyYW1lLmZyYW1lX29jdGV0cy52YWwgPSBmcmFtZTsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSA9CisgICAgeworICAgICAgICAuZXBvbl9uaSA9IGhkZV9saW5rLT5lcG9uX25pLAorICAgICAgICAubWFjX2FkZHJlc3MgPSBoZGVfbGluay0+bWFjX2FkZHIKKyAgICB9OworCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGxpbmtfa2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGZyYW1lLCBvYW1fZnJhbWUpOworICAgIGlmIChiY21vbHRfcHJveHlfc2VuZChoZGVfbGluay0+ZGV2aWNlX2lkLCAmaW5qZWN0X2ZyYW1lLmhkcikgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgb2FtX3Zhcl9nZXRfbmV4dChiY21vbHRfYnVmICpidWYsIG9hbV92YXJfZ2VuZXJpYyAqb2FtdmFyKQoreworICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOworICAgIHVpbnQ4X3QgYnJhbmNoID0gT0FNX1ZBUl9CUkFOQ0hfVEVSTUlOQVRJT047CisKKyAgICBtZW1zZXQob2FtdmFyLCAwLCBzaXplb2YoKm9hbXZhcikpOworICAgIG9rID0gb2sgJiYgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgIT0gMCk7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmYnJhbmNoKTsgLy8gUmVhZCB0aGUgYnJhbmNoLgorICAgIGlmIChvaykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYnJhbmNoKQorICAgICAgICB7CisgICAgICAgIGNhc2UgT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICBjYXNlIE9BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgY2FzZSBPQU1fVkFSX0JSQU5DSF9EUE9FX0FDVDoKKyAgICAgICAgY2FzZSBPQU1fVkFSX0JSQU5DSF9EUE9FX0FUVFJJQlVURToKKyAgICAgICAgY2FzZSBPQU1fVkFSX0JSQU5DSF9EUE9FX09CSkVDVDoKKyAgICAgICAgICAgIG9hbXZhci0+YnJhbmNoID0gKG9hbV92YXJfYnJhbmNoKSBicmFuY2g7CisgICAgICAgICAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmb2FtdmFyLT5sZWFmKTsgLy8gUmVhZCBsZWFmCisgICAgICAgICAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZvYW12YXItPndpZHRoKTsgLy8gUmVhZCBXaWR0aAorICAgICAgICAgICAgb2FtdmFyLT52YWx1ZSA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsgLy8gS2VlcCB0aGUgcG9zaXRpb24gb2YgdmFsdWUKKyAgICAgICAgICAgIG9hbXZhci0+d2lkdGggPSBvYW1fdmFyX3Rsdl9sZW5ndGhfZW5jb2RlKG9hbXZhci0+d2lkdGgpOyAvLyBSZS1lbmNvZGUgd2lkdGggdmlhIE9BTSBzcGVjCisgICAgICAgICAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfc2tpcChidWYsIG9hbXZhci0+d2lkdGgpOyAvLyBTa2lwIGEgJ3dpZHRoJyBhbW91bnQKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT0FNX1ZBUl9CUkFOQ0hfVEVSTUlOQVRJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvayA9IEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfc2tpcChidWYsIG9hbXZhci0+d2lkdGgpOworICAgIHJldHVybiBvazsKK30KKworLyogTG9vcHMgdGhyb3VnaCAnb2FtX3Jlc3AnIGxvb2tpbmcgZm9yIHRoZSBwcm92aWRlZCBicmFuY2gvbGVhZi4gSWYgZm91bmQgaXQgd2lsbCByZXR1cm4gaXQuICovCitzdGF0aWMgYmNtb3NfYm9vbCBvYW1fdmFyX2dldF9icmFuY2hfbGVhZih1aW50OF90ICpvYW1fcmVzcCwgdWludDMyX3Qgb2FtX3Jlc3BfbGVuLCBvYW1fdmFyX2JyYW5jaCBicmFuY2gsIHVpbnQxNl90IGxlYWYsIG9hbV92YXJfZ2VuZXJpYyAqb2FtX3ZhcikKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBvYW1fdmFyX2dlbmVyaWMgdmFyOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIG9hbV9yZXNwX2xlbiwgb2FtX3Jlc3AsIChiY21vc19lbmRpYW4pIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKworICAgIHdoaWxlIChvYW1fdmFyX2dldF9uZXh0KCZidWYsICZ2YXIpKSAvLyBLZWVwIGdvaW5nIHRocm91Z2ggYWxsIE9BTSB2YXJzLgorICAgIHsKKyAgICAgICAgaWYgKCh2YXIuYnJhbmNoID09IGJyYW5jaCkgJiYgKHZhci5sZWFmID09IGxlYWYpKSAvLyBDaGVjayB0byBzZWUgaXQgaXMgdGhlIG9uZSB3ZSBhcmUgbG9va2luZyBmb3IuCisgICAgICAgIHsKKyAgICAgICAgICAgICpvYW1fdmFyID0gdmFyOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBvYW1fcGFyc2VfdG9fZHBvZV9vcGNvZGUoYmNtb2x0X2J1ZiAqYnVmLCBvYW1fZHBvZV9vcGNvZGUgb3Bjb2RlKQoreworICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOworICAgIHVpbnQyNF90IGRwb2Vfb3VpID0geyAubG93X2hpID0geyAuaGkgPSAweDAwLCAubWlkID0gMHgxMCwgLmxvdyA9IDB4MDAgfSB9OworICAgIHVpbnQxNl90IHUxNjsKKyAgICB1aW50OF90IHU4OworICAgIHVpbnQyNF90IHUyNDsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfc2tpcChidWYsIDEyKTsgLy8gU2tpcCBib3RoIG1hYyBhZGRyZXNzZXMKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmdTE2KTsgLy8gUmVhZCBldGhlcnR5cGUKKyAgICBvayA9IG9rICYmIHUxNiA9PSBFVEhFUlRZUEVfU0xPV1BST1RPQ09MUzsgLy8gTWFrZSBzdXJlIGl0IGlzIHNsb3cgcHJvdG9jb2wKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZ1OCk7IC8vIFJlYWQgdGhlIHN1YnR5cGUKKyAgICBvayA9IG9rICYmIHU4ID09IFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9PQU07IC8vIE1ha2Ugc3VyZSBpdCBpcyBPQU0KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfc2tpcChidWYsIDIpOyAvLyBTa2lwIGZsYWdzCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdTgpOyAvLyBSZWFkIHRoZSBjb2RlCisgICAgb2sgPSBvayAmJiB1OCA9PSBPQU1fUERVX0NPREVfT1JHX0VYVDsgLy8gTWFrZSBzdXJlIGl0IGlzIG9yZ2FuaXphdGlvbiBzcGVjaWZpYworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3UyNChidWYsICZ1MjQpOyAvLyBSZWFkIHRoZSBPVUkKKyAgICBvayA9IG9rICYmIG1lbWNtcCgmZHBvZV9vdWksICZ1MjQsIHNpemVvZih1aW50MjRfdCkpID09IDA7IC8vIE1ha2Ugc3VyZSBpdCBpcyB0aGUgRFBvRSBPVUkKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZ1OCk7IC8vIFJlYWQgdGhlIG9wY29kZQorICAgIG9rID0gb2sgJiYgb3Bjb2RlID09IHU4OyAvLyBNYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgb3Bjb2RlCisgICAgcmV0dXJuIG9rOworfQorCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3NldF9yZXF1ZXN0X3NlbmQoY29uc3QgaGRlX2tleSAqaGRlX2xpbmssIHVpbnQxNl90IHBlcmlvZCwgZHBvZV9lbmNyeXB0X21vZGUgZW5jcnlwdF9tb2RlLCBiY21vc19tYWNfYWRkcmVzcyBwb25fbWFjKQoreworICAgIC8vIHNlbmQgdGhlIGVuY3J5cHQgbW9kZSBhbmQga2V5IGV4cGlyeSB0aW1lIFRMVnMgdG8gT05VLgorICAgIGJjbW9sdF9idWYgYnVmOworICAgIGllZWVfb3VpIGRwb2Vfb3VpID0geyB7IDB4MDAsIDB4MTAsIDB4MDAgfSB9OworICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOworCisgICAgbWVtc2V0KG9hbV9idWZmZXIsIDAsIHNpemVvZihvYW1fYnVmZmVyKSk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgT0FNX01BWF9QQUNLRVRfU0laRSwgb2FtX2J1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIG9rID0gb2sgJiYgb2FtX3BkdV9idWlsZF9jb21tb24ocG9uX21hYywgJmJ1Zik7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZSgmYnVmLCAodWludDE2X3QpIE9BTV9QRFVfRkxBR19TRU5EX0FOWSk7IC8qIHdyaXRlIGZsYWdzICovCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KCZidWYsICh1aW50OF90KSBPQU1fUERVX0NPREVfT1JHX0VYVCk7IC8qIHdyaXRlICBjb2RlICovCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlKCZidWYsIGRwb2Vfb3VpLmJ5dGUsIDMpOyAvKiB3cml0ZSBvdWkgKi8KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoJmJ1ZiwgT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUKTsgLyogd3JpdGUgb3Bjb2RlICovCisgICAgb2sgPSBvayAmJiBkcG9lX2VuY3J5cHRfdGx2X2FkZCgmYnVmLCBwZXJpb2QsIGVuY3J5cHRfbW9kZSk7IC8qIHdyaXRlIGVuY3J5cHRpb24gVExWcyAqLworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoJmJ1ZiwgMCk7IC8qIHdyaXRlIEVORCAqLworICAgIG9rID0gb2sgJiYgb2FtX3BkdV90cmFuc21pdChoZGVfbGluaywgb2FtX2J1ZmZlciwgTUFYKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmJ1ZiksIDYwKSk7IC8qIFNlbmQgaXQgKi8KKworICAgIGlmICghb2spCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIHJldHVybiBvazsKK30KKworYmNtb3NfZXJybm8gZHBvZV9lbmNyeXB0X29hbV9wYXJzZV9zZXRfcmVzcG9uc2UoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICpmcmFtZSwgdWludDhfdCAqZW5jcnlwdF9tb2RlX3Jlc3BvbnNlLCB1aW50OF90ICprZXlfZXhwaXJ5X3Jlc3BvbnNlKQoreworICAgIG9hbV92YXJfZ2VuZXJpYyBlbmNyeXB0X21vZGU7CisgICAgb2FtX3Zhcl9nZW5lcmljIGtleV9leHBpcnlfdGltZTsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgZnJhbWUtPmxlbiwgZnJhbWUtPnZhbCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworCisgICAgLy8gTW92ZSB0aGUgT0FNIGJ1ZmZlciBmb3J3YXJkIHRvIHRoZSBvcGNvZGUKKyAgICBpZiAoIW9hbV9wYXJzZV90b19kcG9lX29wY29kZSgmYnVmLCBPQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBlbmNyeXB0IG1vZGUgVExWCisgICAgaWYgKCFvYW1fdmFyX2dldF9icmFuY2hfbGVhZigKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX2dldCgmYnVmKSwKKyAgICAgICAgYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoJmJ1ZiksCisgICAgICAgIE9BTV9WQVJfQlJBTkNIX0RQT0VfQVRUUklCVVRFLAorICAgICAgICBPQU1fRFBPRV9BVFRSX0VOQ1JZUFRfTU9ERSwKKyAgICAgICAgJmVuY3J5cHRfbW9kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3Iga2V5IGV4cGlyeSB0aW1lIFRMVgorICAgIGlmICghb2FtX3Zhcl9nZXRfYnJhbmNoX2xlYWYoCisgICAgICAgIGJjbW9sdF9idWZfc25hcF9nZXQoJmJ1ZiksCisgICAgICAgIGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKCZidWYpLAorICAgICAgICBPQU1fVkFSX0JSQU5DSF9EUE9FX0FUVFJJQlVURSwKKyAgICAgICAgT0FNX0RQT0VfQVRUUl9LRVlfRVhQSVJZX1RJTUUsCisgICAgICAgICZrZXlfZXhwaXJ5X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgKmVuY3J5cHRfbW9kZV9yZXNwb25zZSA9IGVuY3J5cHRfbW9kZS53aWR0aDsKKyAgICAqa2V5X2V4cGlyeV9yZXNwb25zZSA9IGtleV9leHBpcnlfdGltZS53aWR0aDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gZHBvZV9lbmNyeXB0X29hbV9wYXJzZV9uZXdfa2V5KGNvbnN0IGJjbW9sdF91OF9saXN0X3UzMiAqZnJhbWUsIHVpbnQ4X3QgKm5ld19rZXksIGJjbW9sdF9lcG9uX2tleV9jaG9pY2UgKmtleV9jaG9pY2UpCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisgICAgdWludDhfdCBrZXlfbnVtYmVyOworICAgIHVpbnQ4X3Qga2V5X2xlbmd0aDsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgZnJhbWUtPmxlbiwgZnJhbWUtPnZhbCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIG9rID0gb2FtX3BhcnNlX3RvX2Rwb2Vfb3Bjb2RlKCZidWYsIE9BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UpOworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3U4KCZidWYsICZrZXlfbnVtYmVyKTsgLy8gUmVhZCBrZXkgbnVtYmVyCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTgoJmJ1ZiwgJmtleV9sZW5ndGgpOyAvLyBSZWFkIGtleSBsZW5ndGgKKyAgICBvayA9IG9rICYmIGtleV9sZW5ndGggPT0gMTY7IC8vIE1ha2Ugc3VyZSB0aGUga2V5IGlzIDE2IGJ5dGUgbGVuZ3RoCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWQoJmJ1ZiwgbmV3X2tleSwgMTYpOyAvLyBSZWFkIHRoZSBrZXkKKworICAgIGlmICghb2spCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICBpZiAoa2V5X251bWJlciA9PSAwKQorICAgIHsKKyAgICAgICAgKmtleV9jaG9pY2UgPSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8wOworICAgIH0KKyAgICBlbHNlIGlmIChrZXlfbnVtYmVyID09IDEpCisgICAgeworICAgICAgICAqa2V5X2Nob2ljZSA9IEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9lbmNyeXB0X29hbS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9lbmNyeXB0X29hbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2QyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2VuY3J5cHRfb2FtLmgKQEAgLTAsMCArMSw1OSBAQAorLyoNCisgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkDQorDQorIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20NCisgQWxsIFJpZ2h0cyBSZXNlcnZlZA0KKw0KKyBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlDQorIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQNCisgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyDQorICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLA0KKyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOg0KKw0KKyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlDQorIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZA0KKyB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyDQorIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQNCisgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuDQorIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMNCisgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMNCisgb2YgdGhlIHNvZnR3YXJlLg0KKw0KKyBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUNCisgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkDQorIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yDQorIHdyaXR0ZW4gY29uc2VudC4NCisNCisgOj4NCisgKi8NCisNCisjaWZuZGVmIEVOQ1JZUFRfT0FNX0hfDQorI2RlZmluZSBFTkNSWVBUX09BTV9IXw0KKw0KKyNpbmNsdWRlICJvYW1fZGVmcy5oIg0KKyNpbmNsdWRlICJiY21vbHRfZXBvbl9oZGUuaCINCisNCisvKiBTZW5kIGEgRW5jcnlwdGlvbiBSZXF1ZXN0IE9BTSB0byBPTlUuICovDQorYmNtb3NfZXJybm8gZHBvZV9lbmNyeXB0X29hbV9zZXRfcmVxdWVzdF9zZW5kKA0KKyAgICBjb25zdCBoZGVfa2V5ICpoZGVfbGluaywNCisgICAgdWludDE2X3QgcGVyaW9kLA0KKyAgICBkcG9lX2VuY3J5cHRfbW9kZSBlbmNyeXB0X21vZGUsDQorICAgIGJjbW9zX21hY19hZGRyZXNzIHBvbl9tYWMpOw0KKw0KKy8qIEF0dGVtcHQgdG8gcGFyc2UgYSBEUG9FIHNldCByZXNwb25zZSBhbmQgZmlsbCBpbiB0aGUgdmFsdWVzIG9mIHRoZSB0d28gVExWcyB3ZSBpbml0aWFsbHkgc2VudCBkb3duLg0KKyAqIFRoaXMgd2lsbCByZXR1cm4gQkNNX0VSUl9QQVJTRSBpZiBpdCBmYWlscyB0byBmaWxsIGluIGVpdGhlciBvZiB0aGUgVExWcy4NCisgKi8NCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3BhcnNlX3NldF9yZXNwb25zZSgNCisgICAgY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICpmcmFtZSwNCisgICAgdWludDhfdCAqZW5jcnlwdF9tb2RlX3Jlc3BvbnNlLA0KKyAgICB1aW50OF90ICprZXlfZXhwaXJ5X3Jlc3BvbnNlKTsNCisNCisvKiBBdHRlbXB0cyB0byBwYXJzZSBhbiBPQU0gZnJhbWUgYW5kIGZpbGwgaW4gdGhlIHZhbHVlcyBvZiBuZXdfa2V5IGFuZCBrZXlfY2hvaWNlIGZyb20gdGhhdCBmcmFtZS4NCisgKiBUaGlzIHdpbGwgcmV0dXJuIEJDTV9FUlJfUEFSU0UgaWYgaXQgZmFpbHMgdG8gZmlsbCBpbiBlaXRoZXIgbmV3X2tleSBvciBrZXlfY2hvaWNlLg0KKyAqLw0KK2JjbW9zX2Vycm5vIGRwb2VfZW5jcnlwdF9vYW1fcGFyc2VfbmV3X2tleSgNCisgICAgY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICpmcmFtZSwNCisgICAgdWludDhfdCAqbmV3X2tleSwNCisgICAgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSAqa2V5X2Nob2ljZSk7DQorDQorI2VuZGlmIC8qIEVOQ1JZUFRfT0FNX0hfICovDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9vYW1fZGVmcy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9vYW1fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NmQ1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL29hbV9kZWZzLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qDQorIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZA0KKw0KKyBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tDQorIEFsbCBSaWdodHMgUmVzZXJ2ZWQNCisNCisgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQ0KKyBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkDQorIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMg0KKyAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwNCisgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToNCisNCisgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQ0KKyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQNCisgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cg0KKyBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50DQorIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLg0KKyBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzDQorIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zDQorIG9mIHRoZSBzb2Z0d2FyZS4NCisNCisgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lDQorIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZA0KKyB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcg0KKyB3cml0dGVuIGNvbnNlbnQuDQorDQorIDo+DQorICovDQorDQorI2lmbmRlZiBPQU1fREVGU19IXw0KKyNkZWZpbmUgT0FNX0RFRlNfSF8NCisNCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiDQorDQorI2RlZmluZSBFVEhFUlRZUEVfU0xPV1BST1RPQ09MUyAweDg4MDkNCisjZGVmaW5lIE9BTV9USU1FT1VUX0dSQUNFX1BFUklPRF9VUyAxMDAwMDANCisjZGVmaW5lIEhERV9FTkFCTEVfT0FNX1dBSVRfVVMgM2U2IC8vIDMgc2Vjb25kcw0jZGVmaW5lIE9BTV9NQVhfUEFDS0VUX1NJWkUgMTUxOA0KKyNkZWZpbmUgT0FNX01BWF9UTFZfTEVOR1RIIDEyOA0KKw0KKy8qIENvbW1vbiBPQU1QRFUgU3RydWN0dXJlICovDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBTTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFDUCAgICAgPSAweDAxLCAvKiBMaW5rIEFncmVnYXRpb24gQ29udHJvbCBQcm90b2NvbCAqLw0KKyAgICBTTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFNUCAgICAgPSAweDAyLCAvKiBMaW5rIEFncmVnYXRpb24gTWFya2VyIFByb3RvY29sICovDQorICAgIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9PQU0gICAgICA9IDB4MDMsIC8qIE9BTSAqLw0KKyAgICBTTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHX1NQRUMgPSAweDBBICAvKiBPcmdhbml6YXRpb24gU3BlY2lmaWMgU3VidHlwZSAqLw0KK30gc2xvd19wcm90b2NvbF9zdWJ0eXBlOw0KKw0KKy8qIFN0YW5kYXJkIE9BTSBGbGFncyBmaWVsZC4gIElFRUU4MDIuMy0yMDA4X3NlY3Rpb241LCBjaC41Ny40LjIuMSAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgT0FNX1BEVV9GTEFHX0xJTktfRkFVTFQgICAgID0gKDEgPDwgMCksIC8qIDB4MDAwMSAqLw0KKyAgICBPQU1fUERVX0ZMQUdfRFlJTkdfR0FTUCAgICAgPSAoMSA8PCAxKSwgLyogMHgwMDAyICovDQorICAgIE9BTV9QRFVfRkxBR19DUklUSUNBTF9FVkVOVCA9ICgxIDw8IDIpLCAvKiAweDAwMDQgKi8NCisgICAgT0FNX1BEVV9GTEFHX0xPQ0FMX0VWQUwgICAgID0gKDEgPDwgMyksIC8qIDB4MDAwOCAqLw0KKyAgICBPQU1fUERVX0ZMQUdfTE9DQUxfU1RBQkxFICAgPSAoMSA8PCA0KSwgLyogMHgwMDEwICovDQorICAgIE9BTV9QRFVfRkxBR19SRU1PVEVfRVZBTCAgICA9ICgxIDw8IDUpLCAvKiAweDAwMjAgKi8NCisgICAgT0FNX1BEVV9GTEFHX1JFTU9URV9TVEFCTEUgID0gKDEgPDwgNiksIC8qIDB4MDA0MCAqLw0KKyAgICBPQU1fUERVX0ZMQUdfU0VORF9BTlkgICAgICAgPSAoT0FNX1BEVV9GTEFHX0xPQ0FMX1NUQUJMRSB8IE9BTV9QRFVfRkxBR19SRU1PVEVfU1RBQkxFKQ0KK30gb2FtX3BkdV9mbGFnOw0KKw0KKy8qIFN0YW5kYXJkIE9BTSBDb2RlIGZpZWxkLiAgSUVFRTgwMi4zLTIwMDhfc2VjdGlvbjUsIGNoLjU3LjQuMi4yICovDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBPQU1fUERVX0NPREVfSU5GTyAgICAgICAgICAgICAgPSAweDAsDQorICAgIE9BTV9QRFVfQ09ERV9FVkVOVE5PVElGSUNBVElPTiA9IDB4MDEsDQorICAgIE9BTV9QRFVfQ09ERV9WQVJSRVFVRVNUICAgICAgICA9IDB4MDIsDQorICAgIE9BTV9QRFVfQ09ERV9WQVJSRVNQT05TRSAgICAgICA9IDB4MDMsDQorICAgIE9BTV9QRFVfQ09ERV9MT09QQkFDSyAgICAgICAgICA9IDB4MDQsDQorICAgIE9BTV9QRFVfQ09ERV9PUkdfRVhUICAgICAgICAgICA9IDB4ZmUNCit9IG9hbV9wZHVfY29kZTsNCisNCisvKiBJRUVFIE9yZ2FuaXphdGlvbiBVbmlxdWUgSWRlbnRpZmllciAqLw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB1aW50OF90IGJ5dGVbM107DQorfSBpZWVlX291aTsNCisNCisvKiBCcmFuY2ggdHlwZXMgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgIE9BTV9WQVJfQlJBTkNIX1RFUk1JTkFUSU9OICAgID0gMHgwMCwNCisgICAgT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFICAgICAgPSAweDA3LA0KKyAgICBPQU1fVkFSX0JSQU5DSF9BQ1RJT04gICAgICAgICA9IDB4MDksDQorICAgIE9BTV9WQVJfQlJBTkNIX0RQT0VfT0JKRUNUICAgID0gMHhENiwNCisgICAgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9BVFRSSUJVVEUgPSAweEQ3LA0KKyAgICBPQU1fVkFSX0JSQU5DSF9EUE9FX1BST0dfQ1RSICA9IDB4RDgsDQorICAgIE9BTV9WQVJfQlJBTkNIX0RQT0VfQUNUICAgICAgID0gMHhEOQ0KK30gb2FtX3Zhcl9icmFuY2g7DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBPQU1fRFBPRV9PUENPREVfUkVTRVJWRUQgICAgICAgPSAwLA0KKyAgICBPQU1fRFBPRV9PUENPREVfR0VUX1JFUVVFU1QgICAgPSAxLA0KKyAgICBPQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFICAgPSAyLA0KKyAgICBPQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1QgICAgPSAzLA0KKyAgICBPQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFICAgPSA0LA0KKyAgICBPQU1fRFBPRV9PUENPREVfSVBNQ19DVFJMICAgICAgPSA1LA0KKyAgICBPQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHICAgICAgPSA2LA0KKyAgICBPQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHX1JFU1AgPSA3LA0KKyAgICBPQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFICAgPSA4LA0KKyAgICBPQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUiAgPSA5LA0KKyAgICBPQU1fRFBPRV9PUENPREVfSVBNQ19DVFJMX1JFU1AgPSAweDBhIC8qIERQb0UgMi4wICovDQorfSBvYW1fZHBvZV9vcGNvZGU7DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBPQU1fRFBPRV9BVFRSX0tFWV9FWFBJUllfVElNRSA9IDB4MDQwMSwNCisgICAgT0FNX0RQT0VfQVRUUl9FTkNSWVBUX01PREUgPSAweDA0MDINCit9IG9hbV9kcG9lX2F0dHI7DQorDQorLyogRFBvRSBLZXkgRXhjaGFuZ2UgT0FNIFRMViBlbmNyeXB0aW9uIG1vZGUgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgIERQT0VfRU5DUllQVF9NT0RFX05PTkUsDQorICAgIERQT0VfRU5DUllQVF9NT0RFXzFET1dOLA0KKyAgICBEUE9FX0VOQ1JZUFRfTU9ERV8xMERPV04sDQorICAgIERQT0VfRU5DUllQVF9NT0RFXzEwQkkNCit9IGRwb2VfZW5jcnlwdF9tb2RlOw0KKw0KKy8qIGdlbmVyaWMgT0FNIFZhcmlhYmxlIGZvcm1hdCAqLw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICBvYW1fdmFyX2JyYW5jaCBicmFuY2g7DQorICAgIHVpbnQxNl90IGxlYWY7DQorICAgIHVpbnQ4X3Qgd2lkdGg7DQorICAgIHVpbnQ4X3QgKnZhbHVlOw0KK30gb2FtX3Zhcl9nZW5lcmljOw0KKw0KKy8qKiBJbiB0aGUgT0FNIHByb3RvY29sIGxlbmd0aCAwIHRsdiBpcyBlbmNvZGVkIGFzIDB4ODAgKG5vIGVycm9yKS4NCisgKiAgTGVuZ3RoICgxLTEyNykgYXJlIGVuY29kZWQgd2l0aCBubyBjaGFuZ2UgYW5kIDEyOCBpcyBlbmNvZGVkIGFzIDAuDQorICoNCisgKiBccGFyYW0gICB3aWR0aCAgIFRMViB3aWR0aCBmaWVsZCB2YWx1ZQ0KKyAqIFxyZXR1cm4gIGVuY29kZWQgdmFsdWUgZm9yIHRoZSB3aWR0aCBmaWVsZA0KKyAqIFxyZWYgICAgIElFRUU4MDIuMy0yMDA4X3NlY3Rpb241LCBDaC4gNTcuNi4yLjENCisgKi8NCitzdGF0aWMgaW5saW5lIHVpbnQ4X3Qgb2FtX3Zhcl90bHZfbGVuZ3RoX2VuY29kZSh1aW50OF90IHdpZHRoKQ0KK3sNCisgICAgaWYgKHdpZHRoID09IDApDQorICAgIHsNCisgICAgICAgIHJldHVybiBPQU1fTUFYX1RMVl9MRU5HVEg7IC8qIDB4MDAgZXF1YWxzIDEyOCBvY3RldHMuICovDQorICAgIH0NCisgICAgZWxzZSBpZiAod2lkdGggPT0gT0FNX01BWF9UTFZfTEVOR1RIKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsgLyogMHg4MCByZXByZXNlbnRzICdubyBlcnJvcicuIE5vICdWYWx1ZScgZmllbGQuICovDQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gd2lkdGg7IC8qIHJlcHJlc2VudHMgdGhlIGxlbmd0aCBvZiAnVmFsdWUnLiAqLw0KKyAgICB9DQorfQ0KKw0KKyNlbmRpZiAvKiBPQU1fREVGU19IXyAqLw0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTZiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9lcG9uX29hbQorICAgIE1PRF9UWVBFID0gbGliCisJTU9EX0RFUFMgPSB1dGlscyBkZXZfbG9nIGNvbW1vbl9lcG9uX29hbSBjb21tb25fYXBpCisgICAgc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYworICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKyAgICBlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg1OTRjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmMKQEAgLTAsMCArMSwxNDM2IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbWF0aC5oIgorI2luY2x1ZGUgImJjbW9sdF91dGlscy5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorI2luY2x1ZGUgImJjbW9sdF9tc2dfcGFjay5oIgorI2luY2x1ZGUgImJjbW9sdF9hcGkuaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgiCisjaW5jbHVkZSAiYmNtb3NfaGFzaF90YWJsZS5oIgorCisjZGVmaW5lIE1BWF9DT05DVVJSRU5UX0xJTktTICAgIDIwNDgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsKKyAgICBGSUxFICpmaWxlOworICAgIHZvaWQgKmJ1ZjsKKyAgICB1aW50MTZfdCBibG9ja19zaXplOworICAgIHVpbnQxNl90IGxhc3RfYmxvY2s7CisgICAgdWludDE2X3QgbGFzdF9ibG9ja19zaXplOworICAgIHVpbnQ4X3QgcmV0cmllczsKKyAgICBiY21vc19ib29sIGRvbmU7CisgICAgYmNtb3NfdGltZXIgdGltZXI7CisgICAgdWludDMyX3QgdGltZW91dF91czsKKyAgICB1aW50MzJfdCBsYXN0X3RpbWU7Cit9IGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGJjbW9sdF9wcm94eV9yeCAqcng7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcnhfY2IgY2I7Cit9IGVwb25fb2FtX3Byb3h5X3J4X2RhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlICpzdGF0ZTsKK30gZXBvbl9vYW1fdGltZW91dF9kYXRhOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgZXBvbl9vYW1fcHJveHlfcnhfZGF0YSBwcm94eV9yeDsKKyAgICBlcG9uX29hbV90aW1lb3V0X2RhdGEgdGltZW91dDsKK30gZXBvbl9vYW1fbXNnX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnIG9zX21zZzsKKyAgICBlcG9uX29hbV9tc2dfZGF0YSBkYXRhOworfSBlcG9uX29hbV9tc2c7CisKK3N0YXRpYyBiY21vc19ib29sIGlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKK3N0YXRpYyBkZXZfbG9nX2lkIGVwb25fb2FtX2xvZ1tCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgY2hhciBtYWNfYnVmW01BQ19TVFJfTEVOXTsKK3N0YXRpYyBiY21vc190YXNrIGVwb25fb2FtX3Rhc2s7CitzdGF0aWMgaGFzaF90YWJsZSAqZHBvZV9md191cGdyYWRlX3N0YXRlOworCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfb3NfbXNnKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKTsKKworI2RlZmluZSBFUE9OX09BTV9MT0cobGV2ZWwsIGRldmljZSwgbGluaywgZm10LCBhcmdzLi4uKSAgICAgXAorICAgIEJDTV9MT0dfQ0FMTEVSX0ZNVChsZXZlbCwgZXBvbl9vYW1fbG9nW2RldmljZV0sICIldS0lczogImZtdCwgKGxpbmspLT5lcG9uX25pLCBiY21vc19tYWNfMl9zdHIoJihsaW5rKS0+bWFjX2FkZHJlc3MsIG1hY19idWYpLCAjI2FyZ3MpCisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9nZXRfbWFjX2RhKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9lcG9uX25pIGVwb24sIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBwb25fY2ZnOworICAgIGJjbW9sdF9lcG9uX25pX2tleSBwb25fa2V5ID0geyAuZXBvbl9uaSA9IGVwb24gfTsKKworICAgIC8qIHJldHJpZXZlIHRoZSBFUE9OIE5JIE1BQyBhZGRyZXNzICovCisgICAgQkNNT0xUX0NGR19JTklUKCZwb25fY2ZnLCBlcG9uX25pLCBwb25fa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZwb25fY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmcG9uX2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1tkZXZpY2VfaWRdLCAiRmFpbGVkIHRvIHJldHJpZXZlIEVQT04gTkkgTUFDIGFkZHJlc3MhXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKm1hYyA9IHBvbl9jZmcuZGF0YS5tYWNfYWRkcmVzczsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fcGFja19mcmFtZShiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZSwgdWludDhfdCAqKmJ1ZmZlciwgdWludDE2X3QgKmxlbmd0aCkKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKworICAgICpsZW5ndGggPSBNQVgoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2dldF9wYWNrZWRfbGVuZ3RoKG9hbV9mcmFtZSksIDYwKTsKKyAgICAqYnVmZmVyID0gYmNtb3NfY2FsbG9jKCpsZW5ndGgpOworICAgIGlmIChOVUxMID09ICpidWZmZXIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsICpsZW5ndGgsICpidWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9wYWNrKG9hbV9mcmFtZSwgJmJ1ZikpCisgICAgeworICAgICAgICBiY21vc19mcmVlKCpidWZmZXIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fcGFja19hbmRfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUgaW5qZWN0X2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZXBvbl9uaSA9IGVwb24sIC5tYWNfYWRkcmVzcyA9ICptYWMgfTsKKyAgICBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgZnJhbWU7CisKKyAgICBlcnIgPSBlcG9uX29hbV9wYWNrX2ZyYW1lKG9hbV9mcmFtZSwgJmZyYW1lLmZyYW1lX29jdGV0cy52YWwsICZmcmFtZS5mcmFtZV9vY3RldHMubGVuKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwgJmxpbmtfa2V5LCAiRmFpbGVkIHRvIHBhY2sgT0FNIGZyYW1lOiAlcyFcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZpbmplY3RfZnJhbWUsIGVwb25fbGluaywgaW5qZWN0X2ZyYW1lLCBsaW5rX2tleSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZpbmplY3RfZnJhbWUsIGVwb25fbGluaywgaW5qZWN0X2ZyYW1lLCBmcmFtZSwgZnJhbWUpOworICAgIGVyciA9IGJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJmluamVjdF9mcmFtZS5oZHIpOworCisgICAgYmNtb3NfZnJlZShmcmFtZS5mcmFtZV9vY3RldHMudmFsKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqZXBvbl9vYW1fdW5wYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQzMl90IGxlbiwgdWludDhfdCAqYnl0ZXMpCit7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgdWludDMyX3QgdW5wYWNrX2J5dGVzID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSk7CisgICAgdm9pZCAqdW5wYWNrX21lbTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKmZyYW1lOworICAgIHZvaWQgKmV4dHJhX21lbTsKKworICAgIC8qIFdlIGRvbid0IGtub3cgaG93IG11Y2ggc3BhY2Ugd2UnbGwgbmVlZCB0byB1bnBhY2sgdGhlIE9BTSBmcmFtZS4gU3RhcnRpbmcgd2l0aCB0aGUga25vd24gZml4ZWQgc2l6ZSwgd2Ugc2NhbiB0aGUKKyAgICAgICBmcmFtZSB0byBkZXRlcm1pbmUgdGhlIGV4YWN0IHNwYWNlIG5lZWRlZCAqLworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBsZW4sIGJ5dGVzLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfc2NhbigmYnVmLCAmdW5wYWNrX2J5dGVzKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1tkZXZpY2VfaWRdLCAiRmFpbGVkIHRvIHNjYW4gT0FNIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHVucGFja19tZW0gPSBiY21vc19jYWxsb2ModW5wYWNrX2J5dGVzKTsKKyAgICBpZiAoTlVMTCA9PSB1bnBhY2tfbWVtKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW2RldmljZV9pZF0sICJGYWlsZWQgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgcmVxdWlyZWQgdG8gdW5wYWNrXG4iLCB1bnBhY2tfYnl0ZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgZXBvbl9vYW1fbG9nW2RldmljZV9pZF0sICJTdWNjZXNzZnVsbHkgYWxsb2NhdGVkICV1IGJ5dGVzIHJlcXVpcmVkIHRvIHVucGFja1xuIiwgdW5wYWNrX2J5dGVzKTsKKyAgICB9CisgICAgLyogTm93IHRoYXQgd2UgaGF2ZSBhbiBhcHByb3ByaWF0ZWx5IHNpemVkIGJ1ZmZlciB0byB1bnBhY2sgaW50bywgcG9pbnQgdGhlIGZpeGVkIHN0cnVjdHVyZSB0byB0aGUgc3RhcnQgb2YgdGhlCisgICAgICAgYnVmZmVyIGFuZCBkaXJlY3QgdGhlIHVucGFja2VyIHRvIHN0b3JlIGFueSBhZGRpdGlvbmFsIGRhdGEgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhhdCAqLworICAgIGZyYW1lID0gKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSopdW5wYWNrX21lbTsKKyAgICBleHRyYV9tZW0gPSAodm9pZCopKGZyYW1lICsgMSk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgbGVuLCBieXRlcywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3VucGFjayhmcmFtZSwgJmJ1ZiwgJmV4dHJhX21lbSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbZGV2aWNlX2lkXSwgIkZhaWxlZCB0byB1bnBhY2sgT0FNIGZyYW1lXG4iKTsKKyAgICAgICAgYmNtb3NfZnJlZSh1bnBhY2tfbWVtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKnByb3RvY29sKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIG9hbV9mcmFtZS0+ZGEgPSBzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWM7CisgICAgZXJyID0gZXBvbl9vYW1fZ2V0X21hY19kYShkZXZpY2VfaWQsIGVwb24sICZvYW1fZnJhbWUtPnNhKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgb2FtX2ZyYW1lLT5wcm90b2NvbHNfY291bnQgPSAxOworICAgIG9hbV9mcmFtZS0+cHJvdG9jb2xzID0gcHJvdG9jb2w7CisgICAgcHJvdG9jb2wtPmV0aGVydHlwZSA9IEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9PQU07CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5mbGFncyA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFIHwgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfU1RBQkxFOworICAgIHByb3RvY29sLT51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlID0gQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOworICAgIHByb3RvY29sLT51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS5vdWkgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9zZW5kX29zX21zZyhiY21vc19tc2dfaWQgdHlwZSwgZXBvbl9vYW1fbXNnX2RhdGEgKm1zZ19kYXRhKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVwb25fb2FtX21zZyAqbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisKKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbbXNnX2RhdGEtPnByb3h5X3J4LmRldmljZV9pZF0sICJPUyBtc2cgY2FsbG9jIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIG1zZy0+b3NfbXNnLnR5cGUgPSB0eXBlOworICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBlcG9uX29hbV9oYW5kbGVfb3NfbXNnOworICAgIG1zZy0+ZGF0YSA9ICptc2dfZGF0YTsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fT0FNLCAmbXNnLT5vc19tc2csIDApOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW21zZ19kYXRhLT5wcm94eV9yeC5kZXZpY2VfaWRdLCAiT1MgbXNnIHNlbmQgZmFpbGVkXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2dldF9jcml0aWNhbF9pbmZvKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yIHZhcnNbM10gPSB7fTsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID0KKyAgICAgICAgMzsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5nZXRfcmVxdWVzdC52YXJzID0gdmFyczsKKyAgICB2YXJzWzBdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOworICAgIHZhcnNbMV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzFdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTE9HSUNBTF9MSU5LUzsKKyAgICB2YXJzWzJdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1syXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzJdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9vYW1fcmF0ZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4KQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1syXSA9IHt9OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAyOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vYW1fcmF0ZS5taW5pbXVtX29hbV9yYXRlID0gbWluOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUub2FtX3JhdGUubWF4aW11bV9vYW1fcmF0ZSA9IG1heDsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9yZXBvcnRfdGhyZXNob2xkcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9xdWV1ZV9zZXRzIHF1ZXVlX3NldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9xdWV1ZV9zZXRzKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1syXSA9IHt9OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAyOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cyA9IG51bV9xdWV1ZV9zZXRzOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID0KKyAgICAgICAgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MCA9IHF1ZXVlX3NldHNbMF07CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQxID0gcXVldWVfc2V0c1sxXTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDIgPSBxdWV1ZV9zZXRzWzJdOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MyA9IHF1ZXVlX3NldHNbM107CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zZXRfZW5jcnlwdGlvbigKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgZW5jX21vZGUsCisgICAgdWludDE2X3QgcGVyaW9kKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1szXSA9IHt9OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAzOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9NT0RFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUuZW5jcnlwdF9tb2RlLmVuY3J5cHRpb25fbWV0aG9kID0gZW5jX21vZGU7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUU7CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5rZXlfZXhwaXJ5X3RpbWUudGltZSA9IHBlcmlvZDsKKyAgICB2YXJzWzJdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1syXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzJdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19ib29sIGVwb25fb2FtX2lzX2Rwb2UoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW0pCit7CisgICAgcmV0dXJuICgob2FtLT5wcm90b2NvbHNfY291bnQgPiAwKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTCA9PSBvYW0tPnByb3RvY29sc1swXS5ldGhlcnR5cGUpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSA9PSBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUuc3VidHlwZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQyA9PQorICAgICAgICAgb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQuY29kZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FID09CisgICAgICAgICBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS5vdWkpKTsKK30KKworYmNtb3NfYm9vbCBlcG9uX29hbV9pc19kcG9lX2VuY3J5cHRfcmVzcG9uc2UoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UpCit7CisgICAgcmV0dXJuIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFID09IGRwb2UtPm9wKSAmJgorICAgICAgICAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDIpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFID09IGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0uYnJhbmNoKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9NT0RFID09CisgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURSA9PSBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzFdLmJyYW5jaCkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0tFWV9FWFBJUllfVElNRSA9PQorICAgICAgICAgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbWFrZV9mcmFtZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdmFycykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgb2FtX2ZyYW1lLCBwcm90b2NvbCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworICAgIHByb3RvY29sLT51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAzOworICAgIHByb3RvY29sLT51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzID0gdmFyczsKKyAgICB2YXJzWzBdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTOworICAgIHZhcnNbMl0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzJdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMl0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1szXSA9IHt9OworICAgIHVpbnQ4X3QgcG9ydCA9IDA7CisKKyAgICBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbWFrZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSwgJnByb3RvY29sLCB2YXJzKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0Lm9iamVjdF90eXBlID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTkVUV09SS19QT047CisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC51Lm5ldHdvcmtfcG9uLnBvbl9jb3VudCA9IDE7CisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC51Lm5ldHdvcmtfcG9uLnBvbiA9ICZwb3J0OworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzNdID0ge307CisgICAgdWludDhfdCBwb3J0ID0gMDsKKworICAgIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wsIHZhcnMpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQub2JqZWN0X3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQ7CisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC51LnVzZXJfcG9ydC5wb3J0X2NvdW50ID0gMTsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUudXNlcl9wb3J0LnBvcnQgPSAmcG9ydDsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBlcnIgPSBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oZGV2aWNlX2lkLCBlcG9uLCBtYWMpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGRldmljZV9pZCwgZXBvbiwgbWFjKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zZXRfYmFzaWNfcXVldWVfY29uZmlnKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBfcXVldWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRuX3F1ZXVlX3NpemUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzJdID0ge307CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0IHVwX3F1ZXVlX3NldDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgZG5fcXVldWVfc2V0OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAyOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rcyA9IDE7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5xdWV1ZV9jb25maWcubGlua19jb25maWd1cmF0aW9uID0gJnVwX3F1ZXVlX3NldDsKKyAgICB1cF9xdWV1ZV9zZXQucXVldWVfY291bnQgPSAxOworICAgIHVwX3F1ZXVlX3NldC5xdWV1ZV9zaXplcyA9ICZ1cF9xdWV1ZV9zaXplOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9wb3J0cyA9IDE7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5xdWV1ZV9jb25maWcucG9ydF9jb25maWd1cmF0aW9uID0gJmRuX3F1ZXVlX3NldDsKKyAgICBkbl9xdWV1ZV9zZXQucXVldWVfY291bnQgPSAxOworICAgIGRuX3F1ZXVlX3NldC5xdWV1ZV9zaXplcyA9ICZkbl9xdWV1ZV9zaXplOworICAgIHZhcnNbMV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX21ha2VfZnJhbWUoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZV9ydWxlX3ZsYW5fbW9kZSB2bGFuX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF0pCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHZhcl9jb3VudFtEUE9FX1JVTEVfVkxBTl9NT0RFX0NPVU5UXSA9CisgICAgeworICAgICAgICBbRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FXSA9IDgsCisgICAgICAgIFtEUE9FX1JVTEVfVkxBTl9NT0RFX0FERF0gPSAxMCwKKyAgICAgICAgW0RQT0VfUlVMRV9WTEFOX01PREVfUkVNT1ZFXSA9IDkKKyAgICB9OworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCBvYW1fZnJhbWUsIHByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIHZhcl9jb3VudFt2bGFuX21vZGVdOworICAgIHByb3RvY29sLT51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzID0gdmFyczsKKyAgICB2YXJzWzBdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0lOR1JFU1NfUlVMRTsKKyAgICB2YXJzWzFdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LmhlYWRlci5wcmVjZWRlbmNlID0gMTA7CisgICAgdmFyc1syXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0lOR1JFU1NfUlVMRTsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOworICAgIHZhcnNbMl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LmNsYXVzZS5maWVsZF9jb2RlLmNvZGUgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0wyREE7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLmZpZWxkX2NvZGUuaW5zdGFuY2UgPSAwOworICAgIHZhcnNbMl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LmNsYXVzZS5tc2JfbWFzayA9IDA7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLmxzYl9tYXNrID0gMDsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2Uub3BlcmF0b3IgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9BTFdBWVNfTUFUQ0g7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCA9IDA7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLm1hdGNoX3ZhbHVlID0gTlVMTDsKKyAgICB2YXJzWzNdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC5yZXN1bHQgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUVVFVUU7CisgICAgdmFyc1s0XS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbNF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0lOR1JFU1NfUlVMRTsKKyAgICB2YXJzWzRdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOworICAgIHZhcnNbNF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQucmVzdWx0ID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0ZPUldBUkQ7CisKKyAgICBzd2l0Y2ggKHZsYW5fbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FOgorICAgICAgICAgICAgYnJlYWs7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgY2FzZSBEUE9FX1JVTEVfVkxBTl9NT0RFX0FERDoKKyAgICAgICAgICAgIHZhcnNbNV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICAgICAgICAgIHZhcnNbNV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0lOR1JFU1NfUlVMRTsKKyAgICAgICAgICAgIHZhcnNbNV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ7CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnJlc3VsdCA9CisgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0lOU0VSVDsKKyAgICAgICAgICAgIHZhcnNbNV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5pbnNlcnQuZmllbGQuZmllbGQuY29kZSA9CisgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVkxBTjsKKyAgICAgICAgICAgIHZhcnNbNV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5pbnNlcnQuZmllbGQuZmllbGQuaW5zdGFuY2UgPSAwOworICAgICAgICAgICAgdmFyc1s2XS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDsKKyAgICAgICAgICAgIHZhcnNbNl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQucmVzdWx0ID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUOworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnNldC5maWVsZC5maWVsZC5jb2RlID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NWTEFOOworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnNldC5maWVsZC5maWVsZC5pbnN0YW5jZSA9IDA7CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuc2V0LnZhbHVlX2NvdW50ID0gNDsKKyAgICAgICAgICAgIHZhcnNbNl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5zZXQudmFsdWUgPSB2bGFuX3RhZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERQT0VfUlVMRV9WTEFOX01PREVfUkVNT1ZFOgorICAgICAgICAgICAgdmFyc1s1XS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDsKKyAgICAgICAgICAgIHZhcnNbNV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQucmVzdWx0ID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfREVMRVRFOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LmRlbGV0ZS5maWVsZC5maWVsZC5jb2RlID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NWTEFOOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LmRlbGV0ZS5maWVsZC5maWVsZC5pbnN0YW5jZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0zXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0lOR1JFU1NfUlVMRTsKKyAgICB2YXJzW3Zhcl9jb3VudFt2bGFuX21vZGVdLTNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjsKKyAgICB2YXJzW3Zhcl9jb3VudFt2bGFuX21vZGVdLTJdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT047CisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0yXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9JTkdSRVNTX1JVTEVTOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tMV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzW3Zhcl9jb3VudFt2bGFuX21vZGVdLTFdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tMV0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbMTBdID0ge307CisgICAgdWludDhfdCBwb3J0ID0gMDsKKworICAgIGVyciA9IGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbWFrZV9mcmFtZShkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9hbV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bGFuX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fdGFnKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0Lm9iamVjdF90eXBlID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTkVUV09SS19QT047CisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC51Lm5ldHdvcmtfcG9uLnBvbl9jb3VudCA9IDE7CisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC51Lm5ldHdvcmtfcG9uLnBvbiA9ICZwb3J0OworICAgIHZhcnNbM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5xdWV1ZS5xdWV1ZS50eXBlID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfVVNFUl9QT1JUOworICAgIHZhcnNbM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5xdWV1ZS5xdWV1ZS5pbnN0YW5jZSA9IDA7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnF1ZXVlLnF1ZXVlLnF1ZXVlID0gMDsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZV9ydWxlX3ZsYW5fbW9kZSB2bGFuX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZsYW5fdGFnWzRdKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1sxMF0gPSB7fTsKKyAgICB1aW50OF90IHBvcnQgPSAwOworCisgICAgZXJyID0gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2FtX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl90YWcpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQub2JqZWN0X3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQ7CisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC51LnVzZXJfcG9ydC5wb3J0X2NvdW50ID0gMTsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUudXNlcl9wb3J0LnBvcnQgPSAmcG9ydDsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUucXVldWUucXVldWUudHlwZSA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0xJTks7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnF1ZXVlLnF1ZXVlLmluc3RhbmNlID0gMDsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUucXVldWUucXVldWUucXVldWUgPSAwOworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBlcnIgPSBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGRldmljZV9pZCwgZXBvbiwgbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkUsIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChkZXZpY2VfaWQsIGVwb24sIG1hYywgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FLCBOVUxMKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW4oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSkKK3sKKyAgICBzdGF0aWMgdWludDhfdCBleGFtcGxlX3ZsYW5bNF0gPSB7IDB4ODEsIDB4MDAsIDB4MTIsIDB4MzQgfTsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgZXJyID0gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbihkZXZpY2VfaWQsIGVwb24sIG1hYywgRFBPRV9SVUxFX1ZMQU5fTU9ERV9SRU1PVkUsIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIGlmIChOVUxMID09IHZsYW5fdGFnKQorICAgIHsKKyAgICAgICAgdmxhbl90YWcgPSBleGFtcGxlX3ZsYW47CisgICAgfQorICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChkZXZpY2VfaWQsIGVwb24sIG1hYywgRFBPRV9SVUxFX1ZMQU5fTU9ERV9BREQsIHZsYW5fdGFnKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lcG9uX29hbV9kcG9lX3VzZXJfdHJhZmZpY19zZXRfYWN0aW9uKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIGFjdGlvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbMl0gPSB7fTsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID0KKyAgICAgICAgMjsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzID0gdmFyczsKKyAgICB2YXJzWzBdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT047CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ubGVhZiA9IGFjdGlvbjsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2Rpc2FibGVfdXNlcl90cmFmZmljKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgcmV0dXJuIF9lcG9uX29hbV9kcG9lX3VzZXJfdHJhZmZpY19zZXRfYWN0aW9uKGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQyk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZW5hYmxlX3VzZXJfdHJhZmZpYyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICByZXR1cm4gX2Vwb25fb2FtX2Rwb2VfdXNlcl90cmFmZmljX3NldF9hY3Rpb24oZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUMpOworfQorCitzdGF0aWMgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlICplcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfYWRkKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXkpCit7CisgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlIHN0YXRlID0ge307CisgICAgcmV0dXJuIGhhc2hfdGFibGVfcHV0KGRwb2VfZndfdXBncmFkZV9zdGF0ZSwgKGNvbnN0IHVpbnQ4X3QqKWtleSwgJnN0YXRlKTsKK30KKworc3RhdGljIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSogZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX2dldChjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5KQoreworICAgIHJldHVybiBoYXNoX3RhYmxlX2dldChkcG9lX2Z3X3VwZ3JhZGVfc3RhdGUsIChjb25zdCB1aW50OF90KilrZXkpOworfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKnN0YXRlKQoreworICAgIGlmIChOVUxMID09IHN0YXRlKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nWzBdLCAiVHJpZWQgdG8gcmVsZWFzZSBOVUxMIHN0YXRlXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChOVUxMICE9IHN0YXRlLT5maWxlKQorICAgIHsKKyAgICAgICAgZmNsb3NlKHN0YXRlLT5maWxlKTsKKyAgICB9CisgICAgYmNtb3NfZnJlZShzdGF0ZS0+YnVmKTsKKyAgICBiY21vc190aW1lcl9kZXN0cm95KCZzdGF0ZS0+dGltZXIpOworICAgIGlmICghaGFzaF90YWJsZV9yZW1vdmUoZHBvZV9md191cGdyYWRlX3N0YXRlLCAoY29uc3QgdWludDhfdCopJnN0YXRlLT5rZXkpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW3N0YXRlLT5kZXZpY2VfaWRdLCAiVW5hYmxlIHRvIHJlbW92ZSBmcm9tIGhhc2ggdGFibGVcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1fZHBvZV9zZW5kX2Jsb2NrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgQkNNT1NfUkVUVVJOX09OX0VSUk9SKGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfREFUQTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2RhdGEuYmxvY2sgPSBibG9jazsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2RhdGEubGVuZ3RoID0gbGVuZ3RoOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfZGF0YS5kYXRhID0gZGF0YTsKKworICAgIGlmIChCQ01fRVJSX09LICE9IGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZrZXktPm1hY19hZGRyZXNzLCAmb2FtX2ZyYW1lKSkKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJGYWlsZWQgdG8gc2VuZCBmdyB1cGdyYWRlIGJsb2NrICV1XG4iLCBibG9jayk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJTZW50IGJsb2NrICV1XG4iLCBibG9jayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgZXJyb3IpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwga2V5LT5lcG9uX25pLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX1JFVFVSTl9PTl9FUlJPUihlcnIpOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci5vcGNvZGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0FDSzsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2Fjay5ibG9jayA9IDA7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suZXJyb3IgPSBlcnJvcjsKKworICAgIGlmIChCQ01fRVJSX09LICE9IGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZrZXktPm1hY19hZGRyZXNzLCAmb2FtX2ZyYW1lKSkKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJGYWlsZWQgdG8gc2VuZCBmdyB1cGdyYWRlIGFja1xuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJTZW50IGFjazogZXJyb3IgJXVcbiIsIGVycm9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2Rwb2VfcmVzZXRfdGltZW91dChlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKnN0YXRlKQoreworICAgIEVQT05fT0FNX0xPRyhERUJVRywgc3RhdGUtPmRldmljZV9pZCwgJnN0YXRlLT5rZXksICJPTlUgdG9vayAldSB1cyB0byByZXNwb25kXG4iLCBiY21vc190aW1lc3RhbXAoKSAtIHN0YXRlLT5sYXN0X3RpbWUpOworICAgIHN0YXRlLT5sYXN0X3RpbWUgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICBiY21vc190aW1lcl9zdGFydCgmc3RhdGUtPnRpbWVyLCBzdGF0ZS0+dGltZW91dF91cyk7Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2Rwb2VfaGFuZGxlX2FjayhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlICpmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYikKK3sKKyAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKnN0YXRlOworICAgIGludCBibG9ja19zaXplOworCisgICAgc3RhdGUgPSBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfZ2V0KGtleSk7CisKKyAgICBpZiAoTlVMTCA9PSBzdGF0ZSkKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJSeCB1bmV4cGVjdGVkIGFja1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUtPmRvbmUpCisgICAgeworICAgICAgICBpZiAoZnQtPnUuZmlsZV9hY2suYmxvY2sgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkZpbmFsIGFjayBjb250YWluZWQgbm9uLXplcm8gYmxvY2s6ICV1XG4iLCBmdC0+dS5maWxlX2Fjay5ibG9jayk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChmdC0+dS5maWxlX2Fjay5lcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX09LOgorICAgICAgICAgICAgICAgIEVQT05fT0FNX0xPRyhJTkZPLCBkZXZpY2VfaWQsIGtleSwgIlVwZ3JhZGUgc3VjY2Vzc2Z1bFxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJVcGdyYWRlIGZhaWxlZCB3aXRoIGVycm9yICV1XG4iLCBmdC0+dS5maWxlX2Fjay5lcnJvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdGUtPmxhc3RfYmxvY2srKzsKKyAgICBpZiAoKHN0YXRlLT5sYXN0X2Jsb2NrIC0gMSkgPT0gZnQtPnUuZmlsZV9hY2suYmxvY2spCisgICAgeyAvKiByZXRyeSBsYXN0IGJsb2NrICovCisgICAgICAgIHN0YXRlLT5sYXN0X2Jsb2NrLS07CisgICAgICAgIHN0YXRlLT5yZXRyaWVzKys7CisgICAgICAgIGlmIChzdGF0ZS0+cmV0cmllcyA+IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJFeGNlZWRlZCByZXRyeSBsaW1pdCBvbiBibG9jayAldVxuIiwgZnQtPnUuZmlsZV9hY2suYmxvY2spOworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZW5kX2FjayhkZXZpY2VfaWQsIGtleSwgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9USU1FT1VUKTsKKyAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVwb25fb2FtX2Rwb2Vfc2VuZF9ibG9jayhkZXZpY2VfaWQsIGtleSwgZnQtPnUuZmlsZV9hY2suYmxvY2ssIHN0YXRlLT5idWYsIHN0YXRlLT5sYXN0X2Jsb2NrX3NpemUpOworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9yZXNldF90aW1lb3V0KHN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzdGF0ZS0+bGFzdF9ibG9jayA9PSBmdC0+dS5maWxlX2Fjay5ibG9jaykKKyAgICB7IC8qIHNlbmQgbmV4dCBibG9jayAqLworICAgICAgICBzdGF0ZS0+cmV0cmllcyA9IDA7CisgICAgICAgIGJsb2NrX3NpemUgPSBmcmVhZChzdGF0ZS0+YnVmLCAxLCBzdGF0ZS0+YmxvY2tfc2l6ZSwgc3RhdGUtPmZpbGUpOworICAgICAgICBpZiAoYmxvY2tfc2l6ZSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVwb25fb2FtX2Rwb2Vfc2VuZF9ibG9jayhkZXZpY2VfaWQsIGtleSwgZnQtPnUuZmlsZV9hY2suYmxvY2ssIHN0YXRlLT5idWYsIGJsb2NrX3NpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUtPmRvbmUgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZW5kX2FjayhkZXZpY2VfaWQsIGtleSwgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9PSyk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPmxhc3RfYmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfcmVzZXRfdGltZW91dChzdGF0ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8qIHVuZXhwZWN0ZWQgYmxvY2sgKi8KKyAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIlVuZXhwZWN0ZWQgYmxvY2sgcmVxdWVzdGVkOiAldSAoZXhwZWN0aW5nICV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGZ0LT51LmZpbGVfYWNrLmJsb2NrLCBzdGF0ZS0+bGFzdF9ibG9jayArIDEpOworICAgICAgICBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKGRldmljZV9pZCwga2V5LCBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX0JBRF9CTE9DSyk7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfdGltZW91dChiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBlcG9uX29hbV9tc2dfZGF0YSBtc2dfZGF0YTsKKworICAgIG1zZ19kYXRhLnRpbWVvdXQuc3RhdGUgPSAoZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlKilkYXRhOworICAgIGVwb25fb2FtX3NlbmRfb3NfbXNnKEJDTU9TX01TR19JRF9FUE9OX09BTV9USU1FT1VULCAmbXNnX2RhdGEpOworCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3N0YXJ0X3VwZ3JhZGUoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZndfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdGltZW91dF9zZWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSA9IHsgLmVwb25fbmkgPSBlcG9uLCAubWFjX2FkZHJlc3MgPSAqbWFjIH07CisgICAgYmNtb3NfdGltZXJfcGFybSB0cCA9CisgICAgeworICAgICAgICAubmFtZSA9ICJmd191cGdyYWRlX3RpbWVyIiwKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FUE9OX09BTSwKKyAgICAgICAgLnBlcmlvZGljID0gQkNNT1NfRkFMU0UsCisgICAgICAgIC5oYW5kbGVyID0gZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3RpbWVvdXQKKyAgICB9OworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGU7CisKKyAgICBpZiAoTlVMTCAhPSBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfZ2V0KCZsaW5rX2tleSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKyAgICBzdGF0ZSA9IGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9hZGQoJmxpbmtfa2V5KTsKKyAgICBpZiAoTlVMTCA9PSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIHN0YXRlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisgICAgc3RhdGUtPmtleSA9IGxpbmtfa2V5OworICAgIHN0YXRlLT5maWxlID0gZm9wZW4oZndfZmlsZSwgInJiIik7CisgICAgaWYgKE5VTEwgPT0gc3RhdGUtPmZpbGUpCisgICAgeworICAgICAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lPOworICAgIH0KKyAgICBzdGF0ZS0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CisgICAgc3RhdGUtPmJ1ZiA9IGJjbW9zX2NhbGxvYyhibG9ja19zaXplKTsKKyAgICBpZiAoTlVMTCA9PSBzdGF0ZS0+YnVmKQorICAgIHsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgc3RhdGUtPmxhc3RfYmxvY2sgPSAweGZmZmY7LyotMSovCisgICAgc3RhdGUtPnJldHJpZXMgPSAwOworICAgIHN0YXRlLT5kb25lID0gQkNNT1NfRkFMU0U7CisgICAgdHAuZGF0YSA9IChsb25nKXN0YXRlOworICAgIGVyciA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmc3RhdGUtPnRpbWVyLCAmdHApOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgc3RhdGUtPnRpbWVvdXRfdXMgPSB0aW1lb3V0X3NlYyAqIDEwMDAgKiAxMDAwOworICAgIHN0YXRlLT5sYXN0X3RpbWUgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICBiY21vc190aW1lcl9zdGFydCgmc3RhdGUtPnRpbWVyLCBzdGF0ZS0+dGltZW91dF91cyk7CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfV1JJVEU7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV93cml0ZS5maWxlbmFtZV9jb3VudCA9IDA7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV93cml0ZS5maWxlbmFtZSA9IE5VTEw7CisKKyAgICBlcnIgPSBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShzdGF0ZSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfcmVzZXRfb251KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9lcG9uX25pIGVwb24sIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzJdID0ge307CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVNFVF9PTlU7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1faGFuZGxlX2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50LT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAoQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUMgPT0gY29udGVudC0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpXS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnQtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNbaV0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUub3VpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGNiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYihkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJmtleS0+bWFjX2FkZHJlc3MsIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFBPRV9FVkVOVCwgQkNNX0VSUl9PSyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKElORk8sIGRldmljZV9pZCwga2V5LCAiUmVjZWl2ZWQgRFBvRSBldmVudCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNbaV0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLmV2ZW50X2NvZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1faGFuZGxlX2Rwb2VfZ2V0X3Jlc3BvbnNlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggJXUgdmFyc1xuIiwgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICIgJXU6IGJyYW5jaCAldVxuIiwgaSwgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS5icmFuY2gpOworICAgICAgICBpZiAoQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURSA9PSBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLmJyYW5jaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID4KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX05PX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJFcnJvciAweCV4IGdldHRpbmcgRFBvRSBleHRlbmRlZCBhdHRyaWJ1dGUgMHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZik7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9JRDoKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKElORk8sIGRldmljZV9pZCwga2V5LCAiR290IERQb0UgT05VSUQgJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vbnVfaWQuaWQudThbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9udV9pZC5pZC51OFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUub251X2lkLmlkLnU4WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vbnVfaWQuaWQudThbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9udV9pZC5pZC51OFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUub251X2lkLmlkLnU4WzVdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTE9HSUNBTF9MSU5LUzoKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKElORk8sIGRldmljZV9pZCwga2V5LCAiR290IERQb0UgTWF4IExvZ2ljYWwgTGlua3MgQmlEaXIgJXUsIERvd25Pbmx5ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5tYXhfbG9naWNhbF9saW5rcy5iaWRpcmVjdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5tYXhfbG9naWNhbF9saW5rcy5kb3duc3RyZWFtX29ubHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCAhPSBjYikKKyAgICB7CisgICAgICAgIGNiKGRldmljZV9pZCwga2V5LT5lcG9uX25pLCAma2V5LT5tYWNfYWRkcmVzcywgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX0dFVF9SRVNQT05TRSwgcmMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1faGFuZGxlX2Rwb2Vfc2V0X3Jlc3BvbnNlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggJXUgdmFyc1xuIiwgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICIgJXU6IGJyYW5jaCAldVxuIiwgaSwgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS5icmFuY2gpOworICAgICAgICBzd2l0Y2ggKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0uYnJhbmNoKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICAgICAgaWYgKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID4KKyAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9OT19FUlJPUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJFcnJvciAweCV4IHNldHRpbmcgRFBvRSBleHRlbmRlZCBhdHRyaWJ1dGUgMHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKElORk8sIGRldmljZV9pZCwga2V5LCAiU3VjY2Vzc2Z1bGx5IHNldCBEUG9FIGV4dGVuZGVkIGF0dHJpYnV0ZSAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICAgICAgaWYgKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uLndpZHRoID4KKyAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9OT19FUlJPUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJFcnJvciAweCV4IHBlcmZvcm1pbmcgRFBvRSBleHRlbmRlZCBhY3Rpb24gMHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi5sZWFmKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKElORk8sIGRldmljZV9pZCwga2V5LCAiU3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZCBEUG9FIGV4dGVuZGVkIGFjdGlvbiAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi5sZWFmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMICE9IGNiKQorICAgIHsKKyAgICAgICAgY2IoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZrZXktPm1hY19hZGRyZXNzLCBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0RQT0VfU0VUX1JFU1BPTlNFLCByYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZHBvZV9maWxlX3RyYW5zZmVyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICpkcG9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYikKK3sKKyAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiR290IERQb0UgRmlsZSBUcmFuc2ZlcjogJXVcbiIsIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSk7CisgICAgc3dpdGNoIChkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlJ4IGFjayBibG9jayAldSBlcnJvciAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfYWNrLmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suZXJyb3IpOworICAgICAgICAgICAgc3dpdGNoIChkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfYWNrLmVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9PSzoKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9oYW5kbGVfYWNrKGRldmljZV9pZCwga2V5LCAmZHBvZS0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIsIGNiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkZpbGUgdHJhbnNmZXIgZmFpbGVkIG9uIGJsb2NrICV1IHdpdGggZXJyb3IgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfYWNrLmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2Fjay5lcnJvcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9EQVRBOgorICAgICAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlJ4IGRhdGFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9SRUFEOgorICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIlJ4IHJlYWQgcmVxdWVzdFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1dSSVRFOgorICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIlJ4IHdyaXRlIHJlcXVlc3RcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiVW5rbm93biBEUG9FIEZpbGUgVHJhbnNmZXIgb3Bjb2RlOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci5vcGNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZHBvZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcnhfY2IgY2IpCit7CisgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlJ4IERQb0Ugb3Bjb2RlICV1XG4iLCBkcG9lLT5vcCk7CisgICAgc3dpdGNoIChkcG9lLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9kcG9lX2dldF9yZXNwb25zZShkZXZpY2VfaWQsIGRwb2UsIGtleSwgY2IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9kcG9lX3NldF9yZXNwb25zZShkZXZpY2VfaWQsIGRwb2UsIGtleSwgY2IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgICAgICBlcG9uX29hbV9oYW5kbGVfZHBvZV9maWxlX3RyYW5zZmVyKGRldmljZV9pZCwgZHBvZSwga2V5LCBjYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcHJveHlfcngoZXBvbl9vYW1fcHJveHlfcnhfZGF0YSAqZGF0YSkKK3sKKyAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkICpjYXAgPSAoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopZGF0YS0+cng7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWU7CisKKyAgICBvYW1fZnJhbWUgPSBlcG9uX29hbV91bnBhY2soZGF0YS0+ZGV2aWNlX2lkLCBjYXAtPmRhdGEuZnJhbWUubGVuLCBjYXAtPmRhdGEuZnJhbWUudmFsKTsKKyAgICBpZiAoTlVMTCA9PSBvYW1fZnJhbWUpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG9hbV9mcmFtZS0+cHJvdG9jb2xzX2NvdW50ID09IDApCisgICAgeworICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRhdGEtPmRldmljZV9pZCwgJmNhcC0+a2V5LCAiTm8gcHJvdG9jb2xzIGluIE9BTSBmcmFtZVxuIik7CisgICAgICAgIGJjbW9zX2ZyZWUob2FtX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSeCBldGhlcnR5cGUgJTA0eCBzdWJ0eXBlICUwMnhcbiIsCisgICAgICAgICAgICAgICAgIG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLmV0aGVydHlwZSwgb2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnN1YnR5cGUpOworICAgIGlmICgoQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTCA9PSBvYW1fZnJhbWUtPnByb3RvY29sc1swXS5ldGhlcnR5cGUpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSA9PSBvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUuc3VidHlwZSkpCisgICAgeworICAgICAgICBpZiAob2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzICYgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MSU5LX0ZBVUxUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkYXRhLT5jYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhLT5jYihkYXRhLT5kZXZpY2VfaWQsIGNhcC0+a2V5LmVwb25fbmksICZjYXAtPmtleS5tYWNfYWRkcmVzcywgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9MSU5LX0ZBVUxULCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSZWNlaXZlZCBPQU0gbGluayBmYXVsdFxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5mbGFncyAmIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfRFlJTkdfR0FTUCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZGF0YS0+Y2IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YS0+Y2IoZGF0YS0+ZGV2aWNlX2lkLCBjYXAtPmtleS5lcG9uX25pLCAmY2FwLT5rZXkubWFjX2FkZHJlc3MsIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFlJTkdfR0FTUCwgQkNNX0VSUl9PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRhdGEtPmRldmljZV9pZCwgJmNhcC0+a2V5LCAiUmVjZWl2ZWQgT0FNIGR5aW5nIGdhc3BcbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uZmxhZ3MgJiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0NSSVRJQ0FMX0VWRU5UKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkYXRhLT5jYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhLT5jYihkYXRhLT5kZXZpY2VfaWQsIGNhcC0+a2V5LmVwb25fbmksICZjYXAtPmtleS5tYWNfYWRkcmVzcywgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9DUklUSUNBTF9FVkVOVCwgQkNNX0VSUl9PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRhdGEtPmRldmljZV9pZCwgJmNhcC0+a2V5LCAiUmVjZWl2ZWQgT0FNIGNyaXRpY2FsIGV2ZW50XG4iKTsKKyAgICAgICAgfQorICAgICAgICBFUE9OX09BTV9MT0coREVCVUcsIGRhdGEtPmRldmljZV9pZCwgJmNhcC0+a2V5LCAiUnggb3Bjb2RlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgb2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQuY29kZSk7CisgICAgICAgIHN3aXRjaCAob2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQuY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBpZ25vcmUgaW5mbyAtIHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgZW9uICovCisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgICAgICAgICBlcG9uX29hbV9oYW5kbGVfZXZlbnQoZGF0YS0+ZGV2aWNlX2lkLCAmb2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQsICZjYXAtPmtleSwgZGF0YS0+Y2IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkYXRhLT5kZXZpY2VfaWQsICZjYXAtPmtleSwgIlJ4IE9VSSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUub3VpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLm91aSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9oYW5kbGVfZHBvZShkYXRhLT5kZXZpY2VfaWQsICZvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUsICZjYXAtPmtleSwgZGF0YS0+Y2IpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgIGJjbW9sdF9tc2dfZnJlZSgmZGF0YS0+cngtPmhkcik7Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2Rwb2VfaGFuZGxlX2Z3X3VwZ3JhZGVfdGltZW91dChlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKnN0YXRlKQoreworICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgc3RhdGUtPmRldmljZV9pZCwgJnN0YXRlLT5rZXksICJGaXJtd2FyZSB1cGdyYWRlIHRpbWVkIG91dFxuIik7CisgICAgZXBvbl9vYW1fZHBvZV9zZW5kX2FjayhzdGF0ZS0+ZGV2aWNlX2lkLCAmc3RhdGUtPmtleSwgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9USU1FT1VUKTsKKyAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2hhbmRsZV9vc19tc2coYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZXBvbl9vYW1fbXNnICptc2cgPSAoZXBvbl9vYW1fbXNnKilvc19tc2c7CisKKyAgICBzd2l0Y2ggKG1zZy0+b3NfbXNnLnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9TX01TR19JRF9FUE9OX09BTV9QUk9YWV9SWDoKKyAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3Byb3h5X3J4KCZtc2ctPmRhdGEucHJveHlfcngpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT1NfTVNHX0lEX0VQT05fT0FNX1RJTUVPVVQ6CisgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2hhbmRsZV9md191cGdyYWRlX3RpbWVvdXQobXNnLT5kYXRhLnRpbWVvdXQuc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbMF0sICJVbmtub3duIE9TIG1lc3NhZ2UgJXVcbiIsIG1zZy0+b3NfbXNnLnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfcHJveHlfcnggKnJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkICpjYXAgPSAoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopcng7CisgICAgZXBvbl9vYW1fbXNnX2RhdGEgbXNnX2RhdGEgPSB7fTsKKworICAgIGlmICghaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LICE9IHJ4LT5oZHIub2JqX3R5cGUpIHx8CisgICAgICAgIChCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEICE9IHJ4LT5oZHIuc3ViZ3JvdXApIHx8CisgICAgICAgIChjYXAtPmRhdGEuZnJhbWUudmFsWzEyXSAhPSAweDg4KSB8fAorICAgICAgICAoY2FwLT5kYXRhLmZyYW1lLnZhbFsxM10gIT0gMHgwOSkgfHwKKyAgICAgICAgKGNhcC0+ZGF0YS5mcmFtZS52YWxbMTRdICE9IDB4MDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOyAvKiBub3QgT0FNIGZyYW1lIGNhcHR1cmVkIG9uIGEgbGluayAtIGlnbm9yZSAqLworICAgIH0KKworICAgIG1zZ19kYXRhLnByb3h5X3J4LmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICBtc2dfZGF0YS5wcm94eV9yeC5jYiA9IGNiOworICAgIHJjID0gYmNtb2x0X21zZ19jbG9uZSgoYmNtb2x0X21zZyoqKSZtc2dfZGF0YS5wcm94eV9yeC5yeCwgJnJ4LT5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW2RldmljZV9pZF0sICJQcm94eSBSeCBjbG9uZSBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXBvbl9vYW1fc2VuZF9vc19tc2coQkNNT1NfTVNHX0lEX0VQT05fT0FNX1BST1hZX1JYLCAmbXNnX2RhdGEpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKCZtc2dfZGF0YS5wcm94eV9yeC5yeC0+aGRyKTsKKyAgICB9Cit9CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9pbml0KHZvaWQpCit7CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gbW9kdWxlX3BhcmFtcyA9CisgICAgeworICAgICAgICAucXBhcm0gPQorICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJ1c2VyX2FwcGxfZXBvbl9vYW1fbW9kdWxlIiwKKyAgICAgICAgICAgIC5zaXplID0gTUFYX0NPTkNVUlJFTlRfTElOS1MKKyAgICAgICAgfQorICAgIH07CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAidXNlcl9hcHBsX2Vwb25fb2FtX3Rhc2siLAorICAgICAgICAucHJpb3JpdHkgICAgID0gQkNNT1NfVEFTS19QUklPUklUWV8xMiwKKyAgICAgICAgLmNvcmUgICAgICAgICA9IEJDTU9TX0NQVV9DT1JFX0FOWSwgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgICAgIC5pbml0X2hhbmRsZXIgPSBOVUxMCisgICAgfTsKKworICAgIGlmIChpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBpbnQgaTsKKyAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdID0ge307CisgICAgZm9yIChpPTA7IGk8QkNNVFJfTUFYX09MVFM7IGkrKykKKyAgICB7CisgICAgICAgIHNucHJpbnRmKGxvZ19uYW1lLCBzaXplb2YobG9nX25hbWUpLTEsICJlcG9uX29hbSVkIiwgaSk7CisgICAgICAgIGVwb25fb2FtX2xvZ1tpXSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19uYW1lLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9CisjZW5kaWYKKyAgICBkcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgPSBoYXNoX3RhYmxlX2NyZWF0ZShNQVhfQ09OQ1VSUkVOVF9MSU5LUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkcG9lX2Z3X3VwZ3JhZGVfc3RhdGUiKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBiY21vc190YXNrX2NyZWF0ZSgmZXBvbl9vYW1fdGFzaywgJnRhc2tfcGFyYW1zKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRkFUQUwsIGVwb25fb2FtX2xvZ1swXSwgIkZhaWxlZCB0byBjcmVhdGUgRVBPTiBPQU0gdGFzayFcbiIpOworICAgIH0KKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBiY21vc19tb2R1bGVfY3JlYXRlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9PQU0sICZlcG9uX29hbV90YXNrLCAmbW9kdWxlX3BhcmFtcykpCisgICAgeworICAgICAgICBCQ01fTE9HKEZBVEFMLCBlcG9uX29hbV9sb2dbMF0sICJGYWlsZWQgdG8gY3JlYXRlIEVQT04gT0FNIG1vZHVsZSFcbiIpOworICAgIH0KKyAgICBpc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWRjOWVkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fSF8KKworI2luY2x1ZGUgImJjbWNsaS5oIgorI2luY2x1ZGUgImJjbW9sdF9tc2cuaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKworI2RlZmluZSBNQVhfUVVFVUVfU0VUUyAgICAgICAgICA0CisjZGVmaW5lIE1BWF9SRVBPUlRfVEhSRVNIT0xEUyAgIDgKKworc3RhdGljIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzIHNsb3dfcHJvdG9jb2xfbXVsdGljYXN0X21hYyA9IHt7MHgwMSwweDgwLDB4YzIsMHgwMCwweDAwLDB4MDJ9fTsKKworLyogVHlwZWRlZiByZXF1aXJlZCBmb3IgY29udmV5aW5nIGEgMi1kaW1lbnNpb25hbCBhcnJheSB0byBlcG9uX29hbV9kcG9lX3NldF9yZXBvcnRfdGhyZXNob2xkcygpLiAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfZXBvbl9vYW1fcXVldWVfc2V0c1tNQVhfUVVFVUVfU0VUU11bTUFYX1JFUE9SVF9USFJFU0hPTERTXTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9MSU5LX0ZBVUxULAorICAgIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFlJTkdfR0FTUCwKKyAgICBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0NSSVRJQ0FMX0VWRU5ULAorICAgIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFBPRV9FVkVOVCwKKyAgICBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0RQT0VfR0VUX1JFU1BPTlNFLAorICAgIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFBPRV9TRVRfUkVTUE9OU0UsCit9IGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fcnhfaWQ7CisKK3R5cGVkZWYgZW51bQoreworICAgIERQT0VfUlVMRV9WTEFOX01PREVfTk9ORSwKKyAgICBEUE9FX1JVTEVfVkxBTl9NT0RFX0FERCwKKyAgICBEUE9FX1JVTEVfVkxBTl9NT0RFX1JFTU9WRSwKKworICAgIERQT0VfUlVMRV9WTEFOX01PREVfQ09VTlQKK30gZHBvZV9ydWxlX3ZsYW5fbW9kZTsKKworLyogRHVyaW5nIHBhcnNpbmcgb2YgT0FNIGluZGljYXRpb24sIHRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZC4gKi8KK3R5cGVkZWYgdm9pZCAoKmJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiKShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX3J4X2lkIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX2Vycm5vIHJjKTsKKworLyogQ2FsbGJhY2sgJ2NiJyBpcyBvcHRpb25hbC4gKi8KK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcngoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3Byb3h5X3J4ICpyeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcnhfY2IgY2IpOworCitiY21vc19lcnJubyBlcG9uX29hbV9wYWNrX2ZyYW1lKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lLCB1aW50OF90ICoqYnVmZmVyLCB1aW50MTZfdCAqbGVuZ3RoKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fcGFja19hbmRfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZSk7CisKK2JjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqZXBvbl9vYW1fdW5wYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQzMl90IGxlbiwgdWludDhfdCAqYnl0ZXMpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2dldF9jcml0aWNhbF9pbmZvKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9vYW1fcmF0ZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4KTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zZXRfcmVwb3J0X3RocmVzaG9sZHMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcXVldWVfc2V0cyBxdWV1ZV9zZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcXVldWVfc2V0cyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X2VuY3J5cHRpb24oCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlIGVuY19tb2RlLAorICAgIHVpbnQxNl90IHBlcmlvZCk7CisKK2JjbW9zX2Jvb2wgZXBvbl9vYW1faXNfZHBvZShiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbSk7CisKK2JjbW9zX2Jvb2wgZXBvbl9vYW1faXNfZHBvZV9lbmNyeXB0X3Jlc3BvbnNlKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICpkcG9lKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKTsKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWcoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cF9xdWV1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG5fcXVldWVfc2l6ZSk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZV9ydWxlX3ZsYW5fbW9kZSB2bGFuX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF0pOworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZV9ydWxlX3ZsYW5fbW9kZSB2bGFuX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZsYW5fdGFnWzRdKTsKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfd2l0aF92bGFuKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF0pOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2VuYWJsZV91c2VyX3RyYWZmaWMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2Rpc2FibGVfdXNlcl90cmFmZmljKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3N0YXJ0X3VwZ3JhZGUoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZndfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdGltZW91dF9zZWMpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3Jlc2V0X29udShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfZXBvbl9uaSBlcG9uLCBiY21vc19tYWNfYWRkcmVzcyAqbWFjKTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmMwODExCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAoraWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX2Vwb25fb2FtX2NsaQorICAgIE1PRF9UWVBFID0gbGliCisJTU9EX0RFUFMgPSB1dGlscyBkZXZfbG9nIGNvbW1vbl9lcG9uX29hbSBiY21fdXNlcl9hcHBsX2Vwb25fb2FtCisgICAgc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmMKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOGVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaS5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbWF0aC5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF9lcG9uX29hbV90eXBlcy5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9nZXRfY3JpdGljYWxfaW5mb19jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2dldF9jcml0aWNhbF9pbmZvKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisgICAgdWludDhfdCBtaW4gPSAodWludDhfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW4iKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50OF90IG1heCA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjLCBtaW4sIG1heCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9yZXBvcnRfdGhyZXNob2xkc19jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworICAgIGJjbWNsaV9jbWRfcGFybSAqcXVldWVfc2V0X3Bhcm1zW01BWF9RVUVVRV9TRVRTXTsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9xdWV1ZV9zZXRzIHF1ZXVlX3NldHM7CisgICAgdWludDhfdCBpLCBqLCBudW1fcXVldWVfc2V0cyA9IDA7CisKKyAgICAvKiBwcm9jZXNzIGlucHV0ICovCisgICAgcXVldWVfc2V0X3Bhcm1zWzBdID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicXVldWVfMCIpOworICAgIHF1ZXVlX3NldF9wYXJtc1sxXSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInF1ZXVlXzEiKTsKKyAgICBxdWV1ZV9zZXRfcGFybXNbMl0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJxdWV1ZV8yIik7CisgICAgcXVldWVfc2V0X3Bhcm1zWzNdID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicXVldWVfMyIpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0VUUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gcXVldWVfc2V0X3Bhcm1zW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBudW1fcXVldWVfc2V0cysrOworICAgICAgICAgICAgaWYgKHF1ZXVlX3NldF9wYXJtc1tpXS0+YXJyYXlfc2l6ZSAhPSBxdWV1ZV9zZXRfcGFybXNbMF0tPmFycmF5X3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkFsbCBxdWV1ZSBzZXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgcmVwb3J0IHRocmVzaG9sZHMhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHF1ZXVlX3NldF9wYXJtc1tpXS0+YXJyYXlfc2l6ZTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9zZXRfcGFybXNbaV0tPnZhbHVlc1tqXS51bnVtYmVyID4gNjU1MzUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUXVldWUgU2V0ICV1LCBUaHJlc2hvbGQgJXU6ICVsdSBpcyBub3QgYSB2YWxpZCByZXBvcnQgdGhyZXNob2xkIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgcXVldWVfc2V0X3Bhcm1zW2ldLT52YWx1ZXNbal0udW51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHF1ZXVlX3NldHNbaV1bal0gPSAodWludDE2X3QpcXVldWVfc2V0X3Bhcm1zW2ldLT52YWx1ZXNbal0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgTUFYX1FVRVVFX1NFVFM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBxdWV1ZV9zZXRfcGFybXNbal0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiSW5jbHVkZWQgcXVldWUgc2V0cyBtdXN0IGJlIHNlcXVlbnRpYWwgZnJvbSAwIVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzKGN1cnJlbnRfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV9zZXRfcGFybXNbMF0tPmFycmF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3NldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9xdWV1ZV9zZXRzKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbl9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnRfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlcyhjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWdfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworICAgIHVpbnQ4X3QgdXBfcXVldWVfc2l6ZSA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwX3NpemUiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50OF90IGRuX3F1ZXVlX3NpemUgPSAodWludDhfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkbl9zaXplIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9zZXRfYmFzaWNfcXVldWVfY29uZmlnKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjLCB1cF9xdWV1ZV9zaXplLCBkbl9xdWV1ZV9zaXplKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb25fY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbihjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYywgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FLCBOVUxMKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0X2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMsIERQT0VfUlVMRV9WTEFOX01PREVfTk9ORSwgTlVMTCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXMoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW5fY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKyAgICB1aW50MzJfdCB2bGFuID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbiIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF07CisKKyAgICB2bGFuID0gQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTMyKHZsYW4pOworICAgIHZsYW5fdGFnWzBdID0gKHZsYW4gPj4gMjQpICYgMHhmZjsKKyAgICB2bGFuX3RhZ1sxXSA9ICh2bGFuID4+IDE2KSAmIDB4ZmY7CisgICAgdmxhbl90YWdbMl0gPSAodmxhbiA+PiA4KSAmIDB4ZmY7CisgICAgdmxhbl90YWdbM10gPSAodmxhbiA+PiAwKSAmIDB4ZmY7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW4oY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMsIHZsYW5fdGFnKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZW5hYmxlX3VzZXJfdHJhZmZpY19jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9lbmFibGVfdXNlcl90cmFmZmljKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZV9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisgICAgY29uc3QgY2hhciAqZndfZmlsZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZ3X2ZpbGUiKS0+dmFsdWUuc3RyaW5nOworICAgIC8qIFRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBuZWdvdGlhdGVkIFBEVSBzaXplISAqLworICAgIHVpbnQxNl90IGJsb2NrX3NpemUgPSAodWludDE2X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmxvY2tfc2l6ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3QgdGltZW91dCA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpbWVvdXQiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX3N0YXJ0X3VwZ3JhZGUoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMsIGZ3X2ZpbGUsIGJsb2NrX3NpemUsIHRpbWVvdXQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9yZXNldF9vbnVfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX3Jlc2V0X29udShjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYyk7Cit9CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisjaWZkZWYgRU5BQkxFX0NMSQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpkaXJfbmFtZSA9ICJlcG9uX29hbSI7CisKKyAgICBpZiAoYmNtY2xpX2Rpcl9maW5kKHRvcF9kaXIsIGRpcl9uYW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBiY21jbGlfZW50cnkgKm9hbV9kaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCBkaXJfbmFtZSwgIkVQT04gT0FNIiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQlVHX09OKE5VTEwgPT0gb2FtX2Rpcik7CisKKyAgICBzdGF0aWMgYmNtY2xpX3Bhcm1fdmFsdWUgcXVldWVfMFtNQVhfUkVQT1JUX1RIUkVTSE9MRFNdOworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBxdWV1ZV8xW01BWF9SRVBPUlRfVEhSRVNIT0xEU107CisgICAgc3RhdGljIGJjbWNsaV9wYXJtX3ZhbHVlIHF1ZXVlXzJbTUFYX1JFUE9SVF9USFJFU0hPTERTXTsKKyAgICBzdGF0aWMgYmNtY2xpX3Bhcm1fdmFsdWUgcXVldWVfM1tNQVhfUkVQT1JUX1RIUkVTSE9MRFNdOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2dldF9jcml0aWNhbF9pbmZvIiwgIkRQb0UgZ2V0IE9OVSBJRCBhbmQgbWF4IGxpbmtzIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9nZXRfY3JpdGljYWxfaW5mb19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX3NldF9vYW1fcmF0ZSIsICJEUG9FIHNldCBPQU0gcmF0ZSIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWluIiwgIk1pbmltdW0gT0FNIHJhdGUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWF4IiwgIk1heGltdW0gT0FNIHJhdGUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzIiwgIkRQb0Ugc2V0IHJlcG9ydCB0aHJlaHNvbGRzIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZXRfcmVwb3J0X3RocmVzaG9sZHNfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0FSUkFZKCJxdWV1ZV8wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVwb3J0IHRocmVoc29sZCBmb3IgcXVldWUgc2V0IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9SRVBPUlRfVEhSRVNIT0xEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV8wKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9BUlJBWSgicXVldWVfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcG9ydCB0aHJlaHNvbGQgZm9yIHF1ZXVlIHNldCAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1JFUE9SVF9USFJFU0hPTERTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXzEpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0FSUkFZKCJxdWV1ZV8yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVwb3J0IHRocmVoc29sZCBmb3IgcXVldWUgc2V0IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUkVQT1JUX1RIUkVTSE9MRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfMiksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoInF1ZXVlXzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBvcnQgdGhyZWhzb2xkIGZvciBxdWV1ZSBzZXQgMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9SRVBPUlRfVEhSRVNIT0xEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV8zKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbiIsICJEUG9FIGNsZWFyIGluZ3Jlc3MgcnVsZXMgZm9yIG5ldHdvcmsgUE9OIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0IiwgIkRQb0UgY2xlYXIgaW5ncmVzcyBydWxlcyBmb3IgdXNlciBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydF9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzIiwgIkRQb0UgY2xlYXIgaW5ncmVzcyBydWxlcyIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWciLCAiRFBvRSBzZXQgYmFzaWMgcXVldWUgY29uZmlnIGZvciAxIGxpbmsvMSBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZXRfYmFzaWNfcXVldWVfY29uZmlnX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidXBfc2l6ZSIsICJ1cHN0cmVhbSBxdWV1ZSBzaXplIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImRuX3NpemUiLCAiZG93bnN0cmVhbSBxdWV1ZSBzaXplIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uIiwgIkRQb0UgYWRkIGluZ3Jlc3MgcnVsZXMgZm9yIG5ldHdvcmsgUE9OIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbl9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9hZGRfaW5ncmVzc19ydWxlc191c2VyX3BvcnQiLCAiRFBvRSBhZGQgaW5ncmVzcyBydWxlcyBmb3IgdXNlciBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc191c2VyX3BvcnRfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfYWRkX2luZ3Jlc3NfcnVsZXMiLCAiRFBvRSBhZGQgaW5ncmVzcyBydWxlcyIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfd2l0aF92bGFuIiwgIkRQb0UgYWRkIGluZ3Jlc3MgcnVsZXMgd2l0aCBWTEFOIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW5fY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2bGFuIiwgIlZMQU4iLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfZW5hYmxlX3VzZXJfdHJhZmZpYyIsICJEUG9FIGVuYWJsZSB1c2VyIHRyYWZmaWMiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2VuYWJsZV91c2VyX3RyYWZmaWNfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9md191cGdyYWRlIiwgIkRQb0UgZmlyd21hcmUgdXBncmFkZSIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZV9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZ3X2ZpbGUiLCAiRmlybXdhcmUgZmlsZSIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImJsb2NrX3NpemUiLCAiQmxvY2sgc2l6ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0aW1lb3V0IiwgIlRpbWVvdXQgaW4gc2Vjb25kcyIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9yZXNldF9vbnUiLCAiRFBvRSByZXNldCBPTlUiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3Jlc2V0X29udV9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjRhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX0NMSV9IXworCisjaW5jbHVkZSAiYmNtY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM5MmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjIEZpbGUgdHJhbnNmZXIgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21faW1hZ2VfdHJhbnNmZXIKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gaG9zdF9hcGkKKyAgICBzcmNzID0gYmNtb2x0X2ltYWdlX3RyYW5zZmVyLmMgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuYyBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmMKKyAgICAKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICAgICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorICAgIGVuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXIuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4NWVhYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyLmMKQEAgLTAsMCArMSw1MDcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbXRyX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgImJjbW9sdF9hcGkuaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlci5oIgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmgiCisKK3N0YXRpYyBiY211c2VyX21mdHBfYmxvY2tfc2l6ZV9nZXQgbWZ0cF9ibG9ja19zaXplX2dldDsKK3N0YXRpYyBiY211c2VyX21mdHBfY3JjX2dldCBtZnRwX2NyY19nZXRfY2I7CitzdGF0aWMgYmNtdXNlcl9tZnRwX2ltYWdlX3JlYWQgbWZ0cF9yZWFkX2RhdGFfY2I7CitzdGF0aWMgYmNtdXNlcl9tZnRwX25vdGlmaWNhdGlvbl9yeCBtZnRwX25vdGlmeV91c2VyX2NiOworc3RhdGljIG1mdHBfY29udGV4dCBtZnRwX2NvbnRleHRfZGJbQkNNVFJfTUFYX09MVFNdOworCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9pbmRfcnhfY2JfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSk7CitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9pbmRfcnhfY2JfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIG1mdHBfZXJyX3RvX3N0YXR1cyhiY21vc19lcnJubyBlcnIpCit7CisgICAgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXM7CisgICAgc3dpdGNoIChlcnIpCisgICAgeworICAgIGNhc2UgQkNNX0VSUl9PSzoKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9FUlJfTk9NRU06CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfTUVNT1JZX0FMTE9DQVRJT05fRkFJTFVSRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01fRVJSX0lOQ09NUExFVEVfVEVSTUlOQVRJT046CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfUFJFTUFUVVJFX1RFUk1JTkFUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9FUlJfQ0hFQ0tTVU06CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQ1JDX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9FUlJfT1ZFUkZMT1c6CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5URVJOQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9PVVRfT0ZfU1lOQzoKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01fRVJSX1NUQVRFOgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9JTUFHRV9UWVBFOgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1VOU1VQUE9SVEVEX0ZJTEVfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjb25zdCBjaGFyICpiY21vbHRfdXNlcl9tZnRwX3N0YXR1c190b19zdHIoYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXMpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKm1mdHBfc3RhdHVzX3RvX3N0cl90YWJsZVtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX19OVU1fT0ZdID0KKyAgICB7CisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1NVQ0NFU1NdID0gIlN1Y2NlZWRlZCIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX01FTU9SWV9BTExPQ0FUSU9OX0ZBSUxVUkVdID0gIkVSUk9SOiBNZW1vcnkgYWxsb2NhdGlvbiIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1VOU1VQUE9SVEVEX0ZJTEVfVFlQRV0gPSAiRVJST1I6IEludmFsaWQgaW1hZ2UgdHlwZSIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0NSQ19FUlJPUl0gPSAiRVJST1I6IENoZWNrc3VtIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQkxPQ0tfT1VUX09GX1NZTkNdID0gIkVSUk9SOiBCbG9jayBvdXQtb2Ytc3luYyIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOVEVSTkFMX0VSUk9SXSA9ICJFUlJPUjogQnVmZmVyIG92ZXJmbG93IiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5WQUxJRF9TVEFURV0gPSAiRVJST1I6IEludmFsaWQgc3RhdGUiLAorICAgICAgICBbQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19QUkVNQVRVUkVfVEVSTUlOQVRJT05dID0gIkVSUk9SOiBQcmVtYXR1cmUgdGVybWluYXRpb24iLAorICAgICAgICBbQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19BQ0tfVElNRU9VVF0gPSAiRVJST1I6IEFDSyB0aW1lb3V0IgorICAgIH07CisgICAgcmV0dXJuIChzdGF0dXMgPj0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19fTlVNX09GKSA/ICI8dW5rbm93bj4iIDogbWZ0cF9zdGF0dXNfdG9fc3RyX3RhYmxlW3N0YXR1c107Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgaW5saW5lIG1mdHBfY29udGV4dCAqbWZ0cF9jb250ZXh0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIHJldHVybiAmbWZ0cF9jb250ZXh0X2RiW2RldmljZV07Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiogY29udmVydCBkZXZpY2UgSUQgdG8gbW9kdWxlIElEICovCitzdGF0aWMgaW5saW5lIGJjbW9zX21vZHVsZV9pZCBtZnRwX2RldmljZV9pZF90b19tb2R1bGVfaWQoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICByZXR1cm4gKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfSU1BR0VfVFJBTlNGRVIwICsgZGV2aWNlKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBleGFtaW5lcyB0aGUgQUNLIHJlc3BvbnNlLiAqLworc3RhdGljIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgbWZ0cF9jaGVja19wYXJhbXMobWZ0cF9jb250ZXh0ICpjb250ZXh0LAorICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqYWNrX2RhdGEpCit7CisgICAgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBpZiAoY29udGV4dC0+YmxvY2tfbnVtICE9IGFja19kYXRhLT5ibG9ja19udW1iZXIpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICJBQ0sgYmxvY2sgIyBtaXNtYXRjaDogZXhwPSV1IGFjaz0ldVxuIiwgY29udGV4dC0+YmxvY2tfbnVtLCBhY2tfZGF0YS0+YmxvY2tfbnVtYmVyKTsKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQzsKKyAgICB9CisgICAgZWxzZSBpZiAoY29udGV4dC0+aW1hZ2VfdHlwZSAhPSBhY2tfZGF0YS0+aW1hZ2VfdHlwZSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIkFDSyBpbWFnZSB0eXBlIG1pc21hdGNoOiBleHA9JXUgYWNrPSV1XG4iLCBjb250ZXh0LT5pbWFnZV90eXBlLCBhY2tfZGF0YS0+aW1hZ2VfdHlwZSk7CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFOworICAgIH0KKyAgICBlbHNlIGlmIChhY2tfZGF0YS0+c3RhdHVzICE9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIk9MVCByZXR1cm5lZCBhbiBlcnJvcjogJXNcbiIsIGJjbW9sdF91c2VyX21mdHBfc3RhdHVzX3RvX3N0cihhY2tfZGF0YS0+c3RhdHVzKSk7CisgICAgICAgIHN0YXR1cyA9IGFja19kYXRhLT5zdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgdm9pZCBtZnRwX3Rlcm1pbmF0ZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBibG9ja19udW0sIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgc3RhdHVzKQoreworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICBiY21vc19lcnJubyByYyA9IG1mdHBfaW5kX3J4X2NiX3VucmVnaXN0ZXIoZGV2aWNlKTsKKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiRmFpbGVkIHRvIHVuLXJlZ2lzdGVyIElORCBjYWxsYmFja1xuIik7CisgICAgfQorICAgIG1mdHBfbm90aWZ5X3VzZXJfY2IoZGV2aWNlLCBpbWFnZV90eXBlLCBibG9ja19udW0sIHN0YXR1cyk7CisgICAgY29udGV4dC0+c3RhdHVzID0gTUZUUF9TVEFUVVNfRElTQUJMRUQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiogU2VuZHMgdGhlIGltYWdlIHRyYW5zZmVyIHN0YXJ0IG9wZXJhdGlvbiB0byB0aGUgT0xULiAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfc2VuZF93cnEoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3QgaW1hZ2Vfc2l6ZSwgdWludDMyX3QgY3JjMzIsIGJjbW9sdF9zdHJfNjQgKmltYWdlX25hbWUpCit7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCBvcGVyOworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3R5cGUsIGltYWdlX3R5cGUpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9zaXplLCBpbWFnZV9zaXplKTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgY3JjMzIsIGNyYzMyKTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfbmFtZSwgKmltYWdlX25hbWUpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlLCAmb3Blci5oZHIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqIFNlbmRzIGEgZGF0YSBibG9jayB0byB0aGUgT0xULiAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfc2VuZF9kYXRhKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX3NpemUsCisgICAgdWludDMyX3QgYmxvY2tfbnVtYmVyLCBiY21vc19ib29sIG1vcmVfZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7LnJlc2VydmVkID0gMH07CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhIG9wZXIgPSB7fTsKKyAgICBiY21vbHRfdThfbGlzdF91MTZfaGV4IGRhdGE7CisgICAgZGF0YS5sZW4gPSBidWZfc2l6ZTsKKyAgICBkYXRhLnZhbCA9IGJ1ZjsKKworICAgIC8qIEJ1aWxkcyBhIHRyYW5zcG9ydCBtZXNzYWdlIGZvciBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQSAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwga2V5KTsKKyAgICBvcGVyLmhkci5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9TRVQ7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgYmxvY2tfbnVtYmVyLCBibG9ja19udW1iZXIpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIG1vcmVfZGF0YSwgbW9yZV9kYXRhKTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBkYXRhLCBkYXRhKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZSwgJm9wZXIuaGRyKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIGhhbmRsZXIgZm9yIHRoZSBPUEVSQVRJT04gZGV2aWNlLmltYWdlX3RyYW5zZmVyX3N0YXJ0LiAqLworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfbWZ0cF9zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSkKK3sKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisgICAgdWludDMyX3QgaW1hZ2Vfc2l6ZTsKKyAgICB1aW50MzJfdCBjcmMzMjsKKyAgICBjb25zdCBjaGFyICpwYXRoX25hbWU7CisgICAgY2hhciBmaWxlX25hbWVbTUZUUF9NQVhfUEFUSF9OQU1FX0xFTl07CisgICAgY2hhciAqYmFzZV9uYW1lOworICAgIGJjbW9sdF9zdHJfNjQgaW1hZ2VfbmFtZTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoY29udGV4dC0+c3RhdHVzICE9IE1GVFBfU1RBVFVTX0RJU0FCTEVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5fUFJPR1JFU1M7CisgICAgfQorCisgICAgcmMgPSBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfc2l6ZV9nZXQoZGV2aWNlLCBpbWFnZV90eXBlLCAmaW1hZ2Vfc2l6ZSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJGYWlsZWQgdG8gZ2V0IHRoZSBpbWFnZSBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHBhdGhfbmFtZSA9IGJjbXVzZXJfZGV2aWNlX2ltYWdlX25hbWVfZ2V0KGltYWdlX3R5cGUpOworICAgIGlmIChwYXRoX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGNvbnRleHQtPmxvZ19pZCwgIkZpbGUgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHN0cmxlbihwYXRoX25hbWUpID49IHNpemVvZihmaWxlX25hbWUpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiUGF0aCBuYW1lIHRvbyBsb25nXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKHZvaWQpc3RyY3B5KGZpbGVfbmFtZSwgcGF0aF9uYW1lKTsgICAgICAgLyogdG8gbWFrZSBsaW50IGhhcHB5LiAqLworCisgICAgYmFzZV9uYW1lID0gYmFzZW5hbWUoZmlsZV9uYW1lKTsKKyAgICBpZiAoc3RybGVuKGJhc2VfbmFtZSkgPj0gc2l6ZW9mKGltYWdlX25hbWUpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiRmlsZSBuYW1lIHRvbyBsb25nXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKHZvaWQpc3RyY3B5KGltYWdlX25hbWUuc3RyLCBiYXNlX25hbWUpOworCisgICAgY29udGV4dC0+c3RhdHVzID0gTUZUUF9TVEFUVVNfV0FJVElOR19BQ0s7CisgICAgY29udGV4dC0+YmxvY2tfbnVtID0gMDsKKyAgICBjb250ZXh0LT5pbWFnZV90eXBlID0gaW1hZ2VfdHlwZTsKKyAgICBjcmMzMiA9IG1mdHBfY3JjX2dldF9jYihkZXZpY2UsIGltYWdlX3R5cGUpOworICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIkltYWdlIHNpemU9JXUgY3JjPTB4JXhcbiIsIGltYWdlX3NpemUsIGNyYzMyKTsKKworICAgIHJjID0gbWZ0cF9pbmRfcnhfY2JfcmVnaXN0ZXIoZGV2aWNlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGNvbnRleHQtPmxvZ19pZCwgIkZhaWxlZCB0byByZWdpc3RlciBJTkQgY2FsbGJhY2tcbiIpOworICAgICAgICBCVUcoKTsKKyAgICB9CisKKyAgICByYyA9IG1mdHBfc2VuZF93cnEoZGV2aWNlLCBpbWFnZV90eXBlLCBpbWFnZV9zaXplLCBjcmMzMiwgJmltYWdlX25hbWUpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiV1JRIE9QRVIgZmFpbGVkLiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgKHZvaWQpbWZ0cF9pbmRfcnhfY2JfdW5yZWdpc3RlcihkZXZpY2UpOworICAgICAgICBjb250ZXh0LT5zdGF0dXMgPSBNRlRQX1NUQVRVU19ESVNBQkxFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmNvbnRleHQtPnRpbWVyLCBNRlRQX0FDS19USU1FT1VUX1VTKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIHZvaWQgbWZ0cF9wcm9jZXNzX2xhc3RfYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqYWNrX2RhdGEpCit7CisgICAgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXM7CisgICAgbWZ0cF9jb250ZXh0ICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChkZXZpY2UpOworCisgICAgc3RhdHVzID0gbWZ0cF9jaGVja19wYXJhbXMoY29udGV4dCwgYWNrX2RhdGEpOworICAgIG1mdHBfdGVybWluYXRlKGRldmljZSwgYWNrX2RhdGEtPmltYWdlX3R5cGUsIGFja19kYXRhLT5ibG9ja19udW1iZXIsIHN0YXR1cyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiByZWFkcyBhIGRhdGEgYmxvY2sgdXNpbmcgY3VzdG9tZXItcHJvdmlkZWQgY2FsbGJhY2sgYW5kIHNlbmRzIGl0IHRvIHRoZSBlbWJlZGRlZC4gKi8KK3N0YXRpYyB2b2lkIG1mdHBfcHJvY2Vzc19hY2soYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhICphY2tfZGF0YSkKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOyAgICAvKiBmaWxlLXBvc2l0aW9uKi8KKyAgICB1aW50MzJfdCBieXRlc19yZWFkID0gMDsKKyAgICBiY21vc19ib29sIG1vcmVfZGF0YTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXM7CisgICAgbWZ0cF9jb250ZXh0ICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChkZXZpY2UpOworCisgICAgc3RhdHVzID0gbWZ0cF9jaGVja19wYXJhbXMoY29udGV4dCwgYWNrX2RhdGEpOworICAgIGlmIChzdGF0dXMgIT0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbWZ0cF90ZXJtaW5hdGUoZGV2aWNlLCBjb250ZXh0LT5pbWFnZV90eXBlLCBhY2tfZGF0YS0+YmxvY2tfbnVtYmVyLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gKGNvbnRleHQtPmJsb2NrX251bSAqIGNvbnRleHQtPmJsb2NrX3NpemUpOworICAgIGNvbnRleHQtPmJsb2NrX251bSsrOworCisgICAgLyogQ0FMTCBDVVNUT01FUi1QUk9WSURFRCBDQUxMQkFDSyAqLworICAgIGJ5dGVzX3JlYWQgPSBtZnRwX3JlYWRfZGF0YV9jYihkZXZpY2UsIGNvbnRleHQtPmltYWdlX3R5cGUsIG9mZnNldCwKKyAgICAgICAgY29udGV4dC0+YnVmLCBjb250ZXh0LT5ibG9ja19zaXplKTsgIC8qIGJjbXVzZXJfbWZ0cF9yZWFkX2RhdGEoKSAqLworCisgICAgbW9yZV9kYXRhID0gIShieXRlc19yZWFkIDwgY29udGV4dC0+YmxvY2tfc2l6ZSk7CisKKyAgICByYyA9IG1mdHBfc2VuZF9kYXRhKGRldmljZSwgY29udGV4dC0+YnVmLCBieXRlc19yZWFkLCBjb250ZXh0LT5ibG9ja19udW0sIG1vcmVfZGF0YSk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICJEQVRBIE9QRVIgZmFpbGVkLiBCbG9jayAldS4gJXNcbiIsIGNvbnRleHQtPmJsb2NrX251bSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgbWZ0cF90ZXJtaW5hdGUoZGV2aWNlLCBhY2tfZGF0YS0+aW1hZ2VfdHlwZSwgYWNrX2RhdGEtPmJsb2NrX251bWJlciwgbWZ0cF9lcnJfdG9fc3RhdHVzKHJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICJTZW50IGJsb2NrIz0ldSBidWZfc2l6ZT0ldSBtb3JlPSV1XG4iLCBjb250ZXh0LT5ibG9ja19udW0sIGJ5dGVzX3JlYWQsIG1vcmVfZGF0YSk7CisKKyAgICBjb250ZXh0LT5zdGF0dXMgPSAobW9yZV9kYXRhKSA/IE1GVFBfU1RBVFVTX1dBSVRJTkdfQUNLIDogTUZUUF9TVEFUVVNfV0FJVElOR19MQVNUX0FDSzsKKworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZjb250ZXh0LT50aW1lciwgTUZUUF9BQ0tfVElNRU9VVF9VUyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBBQ0sgaW5kaWNhdGlvbiBjYWxsYmFjayAqLworc3RhdGljIHZvaWQgbWZ0cF9wcm9jZXNzX2luZChiY21vbHRfZGV2aWQgb2x0LCBiY21vbHRfbXNnICptc2cpCit7CisgICAgbWZ0cF9jb250ZXh0ICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChvbHQpOworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUgKmFjazsKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgKmFja19kYXRhOworCisgICAgYWNrID0gKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUgKiltc2c7CisgICAgYWNrX2RhdGEgPSAmYWNrLT5kYXRhOworCisgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiIyMgQUNLOiBvYmo9JXUsIGdyb3VwPSV1LCBpbWFnZT0ldSwgYmxvY2s9JXUsIHN0YXR1cz0ldVxuIiwKKyAgICAgICAgbXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgYWNrX2RhdGEtPmltYWdlX3R5cGUsIGFja19kYXRhLT5ibG9ja19udW1iZXIsIGFja19kYXRhLT5zdGF0dXMpOworCisgICAgc3dpdGNoIChjb250ZXh0LT5zdGF0dXMpCisgICAgeworICAgIGNhc2UgTUZUUF9TVEFUVVNfV0FJVElOR19BQ0s6CisgICAgICAgIGJjbW9zX3RpbWVyX3N0b3AoJmNvbnRleHQtPnRpbWVyKTsKKyAgICAgICAgbWZ0cF9wcm9jZXNzX2FjayhvbHQsIGFja19kYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRlRQX1NUQVRVU19XQUlUSU5HX0xBU1RfQUNLOgorICAgICAgICBiY21vc190aW1lcl9zdG9wKCZjb250ZXh0LT50aW1lcik7CisgICAgICAgIG1mdHBfcHJvY2Vzc19sYXN0X2FjayhvbHQsIGFja19kYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogVGhpcyBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgU1RBUlQgb3BlcmF0aW9uIGZhaWxzLiAqLworICAgICAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICJVbmV4cGVjdGVkIEFDS1xuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfaW5kX3J4X2NiX3JlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHRwYXJtID0geworICAgICAgICAuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FVVE8sCisgICAgICAgIC5vYmplY3QgPSBCQ01PTFRfT0JKX0lEX0RFVklDRSwKKyAgICAgICAgLnN1Ymdyb3VwID0gQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFLAorICAgICAgICAuYXBwX2NiID0gbWZ0cF9wcm9jZXNzX2luZCwKKyAgICAgICAgLmZsYWdzID0gQkNNT0xUX0FVVE9fRkxBR1NfRElTUEFUQ0gsCisgICAgfTsKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisgICAgdWludDhfdCBpbnN0OworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHRwYXJtLm1vZHVsZSA9IGNvbnRleHQtPm1vZHVsZV9pZDsKKworICAgIGZvciAoaW5zdCA9IDA7IChpbnN0IDwgQkNNVFJfTUFYX0lOU1RBTkNFUykgJiYgKHJjID09IEJDTV9FUlJfT0spOyBpbnN0KyspCisgICAgeworICAgICAgICB0cGFybS5pbnN0YW5jZSA9IGluc3Q7CisgICAgICAgIHJjID0gYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihkZXZpY2UsICZ0cGFybSk7CisgICAgICAgIHJjID0gKHJjID09IEJDTV9FUlJfT0spID8gYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXIoZGV2aWNlLCAmdHBhcm0pIDogcmM7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luZF9yeF9jYl91bnJlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHRwYXJtID0geworICAgICAgICAuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FVVE8sCisgICAgICAgIC5vYmplY3QgPSBCQ01PTFRfT0JKX0lEX0RFVklDRSwKKyAgICAgICAgLnN1Ymdyb3VwID0gQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFLAorICAgIH07CisgICAgdWludDhfdCBpbnN0OworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGZvciAoaW5zdCA9IDA7IChpbnN0IDwgQkNNVFJfTUFYX0lOU1RBTkNFUykgJiYgKHJjID09IEJDTV9FUlJfT0spOyBpbnN0KyspCisgICAgeworICAgICAgICB0cGFybS5pbnN0YW5jZSA9IGluc3Q7CisgICAgICAgIHJjID0gYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihkZXZpY2UsICZ0cGFybSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEFDSyByZXNwb25zZSB0aW1lb3V0IGhhbmRsZXIgKi8KK3N0YXRpYyBiY21vc190aW1lcl9yYyBtZnRwX2Fja190aW1lb3V0X2hhbmRsZXIoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpZGF0YTsKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisKKyAgICBpZiAoKGNvbnRleHQtPnN0YXR1cyA9PSBNRlRQX1NUQVRVU19XQUlUSU5HX0FDSykgfHwgKGNvbnRleHQtPnN0YXR1cyA9PSBNRlRQX1NUQVRVU19XQUlUSU5HX0xBU1RfQUNLKSkKKyAgICB7CisgICAgICAgIG1mdHBfdGVybWluYXRlKGRldmljZSwgY29udGV4dC0+aW1hZ2VfdHlwZSwgY29udGV4dC0+YmxvY2tfbnVtLCBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0FDS19USU1FT1VUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBjb250ZXh0LT5sb2dfaWQsICJ0aW1lciBpbiBpcnJlbGV2YW50IHN0YXRlXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX1NUT1A7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9pbml0X3RpbWVycyhiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICBiY21vc190aW1lcl9wYXJtIHRpbWVyX3BhcmFtcyA9IHt9OworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIElmIHRpbWVyIHdhcyBhbHJlYWR5IGNyZWF0ZWQsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byByZS1jcmVhdGUgaXQgKi8KKyAgICBpZiAoKGNvbnRleHQtPnRpbWVyLmZsYWdzICYgQkNNT1NfVElNRVJfRkxBR19WQUxJRCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICB0aW1lcl9wYXJhbXMubmFtZSAgICAgPSBjb250ZXh0LT5uYW1lOworICAgIHRpbWVyX3BhcmFtcy5vd25lciAgICA9IGNvbnRleHQtPm1vZHVsZV9pZDsKKyAgICB0aW1lcl9wYXJhbXMucGVyaW9kaWMgPSBCQ01PU19GQUxTRTsKKyAgICB0aW1lcl9wYXJhbXMuaGFuZGxlciAgPSBtZnRwX2Fja190aW1lb3V0X2hhbmRsZXI7CisgICAgdGltZXJfcGFyYW1zLmRhdGEgICAgID0gKGxvbmcpZGV2aWNlOworCisgICAgcmMgPSBiY21vc190aW1lcl9jcmVhdGUoJmNvbnRleHQtPnRpbWVyLCAmdGltZXJfcGFyYW1zKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGNvbnRleHQtPmxvZ19pZCwgIlRpbWVyIGNyZWF0aW9uIGZhaWxlZC4gJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luaXRfdGFza3MoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBtZnRwX2NvbnRleHQgICAgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisgICAgYmNtb3NfdGFza19wYXJtICB0YXNrX3BhcmFtcyA9IHt9OworICAgIGJjbW9zX2Vycm5vICAgICAgcmMgPSBCQ01fRVJSX09LOworCisgICAgdGFza19wYXJhbXMubmFtZSAgICAgICAgID0gY29udGV4dC0+bmFtZTsKKyAgICB0YXNrX3BhcmFtcy5wcmlvcml0eSAgICAgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9JTUFHRV9UUkFOU0ZFUjsKKyAgICB0YXNrX3BhcmFtcy5jb3JlICAgICAgICAgPSBCQ01PU19DUFVfQ09SRV9BTlk7IC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgIHRhc2tfcGFyYW1zLmluaXRfaGFuZGxlciA9IE5VTEw7CisgICAgdGFza19wYXJhbXMuZGF0YSAgICAgICAgID0gKGxvbmcpZGV2aWNlOworCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmY29udGV4dC0+dGFzaywgJnRhc2tfcGFyYW1zKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGNvbnRleHQtPmxvZ19pZCwgIlRhc2sgY3JlYXRpb24gZmFpbGVkLiAlcyBcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luaXRfbW9kdWxlcyhiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIG1mdHBfY29udGV4dCAgICAgICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChkZXZpY2UpOworICAgIGJjbW9zX21vZHVsZV9wYXJtICBtb2R1bGVfcGFyYW1zID0ge307CisgICAgYmNtb3NfZXJybm8gICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGNvbnRleHQtPm1vZHVsZV9pZCA9IG1mdHBfZGV2aWNlX2lkX3RvX21vZHVsZV9pZChkZXZpY2UpOworICAgIG1vZHVsZV9wYXJhbXMucXBhcm0ubmFtZSA9IGNvbnRleHQtPm5hbWU7CisgICAgbW9kdWxlX3BhcmFtcy5xcGFybS5zaXplID0gQkNNT1NfTVNHX1BPT0xfREVGQVVMVF9TSVpFOworICAgIG1vZHVsZV9wYXJhbXMuaW5pdCAgICAgICA9IE5VTEw7CisKKyAgICByYyA9IGJjbW9zX21vZHVsZV9jcmVhdGUoY29udGV4dC0+bW9kdWxlX2lkLCAmY29udGV4dC0+dGFzaywgJm1vZHVsZV9wYXJhbXMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiTW9kdWxlIGNyZWF0aW9uIGZhaWxlZC4gJXMgXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBJbml0aWFsaXplcyB0aGUgTUZUUCBwYXJhbWV0ZXJzLiAqLwordm9pZCBiY21vbHRfdXNlcl9tZnRwX2luaXQodm9pZCkKK3sKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQ7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBUaGUgY3VzdG9tZXIgc2hvdWxkIHByb3ZpZGUgdGhlc2UgY2FsbGJhY2sgZnVuY3Rpb25zLiAqLworICAgIG1mdHBfcmVhZF9kYXRhX2NiID0gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9yZWFkX2RhdGE7CisgICAgbWZ0cF9ub3RpZnlfdXNlcl9jYiA9IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfbm90aWZpY2F0aW9uX3J4OworICAgIG1mdHBfYmxvY2tfc2l6ZV9nZXQgPSBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2Jsb2NrX3NpemVfZ2V0OworICAgIG1mdHBfY3JjX2dldF9jYiA9IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfY3JjX2dldDsKKworICAgIC8qIGluaXRpYWxpemUgc29tZSBwYXJhbWV0ZXJzLCBpLmUuIHRoZSAuc3RhdHVzIGFuZCAudGltZXIuCisgICAgICAgb3RoZXIgcGFyYW1ldGVycyBhcmUgKHJlKWJ1aWx0IHVwb24gU1RBUlQsIHNvIG5vIG5lZWQgdG8gaW5pdC4gKi8KKyAgICBmb3IgKGRldmljZSA9IDA7IChkZXZpY2UgPCBCQ01UUl9NQVhfT0xUUykgJiYgKHJjID09IEJDTV9FUlJfT0spOyBkZXZpY2UrKykKKyAgICB7CisgICAgICAgIGNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisgICAgICAgIGNvbnRleHQtPnN0YXR1cyA9IE1GVFBfU1RBVFVTX0RJU0FCTEVEOworICAgICAgICBjb250ZXh0LT5ibG9ja19zaXplID0gbWZ0cF9ibG9ja19zaXplX2dldCgpOworICAgICAgICBjb250ZXh0LT5idWYgPSBiY21vc19jYWxsb2MoY29udGV4dC0+YmxvY2tfc2l6ZSk7CisgICAgICAgIHJjID0gKGNvbnRleHQtPmJ1ZiA9PSBOVUxMKSA/IEJDTV9FUlJfTk9NRU0gOiByYzsKKyAgICAgICAgc25wcmludGYoY29udGV4dC0+bmFtZSwgc2l6ZW9mKGNvbnRleHQtPm5hbWUpLCAibWZ0cCV1IiwgZGV2aWNlKTsKKyAgICAgICAgcmMgPSAocmMgPT0gQkNNX0VSUl9PSykgPyBtZnRwX2luaXRfdGFza3MoZGV2aWNlKSA6IHJjOworICAgICAgICByYyA9IChyYyA9PSBCQ01fRVJSX09LKSA/IG1mdHBfaW5pdF9tb2R1bGVzKGRldmljZSkgOiByYzsKKyAgICAgICAgcmMgPSAocmMgPT0gQkNNX0VSUl9PSykgPyBtZnRwX2luaXRfdGltZXJzKGRldmljZSkgOiByYzsKKyAgICAgICAgY29udGV4dC0+bG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoY29udGV4dC0+bmFtZSwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlci5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZlYTNjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXIuaApAQCAtMCwwICsxLDg2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9IXworI2RlZmluZSBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX0hfCisKKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworLyogUmV0dXJucyBhIGRhdGEgYmxvY2sgb2YgZ2l2ZW4gc2l6ZSBvZiBnaXZlbiBpbWFnZSB0eXBlIGF0IGdpdmVuIG9mZnNldC4gKi8KK3R5cGVkZWYgaW50ICgqYmNtdXNlcl9tZnRwX2ltYWdlX3JlYWQpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlLAorICAgIHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqYnVmLCB1aW50MzJfdCBidWZfc2l6ZSk7CisKKy8qIFJldHVybnMgdGhlIHNpemUgb2YgZGF0YSBibG9jayB3aGljaCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0cmFuc2Zlci4gKi8KK3R5cGVkZWYgdWludDMyX3QgKCpiY211c2VyX21mdHBfYmxvY2tfc2l6ZV9nZXQpKHZvaWQpOworCisvKiBSZXR1cm5zIHRoZSBDUkMzMiBjaGVja3N1bSBvZiBlbnRpcmUgaW1hZ2UuICovCit0eXBlZGVmIHVpbnQzMl90ICgqYmNtdXNlcl9tZnRwX2NyY19nZXQpKGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKiBDYWxsYmFjayB0byBub3RpZnkgdGhlIHVzZXIgb2YgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGltYWdlIHRyYW5zZmVyLiAqLwordHlwZWRlZiB2b2lkICgqYmNtdXNlcl9tZnRwX25vdGlmaWNhdGlvbl9yeCkoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgdWludDMyX3QgYmxvY2tfbnVtLCBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cyk7CisKK3R5cGVkZWYgZW51bQoreworICAgIE1GVFBfU1RBVFVTX0RJU0FCTEVELAorICAgIE1GVFBfU1RBVFVTX1dBSVRJTkdfQUNLLAorICAgIE1GVFBfU1RBVFVTX1dBSVRJTkdfTEFTVF9BQ0sKK30gbWZ0cF9zdGF0dXM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogcnVudGltZSBwYXJhbWV0ZXJzICovCisgICAgbWZ0cF9zdGF0dXMgc3RhdHVzOworICAgIHVpbnQzMl90IGJsb2NrX251bTsgICAgIC8qIGJsb2NrIG51bWJlciBzZW50LiAqLworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlOworCisgICAgLyogaW5pdC10aW1lIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50MzJfdCBibG9ja19zaXplOworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBjaGFyIG5hbWVbTUFYX1RJTUVSX05BTUVfU0laRV07CisgICAgYmNtb3NfdGFzayB0YXNrOworICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQ7CisgICAgYmNtb3NfdGltZXIgdGltZXI7CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7Cit9IG1mdHBfY29udGV4dDsKKworCitjb25zdCBjaGFyICpiY21vbHRfdXNlcl9tZnRwX3N0YXR1c190b19zdHIoYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXMpOworCisvKiogaGFuZGxlciBmb3IgdGhlIE9QRVJBVElPTiBkZXZpY2UuaW1hZ2VfdHJhbnNmZXJfc3RhcnQuICovCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9tZnRwX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKTsKKworLyoqIEluaXRpYWxpemVzIHRoZSBNRlRQIHBhcmFtZXRlcnMuICovCit2b2lkIGJjbW9sdF91c2VyX21mdHBfaW5pdCh2b2lkKTsKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjkyNDNhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpX2hlbHBlcnMuaD4KKyNpbmNsdWRlICJiY21vbHRfaW1hZ2VfdHJhbnNmZXIuaCIKKyNpbmNsdWRlICJiY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmgiCisKK3N0YXRpYyBiY21vc19ib29sIGJjbW9sdF91c2VyX2FwcGxfZGV2aWNlX3N0YXRlX2lzX3JlYWR5KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZyA9IHt9OworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgc3RhdGUpOworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZSwgJmNmZy5oZHIpOworICAgIHJldHVybiAoZXJyID09IEJDTV9FUlJfT0spICYmIChjZmcuZGF0YS5zdGF0ZSA9PSBCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZKTsKK30KKworLyoqIHN0YXJ0IHRoZSBpbWFnZSB0cmFuc2Zlci4KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX2ltYWdlX3RyYW5zZmVyX3N0YXJ0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAwOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghYmNtb2x0X3VzZXJfYXBwbF9kZXZpY2Vfc3RhdGVfaXNfcmVhZHkoZGV2aWNlKSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJkZXZpY2Ugbm90IGNvbm5lY3RlZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgaW1hZ2VfdHlwZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImltYWdlX3R5cGUiKS0+dmFsdWUudW51bWJlcjsKKworICAgIGVyciA9IGJjbW9sdF91c2VyX21mdHBfc3RhcnQoZGV2aWNlLCBpbWFnZV90eXBlKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbWFnZV90cmFuc2Zlcl9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBiY21jbGlfZW50cnkgKmRpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsICJpbWFnZV90cmFuc2ZlciIsCisgICAgICAgICJJbWFnZSBUcmFuc2ZlciB1c2VyIGFwcGxpY2F0aW9uIiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFkaXIsIEJDTV9FUlJfTk9NRU0pOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInN0YXJ0IiwgIlN0YXJ0IEltYWdlIFRyYW5zZmVyIGFwcGxpY2F0aW9uIiwgYmNtb2x0X3VzZXJfYXBwbF9jbGlfaW1hZ2VfdHJhbnNmZXJfc3RhcnQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiaW1hZ2VfdHlwZSIsICJJbWFnZSB0eXBlIiwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3N0cmluZ190YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjlmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9DTElfSF8KKyNkZWZpbmUgX0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9DTElfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbWFnZV90cmFuc2Zlcl9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfdXNlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGZjODMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBjb250YWlucyB0aGUgY3VzdG9tZXItcHJvdmlkZWQgY29kZS4KKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCBhcyBhbiBleGFtcGxlLgorICogVGhlIGN1c3RvbWVyIG1heSBjaGFuZ2UgdGhlIGZpbGUgcGF0aC9uYW1lcy4KKyAqIFRoZSBjdXN0b21lciBtYXkgY2hhbmdlIHRoZSBmaWxlIGFjY2VzcyBmdW5jdGlvbnMuCisgKiBUaGUgY3VzdG9tZXIgbWF5IGFkanVzdCB0aGUgZGF0YSBibG9jayBzaXplLgorICogQWRkaW5nIGEgbmV3IGltYWdlIHR5cGUgcmVxdWlyZXMgdGhlIG9iamVjdCBtb2RlbCBjaGFuZ2UgYW5kIHN5bmMgdXAgd2l0aAorICogdGhlIGVtYmVkZGVkIHNpemUsIHdoaWNoIHNob3VsZCBiZSBkb25lIGJ5IHRoZSBCcm9hZGNvbSBlbmdpbmVlcmluZy4KKyAqLworCisjaW5jbHVkZSA8YmNtb2x0X2NvbnYuaD4KKyNpbmNsdWRlICJiY21vbHRfaW1hZ2VfdHJhbnNmZXIuaCIKKyNpbmNsdWRlICJiY21vbHRfaW1hZ2VfdHJhbnNmZXJfdXNlci5oIgorI2luY2x1ZGUgImJjbW9sdF91dGlscy5oIgorCisvKiBleGFtcGxlIG5hbWVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvbmx5ICovCisjZGVmaW5lIEJPT1RfRklMRSAiL29wdC9iY202ODYyMC9iY202ODYyMF9ib290LmJpbiIKKyNkZWZpbmUgQVBQTF9GSUxFICIvb3B0L2JjbTY4NjIwL2JjbTY4NjIwX2FwcGwuYmluIgorI2RlZmluZSBJVFVfUE9OX09OVV9GV19GSUxFICIvb3B0L2JjbTY4NjIwL2dwb25fb251X2Z3LnciCisjZGVmaW5lIEVQT05fT05VX0ZXX0ZJTEUgIi9vcHQvYmNtNjg2MjAvZXBvbl9vbnVfZncudGtmIgorCitzdGF0aWMgaW50MnN0cl90IGltYWdlX3R5cGUyc3RyW10gPQoreworICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUiwgQk9PVF9GSUxFfSwKKyAgICB7QkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OLCBBUFBMX0ZJTEV9LAorICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfSVRVX1BPTl9PTlVfRklSTVdBUkUsIElUVV9QT05fT05VX0ZXX0ZJTEV9LAorICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfRVBPTl9PTlVfRklSTVdBUkUsIEVQT05fT05VX0ZXX0ZJTEV9LAorICAgIHstMX0KK307CisKKy8qKiBHZXQgdGhlIGRldmljZSBmaWxlIG5hbWUuCisgKiAKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogCisgKiBccmV0dXJuICAgICAgc3RyaW5nICAgICAgICAgIFBvaW50ZXIgdG8gZGV2aWNlIGltYWdlIG5hbWUsIGluY2x1ZGluZyB0aGUgcGF0aC4KKyAqLworY29uc3QgY2hhciAqYmNtdXNlcl9kZXZpY2VfaW1hZ2VfbmFtZV9nZXQoYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpCit7CisgICAgaWYgKGltYWdlX3R5cGUgPCBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfX05VTV9PRikKKyAgICB7CisgICAgICAgIHJldHVybiBpbnQyc3RyKGltYWdlX3R5cGUyc3RyLCBpbWFnZV90eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKiBPcGVuIGEgZmlsZSB3aXRoIGdpdmVuIGltYWdlIHR5cGUuCisgKgorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuCisgKiBccGFyYW1bb3V0XSAgZnBwICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICoKKyAqIFxyZXR1cm4gICAgICBiY21vc19lcnJubyAgICAgRXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9maWxlX29wZW4oYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsIEZJTEUgKipmcHApCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoaW1hZ2VfdHlwZSA8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9fTlVNX09GKQorICAgIHsKKyAgICAgICAgRklMRSAqZnA7CisgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lID0gYmNtdXNlcl9kZXZpY2VfaW1hZ2VfbmFtZV9nZXQoaW1hZ2VfdHlwZSk7CisgICAgICAgIGZwID0gZm9wZW4oZm5hbWUsICJyYiIpOworICAgICAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZwcCA9IGZwOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gCisgKiAKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIFxwYXJhbVtvdXRdICBmc2l6ZSAgICAgICAgICAgRmlsZSBzaXplCisgKiAKKyAqIFxyZXR1cm4gICAgICBiY21vc19lcnJubyAKKyAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9maWxlX3NpemVfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsIHVpbnQzMl90ICpmc2l6ZSkKK3sKKyAgICBGSUxFICpmcDsKKyAgICBsb25nIGZwX3ByZXY7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgICh2b2lkKWRldmljZTsKKworICAgIHJjID0gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9maWxlX29wZW4oaW1hZ2VfdHlwZSwgJmZwKTsKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGZwX3ByZXYgPSBmdGVsbChmcCk7CisgICAgICAgIEJVR19PTihmcF9wcmV2IDwgMCk7CisgICAgICAgIEJVR19PTihmc2VlayhmcCwgMCwgU0VFS19FTkQpICE9IDApOworICAgICAgICAqZnNpemUgPSBmdGVsbChmcCk7CisgICAgICAgIEJVR19PTihmc2VlayhmcCwgZnBfcHJldiwgU0VFS19TRVQpICE9IDApOyAvKiBnbyBiYWNrIHRvIHdoZXJlIHdlIHdlcmUuICovCisgICAgICAgIEJVR19PTihmY2xvc2UoZnApICE9IDApOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBSZWFkIGRhdGEgZnJvbSBnaXZlbiBvZmZzZXQuCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBEZXZpY2UgSUQKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgICAgICAgICBGaWxlIHBvc2l0aW9uIGluZGljYXRvcgorICogXHBhcmFtW291dF0gIGJ1ZiAgICAgICAgICAgICBCdWZmZXIgdG8gc3RvcmUgdGhlIGRhdGEKKyAqIFxwYXJhbVtpbl0gICBidWZfc2l6ZSAgICAgICAgQnVmZmVyIHNpemUKKyAqCisgKiBccmV0dXJuICAgICAgQnl0ZXMgcmVhZAorICovCitpbnQgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9yZWFkX2RhdGEoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKQoreworICAgIEZJTEUgKmZwOworICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSAwOworICAgICh2b2lkKWRldmljZTsKKworICAgIGlmIChiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfb3BlbihpbWFnZV90eXBlLCAmZnApID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCVUdfT04oZnNlZWsoZnAsIDAsIFNFRUtfRU5EKSAhPSAwKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IGZ0ZWxsKGZwKSkKKyAgICAgICAgeworICAgICAgICAgICAgQlVHX09OKGZzZWVrKGZwLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKTsKKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIGJ1Zl9zaXplLCBmcCk7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKGZjbG9zZShmcCkgIT0gMCk7CisgICAgfQorICAgIHJldHVybiBieXRlc19yZWFkOworfQorCisvKiogR2V0IHRoZSB1bml0IHNpemUgb2YgdGhlIHRyYW5zZmVyIGRhdGEgYmxvY2suCisgKgorICogXHJldHVybiAgICAgIFNpemUgb2YgdGhlIGJsb2NrIGluIGJ5dGVzLgorICovCit1aW50MzJfdCBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2Jsb2NrX3NpemVfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuIE1GVFBfREFUQV9CTE9DS19TSVpFOworfQorCisvKiogUmV0dXJucyB0aGUgQ1JDMzIgY2hlY2tzdW0gb2YgZW50aXJlIGltYWdlLgorICogCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBJRAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuCisgKiAKKyAqIFxyZXR1cm4gICAgICBDUkMzMiBjaGVja3N1bSAKKyAqLwordWludDMyX3QgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9jcmNfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKQoreworICAgIEZJTEUgKmZwOworICAgIHVpbnQzMl90IGNyYyA9IDA7CisgICAgKHZvaWQpZGV2aWNlOworCisgICAgaWYgKGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfZmlsZV9vcGVuKGltYWdlX3R5cGUsICZmcCkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGJ1Zls1MTJdOyAvKiBhbnkgc2l6ZSBpcyBPSy4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQ7CisKKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBmcCk7CisgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY3JjID0gZXRoX2NhbGNfY3JjMzIoY3JjLCBidWYsIGJ5dGVzX3JlYWQpOworICAgICAgICB9CisgICAgICAgIEJVR19PTihmY2xvc2UoZnApICE9IDApOworICAgIH0KKyAgICByZXR1cm4gY3JjOworfQorCisvKiogUHJvY2VzcyB0aGUgbm90aWZpY2F0aW9uIGZyb20gdGhlIGltYWdlIHRyYW5zZmVyIG1vZHVsZS4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBJRAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuIAorICogXHBhcmFtW2luXSAgIGJsb2NrX251bSAgICAgICBsYXN0IGJsb2NrIG51bWJlciAKKyAqIFxwYXJhbVtpbl0gICBzdGF0dXMgICAgICAgICAgSW1hZ2UgdHJhbnNmZXIgc3RhdHVzIAorICovCit2b2lkIGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfbm90aWZpY2F0aW9uX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsIHVpbnQzMl90IGJsb2NrX251bSwKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBiY21vbHRfdXNlcl9tZnRwX3N0YXR1c190b19zdHIoc3RhdHVzKTsKKyAgICBiY21vc19wcmludGYoIkltYWdlIHRyYW5zZmVyOiAlczogdHlwZT0ldSBibG9jaz0ldVxuIiwgc3RyLCBpbWFnZV90eXBlLCBibG9ja19udW0pOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwMzY2YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfSU1BR0VfVFJBTlNGRVJfVVNFUl9IXworI2RlZmluZSBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1VTRVJfSF8KKworI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisjZGVmaW5lIE1GVFBfREFUQV9CTE9DS19TSVpFICA1MTIKKworI2RlZmluZSBNRlRQX0FDS19USU1FT1VUX1VTICAgKDIgKiAxMDAwMDAwKQorCisjZGVmaW5lIE1GVFBfTUFYX1BBVEhfTkFNRV9MRU4gIDI1NgorCisvKiogR2V0IHRoZSBkZXZpY2UgZmlsZSBuYW1lLgorICogCisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIAorICogXHJldHVybiAgICAgIHN0cmluZyAgICAgICAgICBEZXZpY2UgaW1hZ2UgbmFtZSwgaW5jbHVkaW5nIHRoZSBwYXRoLgorICovCitjb25zdCBjaGFyICpiY211c2VyX2RldmljZV9pbWFnZV9uYW1lX2dldChiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSk7CisKKy8qKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuIAorICogCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBJRAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuCisgKiBccGFyYW1bb3V0XSAgZnNpemUgICAgICAgICAgIEZpbGUgc2l6ZQorICogCisgKiBccmV0dXJuICAgICAgYmNtb3NfZXJybm8gCisgKi8KK2JjbW9zX2Vycm5vIGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfZmlsZV9zaXplX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlLCB1aW50MzJfdCAqZnNpemUpOworCisvKiogUmVhZCBkYXRhIGZyb20gZ2l2ZW4gb2Zmc2V0LgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgICAgICAgICAgRmlsZSBwb3NpdGlvbiBpbmRpY2F0b3IKKyAqIFxwYXJhbVtvdXRdICBidWYgICAgICAgICAgICAgQnVmZmVyIHRvIHN0b3JlIHRoZSBkYXRhCisgKiBccGFyYW1baW5dICAgYnVmX3NpemUgICAgICAgIEJ1ZmZlciBzaXplCisgKgorICogXHJldHVybiAgICAgIEJ5dGVzIHJlYWQKKyAqLworaW50IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfcmVhZF9kYXRhKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlLAorICAgIHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqYnVmLCB1aW50MzJfdCBidWZfc2l6ZSk7CisKKy8qKiBHZXQgdGhlIHVuaXQgc2l6ZSBvZiB0aGUgdHJhbnNmZXIgZGF0YSBibG9jay4KKyAqCisgKiBccmV0dXJuICAgICAgU2l6ZSBvZiB0aGUgYmxvY2sgaW4gYnl0ZXMuCisgKi8KK3VpbnQzMl90IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfYmxvY2tfc2l6ZV9nZXQodm9pZCk7CisKKy8qKiBSZXR1cm5zIHRoZSBDUkMzMiBjaGVja3N1bSBvZiBlbnRpcmUgaW1hZ2UuCisgKiAKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIAorICogXHJldHVybiAgICAgIENSQzMyIGNoZWNrc3VtIAorICovCit1aW50MzJfdCBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2NyY19nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKiogUHJvY2VzcyB0aGUgbm90aWZpY2F0aW9uIGZyb20gdGhlIGltYWdlIHRyYW5zZmVyIG1vZHVsZS4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBJRAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuIAorICogXHBhcmFtW2luXSAgIGJsb2NrX251bSAgICAgICBsYXN0IGJsb2NrIG51bWJlciAKKyAqIFxwYXJhbVtpbl0gICBzdGF0dXMgICAgICAgICAgSW1hZ2UgdHJhbnNmZXIgc3RhdHVzIAorICovCit2b2lkIGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfbm90aWZpY2F0aW9uX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsIHVpbnQzMl90IGJsb2NrX251bSwgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXMpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTc1NmVlNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIyBPTlUgdHVuaW5nIGFwcGxpY2F0aW9uCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9vbnVfdHVuaW5nCisgICAgTU9EX1RZUEUgPSBsaWIKKyAgICBNT0RfREVQUyA9IGhvc3RfYXBpIGNvbW1vbl9ncG9uIGJjbV9ib2FyZAorICAgIHNyY3MgPSBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuYyBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmMKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkM2I5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuaCIKKworI2RlZmluZSBPTlVfVFVOSU5HX1RBU0tfTVNHX1FfU0laRSAyNTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGJjbW9sdF9hdXRvICppbmQ7CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKK30gb3RfdGFza19tc2c7CisKK3N0YXRpYyBiY21vbHRfb251X3R1bmluZ19jb250ZXh0IG90X2NvbnRleHRbQkNNVFJfTUFYX09MVFNdOworCisKK3N0YXRpYyBiY21vc19lcnJubyBvbnVfdHVuaW5nX2luaXRfdGFzayhiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9IHt9OworICAgIHNucHJpbnRmKG90X2NvbnRleHRbZGV2aWNlX2lkXS50YXNrLm5hbWUsIHNpemVvZihvdF9jb250ZXh0W2RldmljZV9pZF0udGFzay5uYW1lKSwgInVzZXJfYXBwbF9vbnVfdHVuaW5nJXUiLCBkZXZpY2VfaWQpOworICAgIHRhc2tfcGFyYW1zLm5hbWUgPSBvdF9jb250ZXh0W2RldmljZV9pZF0udGFzay5uYW1lOworICAgIHRhc2tfcGFyYW1zLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9VU0VSX0FQUExfT05VX1RVTklORzsKKyAgICB0YXNrX3BhcmFtcy5jb3JlID0gQkNNT1NfQ1BVX0NPUkVfQU5ZOyAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICB0YXNrX3BhcmFtcy5pbml0X2hhbmRsZXIgPSBOVUxMOworICAgIHRhc2tfcGFyYW1zLmRhdGEgPSAobG9uZylkZXZpY2VfaWQ7CisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmb3RfY29udGV4dFtkZXZpY2VfaWRdLnRhc2ssICZ0YXNrX3BhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbW9zX3Rhc2tfY3JlYXRlKClcbiIpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gb251X3R1bmluZ19pbml0X21vZHVsZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIC8qIFRoaXMgdmFsdWUgaXMgdXNlZCBpbnNpZGUgYmNtb2x0X29udV90dW5pbmdfbW9kdWxlX2luaXQgZm9yIHRpbWVyIG93bmVyICovCisgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLmRldmljZSA9IGRldmljZV9pZDsKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9IHsgLm5hbWUgPSAidXNlcl9hcHBsX29udV90dW5pbmciLAorCQkuc2l6ZSA9IE9OVV9UVU5JTkdfVEFTS19NU0dfUV9TSVpFIH0sCisgICAgfTsKKworICAgIHJldHVybiBiY21vc19tb2R1bGVfY3JlYXRlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT05VX1RVTklOR19ERVYwICsgZGV2aWNlX2lkLCAmb3RfY29udGV4dFtkZXZpY2VfaWRdLnRhc2ssICZtb2R1bGVfcGFyYW1zKTsKK30KKwordm9pZCBiY21vbHRfb251X3R1bmluZ19hcHBsX2luaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXSA9IHt9OworICAgIHNucHJpbnRmKGxvZ19uYW1lLCBzaXplb2YobG9nX25hbWUpIC0gMSwgInVzZXJfYXBwbF9vbnVfdHVuaW5nJXUiLCBkZXZpY2VfaWQpOworICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfbmFtZSwgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworI2VuZGlmCisKKyAgICBlcnIgPSBiY21vc19tdXRleF9jcmVhdGUoJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCwgMCwgTlVMTCk7CisgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKKworICAgIGVyciA9IG9udV90dW5pbmdfaW5pdF90YXNrKGRldmljZV9pZCk7CisgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKKworICAgIGVyciA9IG9udV90dW5pbmdfaW5pdF9tb2R1bGUoZGV2aWNlX2lkKTsKKyAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKworICAgIGlmIChvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG90X2NvbnRleHRbZGV2aWNlX2lkXS5sb2dfaWQsICJPTlUgdHVuaW5nIGFwcGxpY2F0aW9uIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2U9JXVcbiIsIGRldmljZV9pZCk7CisgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7CisgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLmRldmljZSA9IGRldmljZV9pZDsKKworICAgIEJDTV9MT0coSU5GTywgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCwgIk9OVSB0dW5pbmcgYXBwbGljYXRpb24gc3RhcnRlZCBvbiBkZXZpY2U9JXVcbiIsIGRldmljZV9pZCk7CisgICAgcmV0ID0gQkNNX0VSUl9PSzsKKworZXhpdDoKKyAgICBiY21vc19tdXRleF91bmxvY2soJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCk7CisgICAgcmV0dXJuIHJldDsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X29udV90dW5pbmdfYXBwbF9zdG9wKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0OworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKworICAgIGlmICghb3RfY29udGV4dFtkZXZpY2VfaWRdLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICByZXQgPSBCQ01fRVJSX1NUQVRFOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLmlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc190aW1lcl9zdG9wKCZvdF9jb250ZXh0W2RldmljZV9pZF0udGltZXIpOworICAgIEJDTV9MT0coSU5GTywgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCwgIk9OVSB0dW5pbmcgYXBwbGljYXRpb24gc3RvcHBlZCBvbiBkZXZpY2U9JXVcbiIsIGRldmljZV9pZCk7CisgICAgcmV0ID0gQkNNX0VSUl9PSzsKKworZXhpdDoKKyAgICBiY21vc19tdXRleF91bmxvY2soJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCk7CisgICAgcmV0dXJuIHJldDsKK30KKworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19hcHBsX2lzX3J1bm5pbmcoYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19ib29sIHJldDsKKworICAgIGJjbW9zX211dGV4X2xvY2soJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCk7CisgICAgcmV0ID0gb3RfY29udGV4dFtkZXZpY2VfaWRdLmlzX3J1bm5pbmc7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZvdF9jb250ZXh0W2RldmljZV9pZF0ubXV0ZXgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfaXNfaW50ZXJlc3RlZChiY21vbHRfYXV0byAqaW5kKQoreworICAgIHN3aXRjaCAoaW5kLT5oZHIub2JqX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEOgorCQkgICByZXR1cm4gQkNNT1NfVFJVRTsKKwkgICAgZGVmYXVsdDoKKwkJICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfb251X3R1bmluZ19pbmRfY2IoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisJb3RfdGFza19tc2cgKm1zZyA9IChvdF90YXNrX21zZyAqKW9zX21zZzsKKwliY21vbHRfcG9uX25pIHBvbl9uaTsKKwliY21vbHRfcG9uX29udV9pZCBvbnVfaWQ7CisJYmNtb2x0X2F1dG8gKmluZCA9IG1zZy0+aW5kOworCWJjbW9zX2Vycm5vIHJjOworCisJc3dpdGNoIChtc2ctPmluZC0+aGRyLm9ial90eXBlKQorCXsKKwljYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fT05VOgorCQlzd2l0Y2ggKG1zZy0+aW5kLT5oZHIuc3ViZ3JvdXApCisJCXsKKwkJCWNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RVTklOR19SRVNQT05TRToKKwkJCXsKKwkJCQliY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZSAqb251X3R1bmluZ19yZXNwb25zZSA9IChiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZSAqKWluZDsKKwkJCQlvbnVfaWQgPSBvbnVfdHVuaW5nX3Jlc3BvbnNlLT5rZXkub251X2lkOworCQkJCXBvbl9uaSA9IG9udV90dW5pbmdfcmVzcG9uc2UtPmtleS5wb25fbmk7CisKKwkJCQlpZiAob251X3R1bmluZ19yZXNwb25zZS0+ZGF0YS5hY2sgPT0gQkNNT1NfVFJVRSAmJiBvbnVfdHVuaW5nX3Jlc3BvbnNlLT5kYXRhLnJlc3VsdCA9PSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisJCQkJeworCQkJCQlCQ01fTE9HKElORk8sIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLmxvZ19pZCwgIkluZGljYXRpb24gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RVTklOR19SRVNQT05TRSBoYW5kbGVkOiBQT046JXUgT05VOiV1IHRhcmdldF9wb25fbmk9JXVcbiIsIHBvbl9uaSwgb251X2lkLCBvdF9jb250ZXh0W21zZy0+ZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX25pKTsKKworCQkJCQkvKiBzdGFydCB0dW5pbmcgaW4gb251IG9uIHRhcmdldCBwb24gaWQgKi8KKwkJCQkJYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAucG9uX25pID0gb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ub251X2RiW29udV9pZF0udGFyZ2V0X3Bvbl9uaSwgLm9udV9pZCA9IG9udV9pZCB9OworCQkJCQliY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW4gb251X3R1bmluZ19pbjsKKworCQkJCQlCQ01PTFRfT1BFUl9JTklUKCZvbnVfdHVuaW5nX2luLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfaW4sIGtleSk7CisJCQkJCXJjID0gYmNtb2x0X29wZXJfc3VibWl0KG1zZy0+ZGV2aWNlX2lkLCAmb251X3R1bmluZ19pbi5oZHIpOworCQkJCQlpZiAocmMgIT0gQkNNX0VSUl9PSykKKwkJCQkJCUJDTV9MT0coRVJST1IsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLmxvZ19pZCwgIk9OVT0ldSB0dW5pbmcgaW4gdG8gUE9OPSV1IGZhaWxlZFxuIiwgb251X2lkLCBvdF9jb250ZXh0W21zZy0+ZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX25pKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEOgorCQkJeworCQkJCWJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQgKm9udV90dW5pbmdfaW5fY29tcGxldGVkID0gKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQgKilpbmQ7CisJCQkJb251X2lkID0gb251X3R1bmluZ19pbl9jb21wbGV0ZWQtPmtleS5vbnVfaWQ7CisJCQkJcG9uX25pID0gb251X3R1bmluZ19pbl9jb21wbGV0ZWQtPmtleS5wb25fbmk7CisJCQkJaWYgKG9udV90dW5pbmdfaW5fY29tcGxldGVkLT5kYXRhLnJlc3VsdCA9PSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisJCQkJeworCQkJCQlCQ01fTE9HKElORk8sIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLmxvZ19pZCwgIkluZGljYXRpb24gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEIGhhbmRsZWQ6IFBPTjoldSBPTlU6JXVcbiIsIHBvbl9uaSwgb251X2lkKTsKKworCQkJCQkvKiBzdGFydCB0dW5pbmcgb3V0IG9udSBvbiBzb3VyY2UgcG9uIGlkICovCisJCQkJCWJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgLnBvbl9uaSA9IG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnNvdXJjZV9wb25fbmksIC5vbnVfaWQgPSBvbnVfaWQgfTsKKwkJCQkJYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCBvbnVfdHVuaW5nX291dDsKKworCQkJCQlCQ01PTFRfT1BFUl9JTklUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwga2V5KTsKKwkJCQkJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfZHNfcG9uX2lkLCBvdF9jb250ZXh0W21zZy0+ZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX2lkKTsKKwkJCQkJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfdXNfcG9uX2lkLCBvdF9jb250ZXh0W21zZy0+ZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX2lkKTsKKwkJCQkJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0aW1lX3RvX3N3aXRjaCwgMTAwMCk7CisJCQkJCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgcm9sbGJhY2ssIEJDTU9TX0ZBTFNFKTsKKwkJCQkJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCBzdGF0dXMsIEJDTU9MVF9TVEFUVVNfT0ZGKTsKKwkJCQkJcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobXNnLT5kZXZpY2VfaWQsICZvbnVfdHVuaW5nX291dC5oZHIpOworCQkJCQlpZiAocmMgIT0gQkNNX0VSUl9PSykKKwkJCQkJCUJDTV9MT0coRVJST1IsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLmxvZ19pZCwgIk9OVT0ldSB0dW5pbmcgb3V0IGZyb20gUE9OPSV1IGZhaWxlZFxuIiwgb251X2lkLCBvdF9jb250ZXh0W21zZy0+ZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS5zb3VyY2VfcG9uX25pKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogZnJlZSB0aGUgY2xvbmVkIGluZGljYXRpb24gc2luY2Ugd2UncmUgZG9uZSBwcm9jZXNzaW5nIGl0ICovCisJYmNtb2x0X21zZ19mcmVlKCZtc2ctPmluZC0+aGRyKTsKKwkvKiBmcmVlIHRoZSBpbnRlcm5hbCBPUyBtZXNzYWdlIGhhbmRsZSAqLworCWJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X29udV90dW5pbmdfcHJvY2Vzc19pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X21zZyAqaW5kX2Nsb25lID0gTlVMTDsKKworICAgIC8qIGlmIHRoZSBhcHBsaWNhdGlvbiBpc24ndCBydW5uaW5nLCBkb24ndCBsaXN0ZW4gdG8gYW55IGluZGljYXRpb25zICovCisgICAgaWYgKCFiY21vbHRfb251X3R1bmluZ19hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICAvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGhhbmRsZXIgZm9yIHRoaXMgdHlwZSBvZiBpbmRpY2F0aW9uICovCisgICAgaWYgKCFiY21vbHRfb251X3R1bmluZ19pc19pbnRlcmVzdGVkKGluZCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgLyogY2xvbmUgdGhlIGluZGljYXRpb24gaW50byBuZXdseS1hbGxvY2F0ZWQgbWVtb3J5IHNvIHdlIGNhbiBoYW5kbGUgaXQgYWZ0ZXIgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgaGFzIGJlZW4gZnJlZWQgKi8KKyAgICBlcnIgPSBiY21vbHRfbXNnX2Nsb25lKCZpbmRfY2xvbmUsICZpbmQtPmhkcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCwgIkluZGljYXRpb24gY2xvbmUgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogc2VuZCB0aGUgY2xvbmUgdG8gdGhlIGludGVybmFsIHRhc2sncyBtZXNzYWdlIHF1ZXVlICovCisgICAgb3RfdGFza19tc2cgKm1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG90X2NvbnRleHRbZGV2aWNlX2lkXS5sb2dfaWQsICJNZXNzYWdlIGNhbGxvYyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKGluZF9jbG9uZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBtc2ctPm9zX21zZy5oYW5kbGVyID0gYmNtb2x0X29udV90dW5pbmdfaW5kX2NiOworICAgIG1zZy0+b3NfbXNnLnJlbGVhc2UgPSBiY21vbHRfb3NfbXNnX3JlbGVhc2VfY2I7CisgICAgbXNnLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisgICAgbXNnLT5pbmQgPSAoYmNtb2x0X2F1dG8gKilpbmRfY2xvbmU7CisKKyAgICBlcnIgPSBiY21vc19tc2dfc2VuZF90b19tb2R1bGUoVEFTS19QUklPUklUWV9VU0VSX0FQUExfT05VX1RVTklORyArIGRldmljZV9pZCwgJm1zZy0+b3NfbXNnLCAwKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvdF9jb250ZXh0W2RldmljZV9pZF0ubG9nX2lkLCAiTWVzc2FnZSBzZW5kIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUoaW5kX2Nsb25lKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gb251X3R1bmluZ191cGRhdGVfb251X2RiIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZCwgYmNtb2x0X3Bvbl9uaSBzb3VyY2VfcG9uX25pLCBiY21vbHRfcG9uX25pIHRhcmdldF9wb25fbmksIGJjbW9sdF9wb25faWQgdGFyZ2V0X3Bvbl9pZCwgYmNtb3NfYm9vbCByb2xsYmFjaykKK3sKKwliY21vc19lcnJubyByZXQ7CisJIGJjbW9zX211dGV4X2xvY2soJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCk7CisKKwkgICAgaWYgKCFvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZykKKwkgICAgeworCSAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKwkgICAgICAgIGdvdG8gZXhpdDsKKwkgICAgfQorCSAgICBvdF9jb250ZXh0W2RldmljZV9pZF0ub251X2RiW29udV9pZF0udGFyZ2V0X3Bvbl9uaSA9IHRhcmdldF9wb25fbmk7CisJICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS5zb3VyY2VfcG9uX25pID0gc291cmNlX3Bvbl9uaTsKKwkgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25faWQgPSB0YXJnZXRfcG9uX2lkOworCSAgICBvdF9jb250ZXh0W2RldmljZV9pZF0ub251X2RiW29udV9pZF0ucm9sbGJhY2sgPSByb2xsYmFjazsKKwkgICAgcmV0ID0gQkNNX0VSUl9PSzsKKworZXhpdDoKKwliY21vc19tdXRleF91bmxvY2soJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4MWZjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9PTlVfVFVOSU5HX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX09OVV9UVU5JTkdfSF8KKworI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaS5oPgorCit0eXBlZGVmIHN0cnVjdAoreworCWJjbW9sdF9wb25fbmkgdGFyZ2V0X3Bvbl9uaTsKKwliY21vbHRfcG9uX25pIHNvdXJjZV9wb25fbmk7CisJYmNtb2x0X3Bvbl9pZCB0YXJnZXRfcG9uX2lkOworCXVpbnQzMl90IHRpbWVfdG9fc3dpdGNoOworCWJjbW9zX2Jvb2wgcm9sbGJhY2s7Cit9YmNtb2x0X29udV90dW5pbmdfb251X2RiOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX3Rhc2sgdGFzazsKKyAgICBiY21vc19tc2dfcG9vbCBtc2dfcG9vbDsKKyAgICBiY21vc19tdXRleCBtdXRleDsKKyAgICBiY21vc190aW1lciB0aW1lcjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKKyAgICBiY21vc19ib29sIGlzX3J1bm5pbmc7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICB1aW50MzJfdCAqdGltZW91dHM7CisgICAgYmNtb2x0X29udV90dW5pbmdfb251X2RiIG9udV9kYltYR1BPTl9NQVhfTlVNX09GX09OVVNdOworfSBiY21vbHRfb251X3R1bmluZ19jb250ZXh0OworCit0eXBlZGVmIGVudW0KK3sKKworCU9OVV9UVU5JTkdfTU9ERSwKK30gYmNtb2x0X29udV90dW5pbmdfbW9kZTsKKworLyoqIEluaXRpYWxpemUgdGhlIE9OVSBUdW5pbmcgYXBwbGljYXRpb24gKHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIGFwcGxpY2F0aW9uIHN0YXJ0dXApLiAqLwordm9pZCBiY21vbHRfb251X3R1bmluZ19hcHBsX2luaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKiBTdGFydCB0aGUgT05VIFR1bmluZyBhcHBsaWNhdGlvbi4KKyAqCisgKiBccGFyYW1baW5dIGRldmljZSAgICAgICAgICAgIFRoZSBkZXZpY2UgSUQgb24gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgc3RhcnRlZC4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19hcHBsX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOworCisvKiogU3RvcCB0aGUgT05VIFR1bmluZyBhcHBsaWNhdGlvbi4KKyAqCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3RvcHBlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X29udV90dW5pbmdfYXBwbF9zdG9wKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOworCisvKiogUXVlcnkgd2hldGhlciB0aGUgT05VIFR1bmluZyBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgcnVubmluZy4KKyAqCisgKiBccmV0dXJuICAgICAgICBCQ01PU19UUlVFIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLCBCQ01PU19GQUxTRSBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfYXBwbF9pc19ydW5uaW5nKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOworCisvKiogUHJvY2VzcyBhbiBpbmRpY2F0aW9uIHJlY2VpdmVkLiAgSWYgdGhlIE9OVSBUdW5pbmcgYXBwbGljYXRpb24gaXMgaW50ZXJlc3RlZCBpbiB0aGUgaW5kaWNhdGlvbiwgdGhlCisgKiBhcHByb3ByaWF0ZSBhY3Rpb24gd2lsbCBiZSB0YWtlbi4gIElmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgaW50ZXJlc3RlZCwgdGhlIGluZGljYXRpb24gd2lsbCBiZSBpZ25vcmVkLgorICoKKyAqCisgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGZyZWUgdGhlIGluZGljYXRpb24uCisgKiBUaGUgY2FsbGVyIG11c3QgZnJlZSBpdCB1c2luZyBiY21vc19tc2dfZnJlZSgpIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBccGFyYW1baW5dIGluZCBUaGUgaW5kaWNhdGlvbiB0aGF0IHdhcyByZWNlaXZlZC4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGluZGljYXRpb24gd2FzIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkgb3IgaWdub3JlZCwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19wcm9jZXNzX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfYXV0byAqaW5kKTsKK2JjbW9zX2Vycm5vIG9udV90dW5pbmdfdXBkYXRlX29udV9kYiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQsIGJjbW9sdF9wb25fbmkgc291cmNlX3Bvbl9uaSwgYmNtb2x0X3Bvbl9uaSB0YXJnZXRfcG9uX25pLCBiY21vbHRfcG9uX2lkIHRhcmdldF9wb25faWQsIGJjbW9zX2Jvb2wgcm9sbGJhY2spOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWQ1MjllMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaS5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmgiCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaV9jcmVhdGUoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworc3RhdGljIGJjbWNsaV9lbnRyeSAqb251X3R1bmluZ19jbGlfZGlyOworc3RhdGljIGJjbWNsaV9lbnRyeSAqb251X3R1bmluZ19jbGlfdG9wX2RpcjsKK3N0YXRpYyBiY21vc19ib29sIG9udV90dW5pbmdfaXNfcmVnaXN0ZXJlZDsKKworLyogRGVzdHJveSBDTEkgY29tbWFuZHMgKi8KK3N0YXRpYyB2b2lkIG9udV90dW5pbmdfY2xpX2Rlc3Ryb3kodm9pZCkKK3sKKyAgICBpZiAob251X3R1bmluZ19jbGlfZGlyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3kob251X3R1bmluZ19jbGlfZGlyKTsKKyAgICAgICAgb251X3R1bmluZ19jbGlfZGlyID0gTlVMTDsKKyAgICB9Cit9CisKKy8qIEN1cnJlbnQgZGV2aWNlIGNoYW5nZSBpbmRpY2F0aW9uICovCitzdGF0aWMgdm9pZCBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfZGV2aWNlX2NoYW5nZV9pbmQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworICAgIGJjbW9zX2Vycm5vIGVyciA9IGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoZGV2LCAmc3lzdGVtX21vZGUpOworCisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yIGRldmljZSBJZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0cpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQnVpbGRpbmcgb251X3R1bmluZyBDTEkgZm9yIGRldmljZSAlZFxuIiwgZGV2KTsKKworICAgICAgICBlcnIgPSBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpX2NyZWF0ZShvbnVfdHVuaW5nX2NsaV90b3BfZGlyKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yIGJ1aWxkaW5nIG9udV90dW5pbmcgQ0xJXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgIAlvbnVfdHVuaW5nX2NsaV9kZXN0cm95KCk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gb251X3R1bmluZ19jbWRfc3RhcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfb251X3R1bmluZ19hcHBsX3N0YXJ0KGN1cnJlbnRfZGV2aWNlKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIG9udV90dW5pbmdfY21kX3N0b3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfb251X3R1bmluZ19hcHBsX3N0b3AoY3VycmVudF9kZXZpY2UpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gb251X2hhbmRvdmVyX2NtZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisJYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQ7CisJYmNtb2x0X3Bvbl9uaSB0YXJnZXRfcG9uX25pOworCWJjbW9sdF9wb25fbmkgc291cmNlX3Bvbl9uaTsKKwl1aW50MzJfdCB0YXJnZXRfcG9uX2FkbWluaXN0cmF0aXZlX2xhYmVsOworCXVpbnQ4X3QgdGFyZ2V0X3Bvbl9kd2xjaF9pZDsKKwl1aW50MzJfdCB0aW1lX3RvX3N3aXRjaDsgICAgICAgIC8qIFRpbWUgdG8gc3dpdGNoIGluIG1zICovCisJYmNtY2xpX2NtZF9wYXJtICpyb2xsYmFja19wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9sbGJhY2siKTsKKwliY21vc19ib29sIHJvbGxiYWNrOworCWJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKwliY21vbHRfcG9uX2lkIHRhcmdldF9wb25faWQ7CisKKworCXNvdXJjZV9wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzb3VyY2VfcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisJdGFyZ2V0X3Bvbl9uaSA9IChiY21vbHRfcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF9wb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKwlvbnVfaWQgPSAoYmNtb2x0X3Bvbl9vbnVfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251IiktPnZhbHVlLnVudW1iZXI7CisJdGFyZ2V0X3Bvbl9hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9ICh1aW50MzJfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0YXJnZXRfcG9uX2lkX2FkbWluaXN0cmF0aXZlX2xhYmVsIiktPnZhbHVlLnVudW1iZXI7CisJdGFyZ2V0X3Bvbl9kd2xjaF9pZCA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF9wb25faWRfZHdsY2hfaWQiKS0+dmFsdWUudW51bWJlcjsKKwl0YXJnZXRfcG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gdGFyZ2V0X3Bvbl9hZG1pbmlzdHJhdGl2ZV9sYWJlbDsKKwl0YXJnZXRfcG9uX2lkLmR3bGNoX2lkID0gdGFyZ2V0X3Bvbl9kd2xjaF9pZDsKKwl0aW1lX3RvX3N3aXRjaCA9ICh1aW50MzJfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0aW1lX3RvX3N3aXRjaCIpLT52YWx1ZS51bnVtYmVyOworCisJaWYgKHJvbGxiYWNrX3Bhcm0tPnZhbHVlLnVudW1iZXIgPT0gMCkKKwkJcm9sbGJhY2sgPSBCQ01PU19GQUxTRTsKKwllbHNlCisJCXJvbGxiYWNrID0gQkNNT1NfVFJVRTsKKwkvKiB1cGRhdGUgdHVuaW5nIGluIHBhcmFtZXRlcnMgaW4gZGF0YSBiYXNlICovCisJb251X3R1bmluZ191cGRhdGVfb251X2RiKGN1cnJlbnRfZGV2aWNlLCBvbnVfaWQsIHNvdXJjZV9wb25fbmksIHRhcmdldF9wb25fbmksIHRhcmdldF9wb25faWQsIHJvbGxiYWNrKTsKKworCWJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUdW5pbmcgb3V0IE9OVT0ldSBzb3VyY2VfcG9uX25pPSV1IHRhcmdldF9wb25fbmk9JXUgXG4iLCBvbnVfaWQsIHNvdXJjZV9wb25fbmksIHRhcmdldF9wb25fbmkpOworCisJLyogc3RhcnQgdHVuaW5nIG91dCBvbnUgb24gc291cmNlIHBvbiBpZCAqLworCWJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgLnBvbl9uaSA9IHNvdXJjZV9wb25fbmksIC5vbnVfaWQgPSBvbnVfaWQgfTsKKwliY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0IG9udV90dW5pbmdfb3V0OworCisJQkNNT0xUX09QRVJfSU5JVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIGtleSk7CisJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfZHNfcG9uX2lkLCB0YXJnZXRfcG9uX2lkKTsKKwlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF91c19wb25faWQsIHRhcmdldF9wb25faWQpOworCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGltZV90b19zd2l0Y2gsIHRpbWVfdG9fc3dpdGNoKTsKKwlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHJvbGxiYWNrLCBCQ01PU19UUlVFKTsKKwlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHN0YXR1cywgQkNNT0xUX1NUQVRVU19PTik7CisJcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQoY3VycmVudF9kZXZpY2UsICZvbnVfdHVuaW5nX291dC5oZHIpOworCWlmIChyYyAhPSBCQ01fRVJSX09LKQorCQliY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiT05VPSV1IHR1bmluZyBvdXQgZnJvbSBQT049JXUgZmFpbGVkXG4iLCBvbnVfaWQsIHNvdXJjZV9wb25fbmkpOworCisJcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFN1YnNjcmliZSBmb3IgZGV2aWNlIGNoYW5nZSBpbmRpY2F0aW9uICovCisgICAgaWYgKCFvbnVfdHVuaW5nX2lzX3JlZ2lzdGVyZWQpCisgICAgeworICAgIAlvbnVfdHVuaW5nX2lzX3JlZ2lzdGVyZWQgPSBCQ01PU19UUlVFOworCisgICAgICAgIGVyciA9IGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfZGV2aWNlX2NoYW5nZV9pbmQpOworICAgIH0KKyAgICByZXR1cm4gZXJyID8gZXJyIDogYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaV9jcmVhdGUodG9wX2Rpcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpX2NyZWF0ZShiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisKKyAgICBpZiAoYmNtY2xpX2Rpcl9maW5kKHRvcF9kaXIsICJvbnVfdHVuaW5nIikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZCgKKyAgICAgICAgdG9wX2RpciwKKyAgICAgICAgIm9udV90dW5pbmciLAorICAgICAgICAiTkdQT04yIE9OVSB0dW5pbmcgdXNlciBhcHBsaWNhdGlvbiIsCisgICAgICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sCisgICAgICAgIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighZGlyLCBCQ01fRVJSX05PTUVNKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAic3RhcnQiLCAiU3RhcnQgT05VIHR1bmluZyBhcHBsaWNhdGlvbiIsIG9udV90dW5pbmdfY21kX3N0YXJ0KTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAic3RvcCIsICJTdG9wIE9OVSB0dW5pbmcgYXBwbGljYXRpb24iLCBvbnVfdHVuaW5nX2NtZF9zdG9wKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJvbnVfaGFuZG92ZXIiLCAiT05VIGhhbmRvdmVyIiwgb251X2hhbmRvdmVyX2NtZCwKKwkJQkNNQ0xJX01BS0VfUEFSTSgib251IiwgIk9OVSBJRCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKwkJQkNNQ0xJX01BS0VfUEFSTSgic291cmNlX3Bvbl9uaSIsICJTb3VyY2UgUE9OX05JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorCQlCQ01DTElfTUFLRV9QQVJNKCJ0YXJnZXRfcG9uX25pIiwgIlRhcmdldCBQT05fTkkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisJCUJDTUNMSV9NQUtFX1BBUk0oInRhcmdldF9wb25faWRfYWRtaW5pc3RyYXRpdmVfbGFiZWwiLCAiVGFyZ2V0IFBPTiBJRCBBZG1pbmlzdHJhdGl2ZSBsYWJlbCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKwkJQkNNQ0xJX01BS0VfUEFSTSgidGFyZ2V0X3Bvbl9pZF9kd2xjaF9pZCIsICJUYXJnZXQgUE9OIElEIENoYW5uZWwgaWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisJCUJDTUNMSV9NQUtFX1BBUk0oInRpbWVfdG9fc3dpdGNoIiwgIlRpbWVfVG9fU3dpdGNoIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorCQlCQ01DTElfTUFLRV9QQVJNX0VOVU0oInJvbGxiYWNrIiwgIlJvbGxiYWNrIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisKKyAgICBvbnVfdHVuaW5nX2NsaV9kaXIgPSBkaXI7CisgICAgb251X3R1bmluZ19jbGlfdG9wX2RpciA9IHRvcF9kaXI7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmE5ZDc2NAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9PTlVfVFVOSU5HX0NMSV9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9PTlVfVFVOSU5HX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDAwNTYyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMgRVBPTiBvcHRpY2FsIG1vbml0b3JpbmcgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisKKwlNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfb21vbgorCU1PRF9UWVBFID0gbGliCisJTU9EX0RFUFMgPSBob3N0X2FwaQorCWlmbmVxICgiJChTSU1VTEFUSU9OX0JVSUxEKSIsICJ5IikKKwkJTU9EX0RFUFMgKz0gIGJjbV9ib2FyZCBpMmNfZGV2cworCWVuZGlmCisKKwlpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwkJTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorCWVuZGlmCisKKwlpZm5lcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCisJCXNyY3MgPSBvbW9uLmMKKwllbmRpZgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL29tb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9vbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyZmY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9vbW9uLmMKQEAgLTAsMCArMSwxMzgzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYm9hcmQuaD4KKyNpbmNsdWRlICJvbW9uLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisvKiBUaGVzZSBtYWNyb3MgbmVlZCB0byBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgZm9sbG93aW5nIGluY2x1ZGUuICovCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfU1RBUlQgdHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUihuYW1lLCBkZXNjLCB2YWwpIG5hbWUgPSB2YWwsCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfRU5EIH0gYmNtX2kyY19kZXZfYWRkcjsKKyNpbmNsdWRlICJiY21vbHRfaTJjX2RldnNfYWRkci5oIgorCisKKy8qIEZpeGVkIHNhbXBsZSBkZWxheSBleGNlZWRzIHRoZSBzdW0gb2YgdGhlIG1heGltdW0gZ3JhbnQgc2l6ZSBhbmQgYSB3b3JzdCBjYXNlCisgICByZXRyaWV2YWwgdGltZSBiYXNlZCBvbiB2YXJpb3VzIG9wdGljcyBtb2R1bGVzJyBkYXRhIHNoZWV0cyAqLworI2RlZmluZSBPTU9OX0ZJWEVEX1NBTVBMRV9ERUxBWV9VUyAgICAgIDEyMDAwCisjZGVmaW5lIFNGRl84NDcyX0lERU5USUZJRVJfQUREUiAgICAgICAgMHgwMCAgICAvKiBTRlAgYW5kIFhGUCBJZGVudGlmaWVyIGJ5dGUqLworI2RlZmluZSBTRkZfODA3N2lfSURFTlRJRklFUl9BRERSICAgICAgIDEyOCAgICAgLyogWEZQIElkZW50aWZpZXIgYnl0ZSAqLworI2RlZmluZSBTRkZfODQ3Ml9SWF9QT1dFUl9BRERSICAgICAgICAgIDEwNCAgICAgLyogU0ZQIG9mZmVzZXQgaW50byBBMiAqLworI2RlZmluZSBTRkZfODA3N2lfUlhfUE9XRVJfQUREUiAgICAgICAgIDEwNCAgICAgLyogWEZQIGJ5dGUgMTA0LzEwNSBpbnRvIEEwICAoeWVzIEEwKSAqLworI2RlZmluZSBTRkZfODA3N2lfVkVORE9SX05BTUVfQUREUiAgICAgIDE0OCAgICAgLyogWEZQIGJ5dGVzIDE2My0xNDggaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfTkFNRV9MRU4gICAgICAgMTYgICAgICAvKiBYRlAgbmFtZSBsZW5ndGggICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfUE5fQUREUiAgICAgICAgMTY4ICAgICAvKiBYRlAgYnl0ZXMgMTgzLTE2OCBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9QTl9MRU4gICAgICAgICAxNiAgICAgIC8qIFhGUCBwYXJ0IG51bWJlciBsZW5ndGggICAqLworI2RlZmluZSBTRkZfODA3N2lfVkVORE9SX1JFVl9BRERSICAgICAgIDE4NCAgICAgLyogWEZQIGJ5dGVzIDE4NS0xODQgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfUkVWX0xFTiAgICAgICAgMiAgICAgICAvKiBYRlAgcmV2aXNpb24gbGVuICAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9TTl9BRERSICAgICAgICAxOTYgICAgIC8qIFhGUCBieXRlcyAyMTEtMTk2IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODA3N2lfVkVORE9SX1NOX0xFTiAgICAgICAgIDE2ICAgICAgLyogWEZQIHNlcmlhbCBudW1iZXIgbGVuICAgKi8KKyNkZWZpbmUgT01PTl9UQVNLX01TR19RX1NJWkUgICAgICAgICAgICAxNiAgICAgIC8qIGFsbG93IG9uZSBtZXNzYWdlIHBlciBwb3J0ICovCisjZGVmaW5lIFNGRl9QQUdFX0FERFIxICAgICAgICAgICAgICAgICAgMCAgICAgICAvKiB1c2UgU0ZQX0kyQ19BRERSMSBmb3IgSTJDIHJlYWQgQTAgKi8KKyNkZWZpbmUgU0ZGX1BBR0VfQUREUjIgICAgICAgICAgICAgICAgICAxICAgICAgIC8qIHVzZSBTRlBfSTJDX0FERFIyIGZvciAxMkMgcmVhZCBBMiAqLworCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9OQU1FX0FERFIgICAgICAyMCAgICAgIC8qIFNGUCBieXRlcyAyMC0zNSBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX05BTUVfTEVOICAgICAgIDE2ICAgICAgLyogU0ZQIG5hbWUgbGVuZ3RoICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfT1VJX0FERFIgICAgICAgMzcgICAgICAvKiBTRlAgYnl0ZXMgMzctMzkgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9PVUlfTEVOICAgICAgICAzICAgICAgIC8qIFNGUCBvdWkgbGVuZ3RoICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfUE5fQUREUiAgICAgICAgNDAgICAgICAvKiBTRlAgYnl0ZXMgNDAtNTUgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9QTl9MRU4gICAgICAgICAxNiAgICAgIC8qIFNGUCBwYXJ0IG51bWJlciBsZW5ndGggICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfUkVWX0FERFIgICAgICAgNTYgICAgICAvKiBTRlAgYnl0ZXMgNTYtNTkgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9SRVZfTEVOICAgICAgICA0ICAgICAgIC8qIFNGUCByZXZpc2lvbiBsZW4gICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfU05fQUREUiAgICAgICAgNjggICAgICAvKiBTRlAgYnl0ZXMgNjgtODMgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9TTl9MRU4gICAgICAgICAxNiAgICAgIC8qIFNGUCBzZXJpYWwgbnVtYmVyIGxlbiAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9TRkZfQUREUiAgICAgICA5NCAgICAgIC8qIFNGUCBieXRlcyA5NCBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1NGRl9MRU4gICAgICAgIDEgICAgICAgLyogU0ZQIFNGRi04NDcyIENvbXBsaWFuY2UgcmV2aXNpb24gbGVuICAgKi8KKworI2RlZmluZSBTRkZfODQ3Ml9ESUFHX01PTl9BRERSICAgICAgICAgOTIgICAgICAvKiBTRlAgYnl0ZXMgOTIgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84NDcyX0VOSEFOQ0VEX09QVF9BRERSICAgICA5MyAgICAgIC8qIFNGUCBieXRlcyA5MyBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVEVNUEVSQVRVUkVfQUREUiAgICAgIDk2ICAgICAgLyogU0ZQIGJ5dGVzIDk2IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODQ3Ml9ESUFHX01PTl9MRU4gICAgICAgICAgMSAgICAgICAvKiBTRlAgU0ZGLTg0NzIgRGlhZ25vc3RpYyBNb25pdG9yaW5nIFR5cGUgbGVuICAgKi8KKworLyogVGFibGUgMzIgNS4yIElkZW50aWZpZXIgdmFsdWVzIFNGRjgwNzdpKi8KKyNkZWZpbmUgU0ZGX0lERU5USUZJRVJfU0ZQICAweDAzCisjZGVmaW5lIFNGRl9JREVOVElGSUVSX1hGUCAgMHgwNgorCit0eXBlZGVmIHVpbnQzMl90IG9tb25fcnNzaV92YWx1ZTsKKworCisvKiBVbmlxdWVseSBpZGVudGlmaWVzIHNwZWNpZmljIEVQT04gbGlua3MgdW5kZXIgbWFuYWdlbWVudCBieSB0aGlzCisgICBhcHBsaWNhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHJlc3M7Cit9IG9tb25fbGlua19rZXk7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCAgY2FkZHI7ICAgIC8qIEkyQyBzd2l0Y2ggY29udHJvbCBhZGRyZXNzICovCisgICAgdWludDMyX3QgIHNjdHJsOyAgICAvKiBJMkMgc3dpdGNoIGNvbnRyb2wgY29tbWFuZCB2YWx1ZSAqLworfSBpMmNfY29vcmRzOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnIG9zX21zZzsKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIHVpbnQxNl90IHRyaWdnZXJfd2lkdGhfbnM7CisgICAgdWludDE2X3QgdHJpZ2dlcl9kZWxheV9uczsKKyAgICB1aW50MTZfdCBzYW1wbGVfcGVyaW9kX3VzOworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIGJjbW9sdF9lcG9uX2xsaWQgbGxpZDsKKyAgICB1aW50OF90IHNjYW5fbW9kZTsKK30gb21vbl90YXNrX21zZzsKKworCitzdGF0aWMgZGV2X2xvZ19pZCBvbW9uX2xvZ19pZCA9IERFVl9MT0dfSU5WQUxJRF9JRDsKK3N0YXRpYyBiY21vc190YXNrIG9tb25fdGFzazsKK3N0YXRpYyBiY21vc19ib29sIGlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQkNNOTY4NjIwIHBsYXRmb3JtIGRlcGVuZGVudCBJMkMgYWNjZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3VpbnQ4X3QgYmNtOTY4NjIwX2NsaWVudF9zd2l0Y2hjdHJsX3NmcFsxNl1bMl0gPQoreworICAgIHsgICAweDcyLCAgICAgMHg4MCwgfSwKKyAgICB7ICAgMHg3MiwgICAgIDB4NDAsIH0sCisgICAgeyAgIDB4NzIsICAgICAweDIwLCB9LAorICAgIHsgICAweDcyLCAgICAgMHgxMCwgfSwKKyAgICB7ICAgMHg3MiwgICAgICAweDgsIH0sCisgICAgeyAgIDB4NzIsICAgICAgMHg0LCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4MiwgfSwKKyAgICB7ICAgMHg3MiwgICAgICAweDEsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDEwLCB9LAorICAgIHsgICAweDczLCAgICAgMHgyMCwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4NDAsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDgwLCB9LAorICAgIHsgICAweDczLCAgICAgIDB4MSwgfSwKKyAgICB7ICAgMHg3MywgICAgICAweDIsIH0sCisgICAgeyAgIDB4NzMsICAgICAgMHg0LCB9LAorICAgIHsgICAweDczLCAgICAgIDB4OCwgfSwKK307CisKKwordWludDhfdCBiY205Njg2MjBfY2xpZW50X3N3aXRjaGN0cmxfeGZwWzhdWzJdID0KK3sKKyAgICAvKiBjYWRkciwgICAgc2N0cmwgKi8KKyAgICB7ICAgMHg3MiwgICAgICAweDgsIH0sCisgICAgeyAgIDB4NzIsICAgICAgMHg0LCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4MiwgfSwKKyAgICB7ICAgMHg3MiwgICAgICAweDEsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDEwLCB9LAorICAgIHsgICAweDczLCAgICAgMHgyMCwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4NDAsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDgwLCB9LAorfTsKKworc3RhdGljIGJjbW9zX2Jvb2wgb21vbl9pc19lcG9uX25pX3ZhbGlkKGJjbW9sdF9lcG9uX25pIGVwb24pCit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldChjdXJyZW50X2RldmljZSwgJnN5c3RlbV9tb2RlKTsKKworICAgIHN3aXRjaCAoc3lzdGVtX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YOgorICAgICAgICAgICAgcmV0dXJuIGVwb24gPCAxNjsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgICAgICAgICByZXR1cm4gZXBvbiA8IDg7CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF9DT0VYSVNURU5DRV9URE1BOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgICAgICAgICAgcmV0dXJuIGVwb24gPCA0OworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRzoKKyAgICAgICAgICAgIHJldHVybiBlcG9uIDwgMjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHRyeF9pZF9mcm9tX2Vwb25fbmkoYmNtb2x0X2Vwb25fbmkgZXBvbiwgdWludDhfdCAqdHJ4X2lkKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGVwb25fNHhbNF0gPSB7IDIsIDMsIDYsIDcgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBlcG9uXzJ4XzEwZ1syXSA9IHsgMywgNCB9OworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsKKworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoY3VycmVudF9kZXZpY2UsICZzeXN0ZW1fbW9kZSk7CisKKyAgICBzd2l0Y2ggKHN5c3RlbV9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMTZfWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRzoKKyAgICAgICAgICAgICp0cnhfaWQgPSAodWludDhfdCllcG9uOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWDoKKyAgICAgICAgICAgICp0cnhfaWQgPSBlcG9uXzR4W2Vwb25dOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HOgorICAgICAgICAgICAgKnRyeF9pZCA9IGVwb25fMnhfMTBnW2Vwb25dOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqdHJ4X2lkID0gKHVpbnQ4X3QpLTE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqIGJjbW9sdF9nZXRfc2Nhbl9yZXN1bHQoYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIHN0YXR1cykKK3sKKyAgICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0NPTVBMRVRFOgorICAgICAgICAgICAgcmV0dXJuICJPSzogRVBPTiBST0dVRSBTQ0FOIElTIENPTVBMRVRFIjsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9TVEFURV9JU19CQUQ6CisgICAgICAgICAgICByZXR1cm4gIkZBSUw6IFJFUVVFU1RFRCBMTElEIElTIElOIFVTRSI7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX0lOVEVSTkFMOgorICAgICAgICAgICAgcmV0dXJuICJGQUlMOiBTQ0FOIEhBRCBBTiBJTlRFUk5BTCBTVyBFUlJPUiI7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX05PUkVTOgorICAgICAgICAgICAgcmV0dXJuICJGQUlMOiBOTyBSRVNPVVJDRVMgQVZBSUxBQkxFIjsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9JU19PT1I6CisgICAgICAgICAgICByZXR1cm4gIkZBSUw6IFJFUVVFU1RFRCBMTElEIElTIE9VVCBPRiBSQU5HRSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIk9LOiBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEUiOworICAgIH0KK30KKworLyoqCisgKiBcYnJpZWYgR2V0IEkyQyBhZGRyZXNzCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBJMkMgbXV4IHRhcmdldCBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gbGlua19rZXkKKyAqIG9iamVjdC4KKyAqCisgKiBccGFyYW0gZXBvbl9uaSBFUE9OIHBvcnQgaW5kZXgKKyAqIFxwYXJhbSBjb29yZHMgSTJDIG11eCB0YXJnZXQgY29udGFpbmVyCisgKgorICogXHJldHVybgorICogTm9uZQorICovCitzdGF0aWMKK3ZvaWQgb21vbl9nZXRfaTJjX2Nvb3Jkcyh1aW50OF90IHRyeF9pZCwgaTJjX2Nvb3JkcyogY29vcmRzKQoreworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsKKworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoMCwgJnN5c3RlbV9tb2RlKTsKKworICAgIGlmIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUEpCisgICAgeworICAgICAgICBjb29yZHMtPmNhZGRyICA9IGJjbTk2ODYyMF9jbGllbnRfc3dpdGNoY3RybF94ZnBbdHJ4X2lkXVswXTsKKyAgICAgICAgY29vcmRzLT5zY3RybCAgPSBiY205Njg2MjBfY2xpZW50X3N3aXRjaGN0cmxfeGZwW3RyeF9pZF1bMV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvb3Jkcy0+Y2FkZHIgID0gYmNtOTY4NjIwX2NsaWVudF9zd2l0Y2hjdHJsX3NmcFt0cnhfaWRdWzBdOworICAgICAgICBjb29yZHMtPnNjdHJsICA9IGJjbTk2ODYyMF9jbGllbnRfc3dpdGNoY3RybF9zZnBbdHJ4X2lkXVsxXTsKKyAgICB9Cit9IC8qIG9tb25fZ2V0X2kyY19jb29yZHMgKi8KKworCisvKioKKyAqIFxicmllZiBDb25maWd1cmUgSTJDIG11eAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgSTJDIG11eCB0byB0YXJnZXQgdGhlIGNvcnJlY3Qgb3B0aWNzIG1vZHVsZSBmb3IKKyAqIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIFJTU0kgbWVhc3VyZW1lbnQuCisgKgorICogXHBhcmFtIGVwb25fbmkgRVBPTiBwb3J0IGluZGV4CisgKgorICogXHJldHVybgorICogQkNNX0VSUl9PSyBpZiBzdWNjZXNzZnVsLCBlcnJvciBjb2RlIGlmIG5vdAorICovCitzdGF0aWMKK2JjbW9zX2Vycm5vIG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyh1aW50OF90IHRyeF9pZCwgdWludDhfdCBwYWdlKQoreworCisgICAgIGkyY19jb29yZHMgY29vcmRzOworICAgICBiY21vc19lcnJubyByYzsKKworICAgICBvbW9uX2dldF9pMmNfY29vcmRzKHRyeF9pZCwgJmNvb3Jkcyk7CisKKyAgICAgcmMgPSBiY21fYm9hcmRfZGV2X2NoYW5nZShjb29yZHMuY2FkZHIpOworICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgeworICAgICAgICAgIEJDTV9MT0coV0FSTklORywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAiYmNtX2JvYXJkX2Rldl9jaGFuZ2UoJXUpIGZhaWxlZFxuIiwgY29vcmRzLmNhZGRyKTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgIHJjID0gYmNtX2JvYXJkX3N3aXRjaF93cml0ZShjb29yZHMuc2N0cmwpOworICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICB7CisgICAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICAgImJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUoJXUpIGZhaWxlZFxuIiwgY29vcmRzLnNjdHJsKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAocGFnZSA9PSBTRkZfUEFHRV9BRERSMSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoU0ZQX0kyQ19BRERSMSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB7ICAgLy8gU0ZGX1BBR0VfQUREUjIKKyAgICAgICAgICAgICAgICAgcmMgPSBiY21fYm9hcmRfZGV2X2NoYW5nZShTRlBfSTJDX0FERFIyKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJjbV9ib2FyZF9kZXZfY2hhbmdlKCV1KSBmYWlsZWRcbiIsIChTRlBfSTJDX0FERFIxK3BhZ2UpKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuIHJjOworCit9IC8qIG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyAqLworCisKKy8qKgorICogXGJyaWVmIFJlYWQgTWFudWZhY3R1cmluZyBkYXRhIGZyb20gT3B0aWMgTW9kdWxlCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgWEZQIFRyYW5jZWl2ZXIgRGF0YSAoYWNjb3JkaW5nIHRvCisgKiBTRkY4MDc3aSBmb3IgYW4gWEZQKSBmcm9tIGFuIG9wdGljcyBtb2R1bGUuIFRoZSByZXN1bHQgaXMKKyAqIGRpc3BsYXllZCBmb3IgdGhpcyBzYW1wbGUgY29kZS4KKyAqCisgKiBccGFyYW0gZXBvbl9uaSBFUE9OIE5JIHRvIHRha2UgbWVhc3VyZW1lbnQKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl90cnhfc3RhdHVzX3JlYWQoYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgdWludDMyX3Qgc2ZmX2lkZW50aWZpZXIgPSAxOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICB1aW50OF90IGk7CisKKyAgICAvLyA4MDc3MSBYRlAgU3BlY2lmaWMgc3R1ZmYKKyAgICB1aW50MzJfdCByYXdfdmVuZG9ySWRfODA3N2k7CisgICAgdWludDhfdCB2ZW5kb3JJZF84MDc3aVtTRkZfODA3N2lfVkVORE9SX05BTUVfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JQbl84MDc3aTsKKyAgICB1aW50OF90IHZlbmRvclBuXzgwNzdpW1NGRl84MDc3aV9WRU5ET1JfUE5fTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JTbl84MDc3aTsKKyAgICB1aW50OF90IHZlbmRvclNuXzgwNzdpW1NGRl84MDc3aV9WRU5ET1JfU05fTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JSZXZfODA3N2k7CisgICAgdWludDhfdCB2ZW5kb3JSZXZfODA3N2lbU0ZGXzgwNzdpX1ZFTkRPUl9SRVZfTEVOKzFdOworCisgICAgbWVtc2V0KCZ2ZW5kb3JJZF84MDc3aSwgMCwgc2l6ZW9mKHZlbmRvcklkXzgwNzdpKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JQbl84MDc3aSwgMCwgc2l6ZW9mKHZlbmRvclBuXzgwNzdpKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JTbl84MDc3aSwgMCwgc2l6ZW9mKHZlbmRvclNuXzgwNzdpKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JSZXZfODA3N2ksIDAsIHNpemVvZih2ZW5kb3JSZXZfODA3N2kpKTsKKworICAgIC8vIDg0NzIgU0ZQIFNwZWNpZmljIHN0dWZmCisgICAgdWludDMyX3QgcmF3X3ZlbmRvcklkXzg0NzI7CisgICAgdWludDhfdCB2ZW5kb3JJZF84NDcyW1NGRl84NDcyX1ZFTkRPUl9OQU1FX0xFTisxXTsKKyAgICB1aW50MzJfdCByYXdfdmVuZG9yUG5fODQ3MjsKKyAgICB1aW50OF90IHZlbmRvclBuXzg0NzJbU0ZGXzg0NzJfVkVORE9SX1BOX0xFTisxXTsKKyAgICB1aW50MzJfdCByYXdfdmVuZG9yU25fODQ3MjsKKyAgICB1aW50OF90IHZlbmRvclNuXzg0NzJbU0ZGXzg0NzJfVkVORE9SX1NOX0xFTisxXTsKKyAgICB1aW50MzJfdCByYXdfdmVuZG9yUmV2Xzg0NzI7CisgICAgdWludDhfdCB2ZW5kb3JSZXZfODQ3MltTRkZfODQ3Ml9WRU5ET1JfUkVWX0xFTisxXTsKKyAgICB1aW50MzJfdCByYXdfdmVuZG9yU2ZmXzg0NzI7CisgICAgdWludDhfdCB2ZW5kb3JTZmZfODQ3MltTRkZfODQ3Ml9WRU5ET1JfU0ZGX0xFTisxXTsKKyAgICB1aW50MzJfdCByYXdfdmVuZG9yT3VpXzg0NzI7CisgICAgdWludDhfdCB2ZW5kb3JPdWlfODQ3MltTRkZfODQ3Ml9WRU5ET1JfT1VJX0xFTisxXTsKKyAgICB1aW50MzJfdCByYXdfZGlhZ01vbl84NDcyOworICAgIHVpbnQ4X3QgZGlhZ01vbl84NDcyID0gMDsKKyAgICB1aW50MzJfdCByYXdfZW5oYW5jZWRPcHRfODQ3MjsKKyAgICB1aW50OF90IGVuaGFuY2VkT3B0Xzg0NzIgPSAwOworCisgICAgbWVtc2V0KCZ2ZW5kb3JJZF84NDcyLCAwLCBzaXplb2YodmVuZG9ySWRfODQ3MikpOworICAgIG1lbXNldCgmdmVuZG9yUG5fODQ3MiwgMCwgc2l6ZW9mKHZlbmRvclBuXzg0NzIpKTsKKyAgICBtZW1zZXQoJnZlbmRvclNuXzg0NzIsIDAsIHNpemVvZih2ZW5kb3JTbl84NDcyKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JSZXZfODQ3MiwgMCwgc2l6ZW9mKHZlbmRvclJldl84NDcyKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JTZmZfODQ3MiwgMCwgc2l6ZW9mKHZlbmRvclNmZl84NDcyKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JPdWlfODQ3MiwgMCwgc2l6ZW9mKHZlbmRvck91aV84NDcyKSk7CisKKyAgICB1aW50OF90KiB0bXByZXN1bHQ7CisgICAgaW50MTZfdCB0ZW1wX3Jlc3VsdCA9IDA7CisgICAgdWludDMyX3QgcmF3X3RlbXBfcmVzdWx0ID0gMDsKKworICAgIHVpbnQ4X3QgdHJ4X2lkOworCisgICAgaWYgKCAhIHRyeF9pZF9mcm9tX2Vwb25fbmkoZXBvbl9uaSwgJnRyeF9pZCkgKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIlRSWCBJZCBpcyBpbnZhbGlkIGZvciBFUE9OIE5JICVkIFxuIiwgZXBvbl9uaSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGNoYXIgKnBTZnBUeXBlOworCisgICAgcFNmcFR5cGUgPSAiVU5LTiI7CisKKworICAgIC8vIENoZWNrIGZvciB0cmFuc2V2aWVyIHByZXNlbmNlCisgICAgaWYgKCAocmMgPSBvbW9uX3BsYXRmb3JtX2NvbmZpZ3VyZV9pMmModHJ4X2lkLCBTRkZfUEFHRV9BRERSMSkpID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBSZWFkIG1vZHVsZSBpZGVudGlmaWVyICovCisgICAgICAgIGlmICggKHJjID0gYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX0lERU5USUZJRVJfQUREUiwgJnNmZl9pZGVudGlmaWVyKSkgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChzZmZfaWRlbnRpZmllciAmIDB4MDAwRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNGRl9JREVOVElGSUVSX1NGUDoKKyAgICAgICAgICAgICAgICAgICAgcFNmcFR5cGUgPSAiU0ZQXDAiOworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSB2ZW5kb3IgSWQKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzg0NzJfVkVORE9SX05BTUVfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfVkVORE9SX05BTUVfQUREUitpLCAmcmF3X3ZlbmRvcklkXzg0NzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9ySWRfODQ3MltpXSA9ICh1aW50OF90KXJhd192ZW5kb3JJZF84NDcyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcGFydCBOdW1iZXIsIHNlcmlhbCBudW1iZXIsIFNGRiByZXZpc2lvbiwgYW5kIFJldmlzaW9uCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84NDcyX1ZFTkRPUl9QTl9MRU47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODQ3Ml9WRU5ET1JfUE5fQUREUitpLCAmcmF3X3ZlbmRvclBuXzg0NzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUG5fODQ3MltpXSA9ICh1aW50OF90KXJhd192ZW5kb3JQbl84NDcyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzg0NzJfVkVORE9SX1NOX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX1ZFTkRPUl9TTl9BRERSK2ksICZyYXdfdmVuZG9yU25fODQ3Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JTbl84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclNuXzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfUkVWX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX1ZFTkRPUl9SRVZfQUREUitpLCAmcmF3X3ZlbmRvclJldl84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclJldl84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclJldl84NDcyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzg0NzJfVkVORE9SX1NGRl9MRU47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODQ3Ml9WRU5ET1JfU0ZGX0FERFIraSwgJnJhd192ZW5kb3JTZmZfODQ3Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JTZmZfODQ3MltpXSA9ICh1aW50OF90KXJhd192ZW5kb3JTZmZfODQ3MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfT1VJX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX1ZFTkRPUl9PVUlfQUREUitpLCAmcmF3X3ZlbmRvck91aV84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck91aV84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvck91aV84NDcyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODQ3Ml9ESUFHX01PTl9BRERSLCAmcmF3X2RpYWdNb25fODQ3Mik7CisgICAgICAgICAgICAgICAgICAgIGRpYWdNb25fODQ3MiA9ICh1aW50OF90KXJhd19kaWFnTW9uXzg0NzI7CisKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODQ3Ml9FTkhBTkNFRF9PUFRfQUREUiwgJnJhd19lbmhhbmNlZE9wdF84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgZW5oYW5jZWRPcHRfODQ3MiA9ICh1aW50OF90KXJhd19lbmhhbmNlZE9wdF84NDcyOworCisgICAgICAgICAgICAgICAgICAgIC8vIFNoaWZ0IHRvIEEyCisgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBvbW9uX3BsYXRmb3JtX2NvbmZpZ3VyZV9pMmModHJ4X2lkLCBTRkZfUEFHRV9BRERSMik7CisgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoMTYsIFNGRl84NDcyX1RFTVBFUkFUVVJFX0FERFIsICZyYXdfdGVtcF9yZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgIHRtcHJlc3VsdCA9ICh1aW50OF90KikoJnJhd190ZW1wX3Jlc3VsdCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9yZXN1bHQgPSB0bXByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcmVzdWx0ID0gKHRlbXBfcmVzdWx0IDw8IDgpIHwgdG1wcmVzdWx0WzJdOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRkZfSURFTlRJRklFUl9YRlA6CisKKyAgICAgICAgICAgICAgICAgICAgcFNmcFR5cGUgPSAiWEZQXDAiOworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSB2ZW5kb3IgSWQKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzgwNzdpX1ZFTkRPUl9OQU1FX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84MDc3aV9WRU5ET1JfTkFNRV9BRERSK2ksICZyYXdfdmVuZG9ySWRfODA3N2kpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9ySWRfODA3N2lbaV0gPSAodWludDhfdClyYXdfdmVuZG9ySWRfODA3N2k7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBwYXJ0IE51bWJlciwgU04sIGFuZCBSZXZpc2lvbgorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODA3N2lfVkVORE9SX1BOX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84MDc3aV9WRU5ET1JfUE5fQUREUitpLCAmcmF3X3ZlbmRvclBuXzgwNzdpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclBuXzgwNzdpW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclBuXzgwNzdpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzgwNzdpX1ZFTkRPUl9TTl9MRU47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODA3N2lfVkVORE9SX1NOX0FERFIraSwgJnJhd192ZW5kb3JTbl84MDc3aSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JTbl84MDc3aVtpXSA9ICh1aW50OF90KXJhd192ZW5kb3JTbl84MDc3aTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84MDc3aV9WRU5ET1JfUkVWX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84MDc3aV9WRU5ET1JfUkVWX0FERFIraSwgJnJhd192ZW5kb3JSZXZfODA3N2kpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUmV2XzgwNzdpW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclJldl84MDc3aTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT0RFVjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgIlRSWCBDb3VsZCBub3QgcmVhZCBkZXZpY2UgOiBTRkZfODQ3Ml9JREVOVElGSUVSX0FERFIgZm9yIFBPTiAlZCByYyAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICBlcG9uX25pLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiVFJYIENvdWxkIG5vdCBjb25maWd1cmUgcGxhdGZvcm0gOiBTRkZfUEFHRV9BRERSMSBmb3IgUE9OICVkIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgZXBvbl9uaSwgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJjID0gQkNNX0VSUl9OT0RFVjsKKyAgICB9CisKKworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgaWYgKCAoc2ZmX2lkZW50aWZpZXIgJiAweDAwMEYpID09IFNGRl9JREVOVElGSUVSX1hGUCkKKyAgICAgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5bT01PTl0gJXMgVHJhbmNlaXZlciBpcyBwcmVzZW50IG9uIFBPTiAlZFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFtPTU9OXSBUcnggVmVuZG9yIElkIGlzOiAlc1xyXG4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtPTU9OXSBWZW5kb3IgUGFydCBOdW1iZXI6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBTZXJpYWwgTnVtYmVyOiAlc1xyXG4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtPTU9OXSBWZW5kb3IgUmV2aXNpb246ICVzXHJcbiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmcFR5cGUsIGVwb25fbmksIHZlbmRvcklkXzgwNzdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUG5fODA3N2ksIHZlbmRvclNuXzgwNzdpLCB2ZW5kb3JSZXZfODA3N2kpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU0ZQIHN0dWZmCisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuW09NT05dICVzIFRyYW5jZWl2ZXIgaXMgcHJlc2VudCBvbiBQT04gJWRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgW09NT05dIFRyeCBWZW5kb3IgSWQgaXM6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtPTU9OXSBWZW5kb3IgUGFydCBOdW1iZXI6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtPTU9OXSBWZW5kb3IgU2VyaWFsIE51bWJlcjogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBSZXZpc2lvbjogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBPVUk6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtPTU9OXSBUcmFuc2NlaXZlciBUZW1wZXJhdHVyZTogJWRDXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtPTU9OXSBFbmhhbmNlZCBPcHRpb25zIFNGRi04NDcyIEJ5dGUgOTM6ICV4XHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtPTU9OXSBEaWFnbm9zdGljIE1vbml0b3IgVHlwZSBTRkYtODQ3MiBCeXRlIDkyOiAleFxyXG4gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZnBUeXBlLCBlcG9uX25pLCB2ZW5kb3JJZF84NDcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUG5fODQ3MiwgdmVuZG9yU25fODQ3MiwgdmVuZG9yUmV2Xzg0NzIsIHZlbmRvck91aV84NDcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9yZXN1bHQvMjU2LCBlbmhhbmNlZE9wdF84NDcyLCBkaWFnTW9uXzg0NzIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30gLyogb21vbl9yc3NpX3JlYWQgKi8KKworLyoqCisgKiBcYnJpZWYgUmVhZCBSU1NJIHJlc3VsdHMgZnJvbSBJMkMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBSWCBQb3dlciBNZWFzdXJlbWVudCAoU0ZGODQ3MiBmb3IgYW4KKyAqIFNGUCBhbmQgU0ZGODA3N2kgZm9yIGFuIFhGUCkgZnJvbSBhbiBvcHRpY3MgbW9kdWxlLiBUaGUKKyAqIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhlIGdsb2JhbCBvbW9uX3N0YXRlLgorICoKKyAqIFxwYXJhbSBlcG9uX25pIEVQT04gTkkgdG8gdGFrZSBtZWFzdXJlbWVudAorICogXHBhcmFtIHJzc2lfdmFsdWUgUmV0dXJuZWQgUlNTSSB2YWx1ZSBpZiBzdWNjZXNzZnVsCisgKgorICogXHJldHVybgorICogQkNNX0VSUl9PSyBpZiBzdWNjZXNzZnVsLCBlcnJvciBjb2RlIGlmIG5vdAorICovCitzdGF0aWMKK2JjbW9zX2Vycm5vIG9tb25fcnNzaV9yZWFkKGJjbW9sdF9lcG9uX25pIGVwb25fbmksIHVpbnQzMl90ICpyc3NpX3ZhbHVlKQoreworICAgIHVpbnQzMl90IHJhd19yc3NpX3Jlc3VsdCA9IDA7CisgICAgdWludDMyX3Qgc2ZmX2lkZW50aWZpZXIgPSAxOworICAgIHVpbnQ4X3QgdHJ4X2lkOworICAgIHVpbnQzMl90IHJzc2lfcmVzdWx0ID0gMDsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDhfdCogcmVzdWx0OworCisgICAgaWYgKCAhIHRyeF9pZF9mcm9tX2Vwb25fbmkoZXBvbl9uaSwgJnRyeF9pZCkgKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIlRSWCBJZCBpcyBpbnZhbGlkIGZvciBFUE9OIE5JICVkIFxuIiwgZXBvbl9uaSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciB0cmFuc2V2aWVyIHByZXNlbmNlCisgICAgaWYgKGJjbV9ib2FyZF90cnhfcHJlc2VudCh0cnhfaWQpID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByYyA9IG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyh0cnhfaWQsIFNGRl9QQUdFX0FERFIxKTsKKyAgICAgICAgLyogUmVhZCBtb2R1bGUgaWRlbnRpZmllciAqLworCisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWFkIG1vZHVsZSBpZGVudGlmaWVyICovCisgICAgICAgICAgICByYyA9IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODQ3Ml9JREVOVElGSUVSX0FERFIsICZzZmZfaWRlbnRpZmllcik7CisKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh1aW50OF90KikoJnJhd19yc3NpX3Jlc3VsdCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNmZl9pZGVudGlmaWVyICYgMHgwMDBGKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTRkZfSURFTlRJRklFUl9TRlA6CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyh0cnhfaWQsIFNGRl9QQUdFX0FERFIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9yZWFkKDE2LCBTRkZfODQ3Ml9SWF9QT1dFUl9BRERSLCAmcmF3X3Jzc2lfcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNGRl9JREVOVElGSUVSX1hGUDoKKworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBiY21fYm9hcmRfZGV2X3JlYWQoMTYsIFNGRl84MDc3aV9SWF9QT1dFUl9BRERSLCAmcmF3X3Jzc2lfcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfTk9ERVY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJzc2lfcmVzdWx0ID0gcmVzdWx0WzNdOworICAgICAgICAgICAgICAgICAgICByc3NpX3Jlc3VsdCA9IChyc3NpX3Jlc3VsdCA8PCA4KSB8IHJlc3VsdFsyXTsKKworICAgICAgICAgICAgICAgICAgICAqcnNzaV92YWx1ZSA9IHJzc2lfcmVzdWx0OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRSWCBDb3VsZCBub3QgcmVhZCBkZXZpY2UgOiBTRkZfODQ3Ml9JREVOVElGSUVSX0FERFIgZm9yIFBPTiAlZCByYyAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXBvbl9uaSwgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lPOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICJUUlggQ291bGQgbm90IHJlYWQgcGxhdGZvcm0gOiBTRkZfUEFHRV9BRERSMSBmb3IgUE9OICVkIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fbmksIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lPOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9OT0RFVjsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9IC8qIG9tb25fcnNzaV9yZWFkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsYXRmb3JtIGluZGVwZW5kZW50IFJTU0kgbWVhc3VyZW1lbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogXGJyaWVmIFJlYWQgWEZQL1NGUCBEYXRhIGZyb20gVHJhbnNjZWl2ZXIgTW9kdWxlMQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIG1hbnVmYWN0dXJpbmcgZGF0YSBmcm9tIHRoZSBTRlAKKyAqIG1vZHVsZSB2aWEgSTJDLgorICoKKyAqIFxwYXJhbSBsaW5rX2tleSBFUE9OIE5JCisgKgorICogXHJldHVybgorICogTm9uZQorICovCitzdGF0aWMKK3ZvaWQgb21vbl90cnhfc3RhdHVzX2luaXRpYXRlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tb25fbGlua19rZXkgKmxpbmtfa2V5KQoreworCisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBQZXJmb3JtIHRoZSBJMkMgb3BlcmF0aW9ucyBzcGVjaWZpZWQgaW4gU0ZGLTg0NzIgKFNGUCkvU0ZGLTgwNzdpIChYRlApIHRvCisgICAgICAgcmV0cmlldmUgdGhlIHBtYW51ZmFjdHVyZXIgZGF0YSBmcm9tIHRoZSBvcHRpY3MgbW9kdWxlLiAqLworCisgICAgaWYgKCEgb21vbl9pc19lcG9uX25pX3ZhbGlkKGxpbmtfa2V5LT5lcG9uX25pKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gVFJYIFN0YXR1czogZXBvbl9uaSBvZiAoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgcGxhdGZvcm1cbiIsIGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gQ2hlY2sgZm9yIHRyYW5zY2VpdmVyIHByZXNlbmNlCisKKyAgICB1aW50OF90IHRyeF9pZDsKKworICAgIGlmICggISB0cnhfaWRfZnJvbV9lcG9uX25pKGxpbmtfa2V5LT5lcG9uX25pLCAmdHJ4X2lkKSApCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiW09NT05dIFRSWCBJZCBpcyBpbnZhbGlkIGZvciBFUE9OIE5JICVkIFxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmMgPSBiY21fYm9hcmRfdHJ4X3ByZXNlbnQodHJ4X2lkKTsKKworICAgIGlmIChyYyA9PSBCQ01fRVJSX05PREVWKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAiW09NT05dIFRSWCBTdGF0dXM6IFRyeF9pZCAlZCBOb3QgUHJlc2VudCBvbiBQT04gJWRcclxuICIsIHRyeF9pZCwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmMgPSBvbW9uX3RyeF9zdGF0dXNfcmVhZCh0cnhfaWQsIHNlc3Npb24pOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiW09NT05dIElzc3VlIFRSWCBTdGF0dXM6IFJlYWQgb3BlcmF0aW9uIGZhaWxlZCB3aXRoIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBOb3RpZnkgZXh0ZXJuYWwgaG9zdCBjb2RlIG9mIHRoZSBvdXRjb21lIHRocm91Z2ggYW4gb3B0aW9uYWwgY2FsbGJhY2ssCisgICAgICAgZGVmYXVsdGluZyB0byBvdXRwdXQgaW4gdGhlIENMSSBzZXNzaW9uIHdoZXJlIHRoZSBjb21tYW5kIHdhcyBpbml0aWF0ZWQKKyAgICAgICBpZiBubyBjYWxsYmFjayBpcyBzdXBwbGllZC4gKi8KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlxuW09NT05dIFRSWCBTdGF0dXM6IERhdGEgb24gUE9OICVkIENvbXBsZXRlXHJcbiIsIGxpbmtfa2V5LT5lcG9uX25pKTsKK30KKy8qKgorICogXGJyaWVmIFJlYWQgUlNTSSBNZWFzdXJlbWVudCBSZXN1bHQgZnJvbSBUcmFuc2NlaXZlciBNb2R1bGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBzdG9yZWQgUlNTSSBtZWFzdXJlbWVudCBmcm9tIHRoZQorICogWEZQL1NGUCBtb2R1bGUgdmlhIEkyQy4KKyAqCisgKiBccGFyYW0gbGlua19rZXkgRVBPTiBOSQorICoKKyAqIFxyZXR1cm4KKyAqIE5vbmUKKyAqLworc3RhdGljCit2b2lkIG9tb25fcnNzaV9yZWFkX2luaXRpYXRlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tb25fbGlua19rZXkgKmxpbmtfa2V5KQoreworICAgIHVpbnQzMl90IHJzc2lfdmFsdWUgPSAwOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKCEgb21vbl9pc19lcG9uX25pX3ZhbGlkKGxpbmtfa2V5LT5lcG9uX25pKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gUnNzaSBSZWFkOiBlcG9uX25pIG9mICglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybVxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIC8qIFBlcmZvcm0gdGhlIEkyQyBvcGVyYXRpb25zIHNwZWNpZmllZCBpbiBTRkYtODQ3MiAoU0ZQKS9TRkYtODA3N2kgKFhGUCkgdG8KKyAgICAgICByZXRyaWV2ZSB0aGUgcG93ZXIgbWVhc3VyZW1lbnRzIGZyb20gdGhlIG9wdGljcyBtb2R1bGUuICovCisgICAgcmMgPSBvbW9uX3Jzc2lfcmVhZChsaW5rX2tleS0+ZXBvbl9uaSwgJnJzc2lfdmFsdWUpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfTk9ERVYpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICJbT01PTl0gUnNzaSBSZWFkOiBUUlggTm90IFByZXNlbnQgb24gUE9OICVkXHJcbiAiLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9JTykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAiW09NT05dIFJzc2kgUmVhZDogQ291bGQgbm90IHJlYWQgZGV2aWNlIGZvciBQT04gJWQgXG4iLGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAiSXNzdWUgUlNTSSBSZWFkIG9wZXJhdGlvbiBmYWlsZWQgd2l0aCByYyAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIE5vdGlmeSBleHRlcm5hbCBob3N0IGNvZGUgb2YgdGhlIG91dGNvbWUgdGhyb3VnaCBhbiBvcHRpb25hbCBjYWxsYmFjaywKKyAgICAgICBkZWZhdWx0aW5nIHRvIG91dHB1dCBpbiB0aGUgQ0xJIHNlc3Npb24gd2hlcmUgdGhlIGNvbW1hbmQgd2FzIGluaXRpYXRlZAorICAgICAgIGlmIG5vIGNhbGxiYWNrIGlzIHN1cHBsaWVkLiAqLworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICJbT01PTl0gUlNTSSBSZWFkIFJYIFBvd2VyOiBQb25fbmk9JWQgcnggcG93ZXIgJWQuJWR1V1xyXG4iLAorICAgICAgICAgICAgbGlua19rZXktPmVwb25fbmksCisgICAgICAgICAgICByc3NpX3ZhbHVlLzEwLAorICAgICAgICAgICAgcnNzaV92YWx1ZSUxMCk7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICJcbltPTU9OXSBSU1NJIFJlYWQgb24gUE9OICVkIENvbXBsZXRlXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19rZXktPmVwb25fbmkpOworfQorLypvbW9uX3Jzc2lfcmVhZF9pbml0aWF0ZSovCisKKworLyoqCisgKiBcYnJpZWYgUmVxdWVzdCBNYXBsZSBGaXJtd2FyZSB0byBydW4gdGhlIFJvZ3VlIE9OVSBMTElEIHNjYW4uCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhbiBBUEkgbWVzc2FnZSB0byB0aGUgT0xUIHRvIHJ1biBhIHNjYW4KKyAqIG9uIGEgc3BlY2lmaWMgRVBPTiBMTElEIG9yIGFjcm9zcyBhbGwgTExJRHMgaW4gdGhlIFBPTi4KKyAqIFJlc3VsdHMgYXJlIHJldHVybmVkIHVwb24gY29tcGxldGlvbi4gUm9ndWUgTExJRHMgYXJlIG1hcmtlZAorICogYW5kIHF1YXJlbnRpbmVkIGZvciB0aGUgaG9zdCB0byBleGFtaW5lLgorICoKKyAqIFxwYXJhbSBsaW5rX2tleSBFUE9OIGxpbmsgaW5mb3JtYXRpb24KKyAqIFxwYXJhbSBlcG9wbl9sbGlkICBTcGVjaWZpYyBMTElEIHRvIHNjYW4KKyAqIFxwYXJhbSBzY2FuX21vZGUgICBTcGVjaWZpZXMgYSBzaW5nbGUgTExJRCBvciBBbGwuCisgKgorICogXHJldHVybgorICogTm9uZQorICovCisKK3N0YXRpYwordm9pZCBvbW9uX3J1bl9yb2d1ZV9sbGlkX3NjYW4oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21vbl9saW5rX2tleSAqbGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Nhbl9tb2RlKQoreworICAgIGNvbnN0IGJjbW9sdF9lcG9uX25pX2tleSBuaV9rZXkgPSB7IC5lcG9uX25pID0gbGlua19rZXktPmVwb25fbmkgfTsKKyAgICBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4gaXNzdWVfbGxpZF9zY2FuX29wOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBlcmZvcm0gYW4gQVBJIG9wZXJhdGlvbiBkaXJlY3RpbmcgdGhlIE1hcGxlIGZpcm13YXJlIHRvIGlzc3VlIGFuIGJjbW9sdF9lcG9uX25pX2lzc3VlX3JvZ3VlX3J4X3Bvd2VyCisgICAgICAgUlNTSSBncmFudCB0byB0aGUgc3BlY2lmaWVkIEVQT04gbGluay4gQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9ST0dVRV9SWF9QT1dFUiovCisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZpc3N1ZV9sbGlkX3NjYW5fb3AsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiAsIG5pX2tleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX2xsaWRfc2Nhbl9vcCwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBtb2RlLCBzY2FuX21vZGUpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZpc3N1ZV9sbGlkX3NjYW5fb3AsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiwgbGxpZCwgbGxpZCk7CisKKyAgICBCQ01fTE9HX0NBTExFUl9GTVQoSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAiSXNzdWUgUm9ndWUgU2NhbiBPcGVyYXRpb24gZm9yIExMSUQgMHgleCwgUG9uX25pPSVkXHJcbiIsIGxsaWQsIGxpbmtfa2V5LT5lcG9uX25pKTsKKworICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGxpbmtfa2V5LT5kZXZpY2VfaWQsICZpc3N1ZV9sbGlkX3NjYW5fb3AuaGRyKTsKKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIlJvZ3VlIFNjYW4gT3BlcmF0aW9uIEZhaWxlZCB3aXRoIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30vKm9tb25fcnVuX3JvZ3VlX2xsaWRfc2NhbiovCisKKy8qKgorICogXGJyaWVmIEV4ZWN1dGUgUlNTSSBtZWFzdXJlbWVudAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gQVBJIG1lc3NhZ2UgdG8gdGhlIE9MVCB0byBpc3N1ZSBhbiBSU1NJIGdyYW50LiAgSXQKKyAqIHRoZW4gcmVhZHMgYmFjayB0aGUgcmVzdWx0cyB2aWEgSTJDLiBTZXQgZ3JhbnRfbGVuZ3RoX3RxIHRvIDAgdG8gcmV0cmVpdmUgdGhlCisgKiBSU1NJIHZhbHVlIHdpdGhvdXQgaXNzdWluZyB0aGUgc3Ryb2JlIGNvbW1hbmQgdG8gdGhlIE9MVC4KKyAqCisgKiBccGFyYW0gbGlua19rZXkgRVBPTiBSU1NJIGxpbmsgaW5mb3JtYXRpb24KKyAqIFxwYXJhbSBncmFudF9sZW5ndGhfdHEgU2l6ZSBvZiB0aGUgUlNTSSBncmFudAorICogXHBhcmFtIHN0YXJ0X29mZnNldCBTdHJvYmUgb2Zmc2V0IGZyb20gc3RhcnQgb2YgdGhlIFJTU0kgZ3JhbnQKKyAqIFxwYXJhbSBlbmRfb2Zmc2V0IFN0cm9iZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIHRoZSBSU1NJIGdyYW50CisgKgorICogXHJldHVybgorICogTm9uZQorICovCitzdGF0aWMKK3ZvaWQgb21vbl9yc3NpX21lYXN1cmVtZW50X2luaXRpYXRlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21vbl9saW5rX2tleSAqbGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0cmlnZ2VyX3dpZHRoX3RxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHJpZ2dlcl9kZWxheV90cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNhbXBsZV9wZXJpb2QpCit7CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbmlfa2V5IG5pX2tleSA9IHsgLmVwb25fbmkgPSBsaW5rX2tleS0+ZXBvbl9uaSB9OworICAgIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQgaXNzdWVfcnNzaV9ncmFudF9vcDsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoISBvbW9uX2lzX2Vwb25fbmlfdmFsaWQobGlua19rZXktPmVwb25fbmkpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIltPTU9OXSBSeCBQb3dlcjogZXBvbl9uaSBvZiAoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgcGxhdGZvcm1cbiIsIGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB1aW50OF90IHRyeF9pZDsKKworICAgIGlmICggISB0cnhfaWRfZnJvbV9lcG9uX25pKGxpbmtfa2V5LT5lcG9uX25pLCAmdHJ4X2lkKSApCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiW09NT05dIFJ4IFBvd2VyOiBUUlggSWQgaXMgaW52YWxpZCBmb3IgRVBPTiBOSSAlZCBcbiIsIGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciB0cmFuc2V2aWVyIHByZXNlbmNlCisgICAgcmMgPSBiY21fYm9hcmRfdHJ4X3ByZXNlbnQodHJ4X2lkKTsKKworICAgIGlmIChyYyA9PSBCQ01fRVJSX05PREVWKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAiW09NT05dIFJ4IFBvd2VyOiBUUlggTm90IFByZXNlbnQgb24gUE9OICVkXHJcbiAiLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBQZXJmb3JtIGFuIEFQSSBvcGVyYXRpb24gZGlyZWN0aW5nIHRoZSBNYXBsZSBmaXJtd2FyZSB0byBpc3N1ZSBhbiBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yb2d1ZV9yeF9wb3dlcgorICAgICAgIFJTU0kgZ3JhbnQgdG8gdGhlIHNwZWNpZmllZCBFUE9OIGxpbmsuIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUk9HVUVfUlhfUE9XRVIqLworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmaXNzdWVfcnNzaV9ncmFudF9vcCwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCAsIG5pX2tleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX3Jzc2lfZ3JhbnRfb3AsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZF9saW5rLCBsaW5rX2tleS0+bWFjX2FkZHJlc3MpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZpc3N1ZV9yc3NpX2dyYW50X29wLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfd2lkdGgsIHRyaWdnZXJfd2lkdGhfdHEpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZpc3N1ZV9yc3NpX2dyYW50X29wLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfZGVsYXksIHRyaWdnZXJfZGVsYXlfdHEpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZpc3N1ZV9yc3NpX2dyYW50X29wLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9wZXJpb2QsIHNhbXBsZV9wZXJpb2QpOworCisgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobGlua19rZXktPmRldmljZV9pZCwgJmlzc3VlX3Jzc2lfZ3JhbnRfb3AuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJpc3N1ZSBSU1NJIGdyYW50IG9wZXJhdGlvbiBmYWlsZWQgd2l0aCByYyAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworCisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisvKm9tb25fcnNzaV9tZWFzdXJlbWVudF9pbml0aWF0ZSovCisKKy8vIHJzc2kgc3BlY2lmaWMgaW5kaWNhdGlvbiBoYW5kbGVyIGludGVyZmFjZSAtLQorc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfcnNzaV9oYW5kbGVfaW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYXV0byAqaW5kKQoreworCisgICAgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQqIG9tb25faW5kOworICAgIHVpbnQzMl90IHJzc2lfdmFsdWUgPSAwOworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGNoYXIgdEJ1Zls0MF07CisKKyAgICBvbW9uX2luZCA9IChiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCAqKSBpbmQ7CisgICAgZXBvbl9uaSA9IG9tb25faW5kLT5rZXkuZXBvbl9uaTsKKworICAgIGlmIChvbW9uX2luZC0+ZGF0YS5zdGF0dXMgPT0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyogUGVyZm9ybSB0aGUgSTJDIG9wZXJhdGlvbnMgc3BlY2lmaWVkIGluIFNGRi04NDcyIChTRlApL1NGRi04MDc3aSAoWEZQKSB0bworICAgICAgICAgICByZXRyaWV2ZSB0aGUgcG93ZXIgbWVhc3VyZW1lbnRzIGZyb20gdGhlIG9wdGljcyBtb2R1bGUuICovCisgICAgICAgIHJjID0gb21vbl9yc3NpX3JlYWQoZXBvbl9uaSwgJnJzc2lfdmFsdWUpOworCisgICAgfQorICAgIC8qIE5vdGlmeSBleHRlcm5hbCBob3N0IGNvZGUgb2YgdGhlIG91dGNvbWUgdGhyb3VnaCBhbiBvcHRpb25hbCBjYWxsYmFjaywKKyAgICAgICBkZWZhdWx0aW5nIHRvIG91dHB1dCBpbiB0aGUgQ0xJIHNlc3Npb24gd2hlcmUgdGhlIGNvbW1hbmQgd2FzIGluaXRpYXRlZAorICAgICAgIGlmIG5vIGNhbGxiYWNrIGlzIHN1cHBsaWVkLiAqLworCisgICAgQkNNX0xPR19DQUxMRVJfRk1UKElORk8sIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgIiBSU1NJIEluZGljYXRpb24gUmN2OiBmb3IgTGluayBNYWMgJXMsIExMSUQgMHgleCwgRGV2PSUwMWQsIFBvbl9uaT0lZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfMl9zdHIoJm9tb25faW5kLT5kYXRhLmxpbmtfbWFjLCB0QnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbW9uX2luZC0+ZGF0YS5sbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbW9uX2luZC0+a2V5LmVwb25fbmkpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICAiICVzIG1lYXN1cmVkIHJ4IHBvd2VyICVkLiVkdVcgcmF3X2RhdGEgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgKG9tb25faW5kLT5kYXRhLnN0YXR1cyA9PSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MgPyAiU3VjY2VlZGVkIiA6ICJGYWlsZWQiKSwKKyAgICAgICAgICAgICAgICAgICByc3NpX3ZhbHVlLzEwLCByc3NpX3ZhbHVlJTEwLCByc3NpX3ZhbHVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICJwb24gJWQsIGZhaWxlZCB3aXRoIGVycm5vICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICBlcG9uX25pLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvLyBlcG9uIHJvZ3VlIG9udSBzcGVjaWZpYyBpbmRpY2F0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIC0tCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9yb2d1ZV9oYW5kbGVfaW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hdXRvICppbmQpCit7CisgICAgKHZvaWQpaW5zdGFuY2U7CisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uKiByb2d1ZV9pbmQ7CisgICAgY2hhciB0QnVmWzQwXTsKKworICAgIHJvZ3VlX2luZCA9IChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24gKikgaW5kOworCisgICAgLyogTm90aWZ5IGV4dGVybmFsIGhvc3QgY29kZSBvZiB0aGUgb3V0Y29tZSB0aHJvdWdoIGFuIG9wdGlvbmFsIGNhbGxiYWNrLAorICAgICAgIGRlZmF1bHRpbmcgdG8gb3V0cHV0IGluIHRoZSBDTEkgc2Vzc2lvbiB3aGVyZSB0aGUgY29tbWFuZCB3YXMgaW5pdGlhdGVkCisgICAgICAgaWYgbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQuICovCisKKyAgICBCQ01fTE9HX0NBTExFUl9GTVQoSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAiUm9ndWUgT05VIFNjYW4gVmlvbGF0aW9uOiBBbG1TdGF0ZSA9ICVzLCBMaW5rIE1hYyAlcywgTExJRCAweCV4LCBSYW5nZT0lMGQsIFBvbl9uaT0lMmRcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKHJvZ3VlX2luZC0+ZGF0YS5hbGFybV9zdGF0dXMuYWxhcm1fc3RhdHVzID09IEJDTU9MVF9TVEFUVVNfT04gPyAiT04iIDogIk9GRiIpLAorICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfMl9zdHIoJnJvZ3VlX2luZC0+a2V5Lm1hY19hZGRyZXNzLCB0QnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByb2d1ZV9pbmQtPmRhdGEuYWxhcm1fc3RhdHVzLmRlbmllZF9sbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvZ3VlX2luZC0+ZGF0YS5hbGFybV9zdGF0dXMuZGVuaWVkX3JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvZ3VlX2luZC0+a2V5LmVwb25fbmkpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8vIGVwb24gcm9ndWUgc2NhbiBjb21wbGV0ZSBzcGVjaWZpYyBpbmRpY2F0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIC0tCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9yb2d1ZV9jb21wbGV0ZV9oYW5kbGVfaW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hdXRvICppbmQpCit7CisgICAgKHZvaWQpaW5zdGFuY2U7CisgICAgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSogcm9ndWVfaW5kOworCisgICAgcm9ndWVfaW5kID0gKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGUgKikgaW5kOworCisgICAgLyogTm90aWZ5IGV4dGVybmFsIGhvc3QgY29kZSBvZiB0aGUgb3V0Y29tZSB0aHJvdWdoIGFuIG9wdGlvbmFsIGNhbGxiYWNrLAorICAgICAgIGRlZmF1bHRpbmcgdG8gb3V0cHV0IGluIHRoZSBDTEkgc2Vzc2lvbiB3aGVyZSB0aGUgY29tbWFuZCB3YXMgaW5pdGlhdGVkCisgICAgICAgaWYgbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQuICovCisKKyAgICBCQ01fTE9HX0NBTExFUl9GTVQoSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAiUm9ndWUgT05VIHNjYW4gY29tcGxldGUgZm9yIFBvbiAlZCwgU3RhdHVzID0gJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcm9ndWVfaW5kLT5rZXkuZXBvbl9uaSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dldF9zY2FuX3Jlc3VsdChyb2d1ZV9pbmQtPmRhdGEucmV0dXJuX2luZF9zdGF0dXMpKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLy8gcHVibGljIGluZGljYXRpb24gaGFuZGxlciBpbnRlcmZhY2UgLS0gY2FsbGVkIGluIHRyYW5zcG9ydCBsYXllciBjb250ZXh0CitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX29tb25faGFuZGxlX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50OF90IGluc3RhbmNlLCBiY21vbHRfYXV0byAqaW5kKQoreworCisgICAgLy8gTm90IGFuIGVycm9yLCB3ZSBqdXN0IGRvbid0IGNhcmUgYWJvdXQgdGhpcyBpbmRpY2F0aW9uLgorICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8vIFdlIGxvb2sgYXQgbWVzc2FnZSB0YXJnZXR0aW5nIGVwb24gbmkuCisgICAgaWYgKGluZC0+aGRyLm9ial90eXBlID09IEJDTU9MVF9PQkpfSURfRVBPTl9OSSkKKyAgICB7CisgICAgICAgIC8vIFdlIGxvb2sgYXQgUlNTSSBDb21wbGV0aW9uIGV2ZW50IGluZGljYXRpb25zLgorICAgICAgICBpZiAoaW5kLT5oZHIuc3ViZ3JvdXAgPT0gKHVpbnQxNl90KUJDTU9MVF9FUE9OX05JX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X3VzZXJfYXBwbF9yc3NpX2hhbmRsZV9pbmQoZGV2aWNlX2lkLGluc3RhbmNlLGluZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBsb29rIGZvciBSb2d1ZSBTY2FuIENvbXBsZXRlIGV2ZW50IGluZGljYXRpb25zLgorICAgICAgICAgICAgaWYgKGluZC0+aGRyLnN1Ymdyb3VwID09ICh1aW50MTZfdClCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JPR1VFX1NDQU5fQ09NUExFVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfdXNlcl9hcHBsX3JvZ3VlX2NvbXBsZXRlX2hhbmRsZV9pbmQoZGV2aWNlX2lkLCBpbnN0YW5jZSwgaW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LICkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPR19DQUxMRVJfRk1UKElORk8sIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICAgICAiT01PTiBIYW5kbGUgSW5kaWNhdGlvbiBFcnJvcjogUG9uICVkLCBUeXBlICVkLCBSYyAlZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBpbmQtPmhkci5zdWJncm91cCwgcmMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90IGFuIGVycm9yLCB3ZSBqdXN0IGRvbid0IGNhcmUgYWJvdXQgdGhpcyBpbmRpY2F0aW9uLgorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvLyBXZSBsb29rIGF0IG1lc3NhZ2UgdGFyZ2V0dGluZyBlcG9uIGRlbmllZCBsaW5rcy4KKyAgICBpZiAoaW5kLT5oZHIub2JqX3R5cGUgPT0gQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LKQorICAgIHsKKyAgICAgICAgLy8gV2UgbG9vayBhdCBEZW5pZWQgTGluayBFdmVudHMgb2YgdGhpcyB0eXBlLgorICAgICAgICBpZiAoaW5kLT5oZHIuc3ViZ3JvdXAgPT0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9ST0dVRV9WSU9MQVRJT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X3VzZXJfYXBwbF9yb2d1ZV9oYW5kbGVfaW5kKGRldmljZV9pZCwgaW5zdGFuY2UsIGluZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3QgYW4gZXJyb3IsIHdlIGp1c3QgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIG9iamVjdC4KKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKKworfSAvKiBiY21vbHRfdXNlcl9hcHBsX29tb25faGFuZGxlX2luZCAqLworCisvKioKKyAqIFxicmllZiBPcHRpY2FsIG1vbml0b3JpbmcgdGFzayBtZXNzYWdlIGhhbmRsZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBvcHRpY2FsIG1vbml0b3JpbmcgdGFzayBoYW5kbGVyLiAgQXQgdGhpcyB0aW1lIHRoZSBvbmx5CisgKiBtZXNzYWdlIGlzIEJDTU9TX01TR19JRF9JTklUSUFURV9SU1NJX1NBTVBMRSB3aGljaCBzdGFydHMgdGhlIFJTU0kKKyAqIG1lYXN1cmVtZW50IG9uIHRoZSBPTFQuCisgKgorICogXHBhcmFtIG1vZHVsZV9pZCBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04KKyAqIFxwYXJhbSBvc19tc2cgTWVzc2FnZSBjb250ZW50cworICovCitzdGF0aWMKK3ZvaWQgb21vbl9vc19tc2dfaGFuZGxlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKQoreworICAgIG9tb25fdGFza19tc2cgKm1zZyA9IChvbW9uX3Rhc2tfbXNnICopb3NfbXNnOworCisgICAgc3dpdGNoIChtc2ctPm9zX21zZy50eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9TX01TR19JRF9JTklUSUFURV9SWF9QT1dFUjoKKyAgICAgICAgICAgIG9tb25fcnNzaV9tZWFzdXJlbWVudF9pbml0aWF0ZShtc2ctPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5saW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+dHJpZ2dlcl93aWR0aF9ucyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnRyaWdnZXJfZGVsYXlfbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnNhbXBsZV9wZXJpb2RfdXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9TX01TR19JRF9JTklUSUFURV9UUlhfU1RBVFVTOgorCisgICAgICAgICAgICBvbW9uX3RyeF9zdGF0dXNfaW5pdGlhdGUobXNnLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPmxpbmtfa2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9TX01TR19JRF9JTklUSUFURV9ST0dVRV9TQ0FOOgorICAgICAgICAgICAgb21vbl9ydW5fcm9ndWVfbGxpZF9zY2FuKG1zZy0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5saW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPmxsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5zY2FuX21vZGUpOworCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JTU0lfUkVBRDoKKyAgICAgICAgICAgIG9tb25fcnNzaV9yZWFkX2luaXRpYXRlKG1zZy0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5saW5rX2tleSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgYmNtb3NfZnJlZShvc19tc2cpOworfSAvKiBvbW9uX29zX21zZ19oYW5kbGUgKi8KKworCisvKioKKyAqIFxicmllZiBTdGFydCB0aGUgb3B0aWNhbCBtb25pdG9yaW5nIHRhc2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgdXNlciBsZXZlbCBvcHRpY2FsIG1vbml0b3JpbmcgdGFzayBhbmQgY3JlYXRlcyB0aGUKKyAqIG9wdGljYWwgbW9uaXRvcmluZyBtb2R1bGUuICBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBhdCBzdGFydCB1cC4KKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb21vbl9hcHBsX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAidXNlcl9hcHBsX29tb24iLAorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTU9OLAorICAgICAgICAuY29yZSA9IEJDTU9TX0NQVV9DT1JFX0FOWSwgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgICAgIC5pbml0X2hhbmRsZXIgPSBOVUxMCisgICAgfTsKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gInVzZXJfYXBwbF9vbW9uIiwKKyAgICAgICAgICAgIC5zaXplID0gT01PTl9UQVNLX01TR19RX1NJWkUKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpZiAoaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvbW9uX2xvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJ1c2VyX2FwcGxfb21vbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWX0xPR19MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBCVUdfT04oREVWX0xPR19JTlZBTElEX0lEID09IG9tb25fbG9nX2lkKTsKKworICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJm9tb25fdGFzaywgJnRhc2tfcGFyYW1zKTsKKyAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICByYyA9IGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9PTU9OLCAmb21vbl90YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kdWxlX3BhcmFtcyk7CisgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7Cit9IC8qIGJjbW9sdF9lcG9uX29tb25fYXBwbF9pbml0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENMSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioKKyAqIFxicmllZiBSWCBwb3dlciBzYW1wbGUgQ0xJIGNvbW1hbmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlICJzYW1wbGUiIENMSSBjb21tYW5kLiAgSXQgcHJvY2Vzc2VzIHRoZSBDTEkKKyAqIHBhcmFtZXRlcnMgYW5kIGRpc3BhdGNoZXMgYSBzdGFydCBzYW1wbGUgbWVzc2FnZSB0byB0aGUgb3B0aWNhbCBtb25pdG9yaW5nCisgKiB0YXNrLgorICoKKyAqIFxwYXJhbSBzZXNzaW9uIENMSSBzZXNzaW9uIElECisgKiBccGFyYW0gcGFybSBDb21tYW5kIHBhcmFtZXRlcnMKKyAqIFxwYXJhbSBuX3Bhcm1zIE51bWJlciBvZiBwYXJhbWV0ZXJzCisgKgorICogXHJldHVybgorICogQkNNX0VSUl9PSyBpZiBzdWNjZXNzZnVsLCBlcnJvciBjb2RlIGlmIG5vdAorICovCitzdGF0aWMKK2JjbW9zX2Vycm5vIG9tb25fY21kX3J4X3Bvd2VyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9jbWRfcGFybSAqZXBvbl9uaTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKm1hY19hZGRyOworICAgIGJjbWNsaV9jbWRfcGFybSAqVHdpZHRoX25zOworICAgIGJjbWNsaV9jbWRfcGFybSAqVGRlbGF5X25zOworICAgIGJjbWNsaV9jbWRfcGFybSAqVHNhbXBsZV91czsKKyAgICBvbW9uX3Rhc2tfbXNnICptc2c7CisKKyAgICAvKiBHZXQgdGhlIENMSSBwYXJhbWV0ZXJzLiAqLworICAgIGVwb25fbmkgICAgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgbWFjX2FkZHIgICA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdyYW50ZWRfbGluayIpOworICAgIFR3aWR0aF9ucyAgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmlnZ2VyX3dpZHRoIik7ICAvLyBSU1NJIFR3aWR0aCBpbiBucworICAgIFRkZWxheV9ucyAgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmlnZ2VyX2RlbGF5Iik7ICAvLyBSU1NJIFRkZWxheSBpbiBucworICAgIFRzYW1wbGVfdXMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzYW1wbGVfcGVyaW9kIik7ICAvLyBSU1NJIFRzYW1wbGUgaW4gdXMKKworICAgIGxpbmtfa2V5LmRldmljZV9pZCA9IGN1cnJlbnRfZGV2aWNlOworICAgIGxpbmtfa2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpZXBvbl9uaS0+dmFsdWUubnVtYmVyOworICAgIGxpbmtfa2V5Lm1hY19hZGRyZXNzID0gKGJjbW9zX21hY19hZGRyZXNzKW1hY19hZGRyLT52YWx1ZS5tYWM7CisKKyAgICAvKiBTZW5kIGFuIGluZGljYXRpb24gdG8gdGhlIGludGVybmFsIHRhc2sncyBtZXNzYWdlIHF1ZXVlIHRvIGJlCisgICAgICAgcHJvY2Vzc2VkLiAqLworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgbXNnLT5vc19tc2cudHlwZSA9IEJDTU9TX01TR19JRF9JTklUSUFURV9SWF9QT1dFUjsKKyAgICBtc2ctPm9zX21zZy5oYW5kbGVyID0gb21vbl9vc19tc2dfaGFuZGxlOworICAgIG1zZy0+bGlua19rZXkgPSBsaW5rX2tleTsKKyAgICBtc2ctPnRyaWdnZXJfd2lkdGhfbnMgPSBUd2lkdGhfbnMtPnZhbHVlLm51bWJlcjsKKyAgICBtc2ctPnRyaWdnZXJfZGVsYXlfbnMgPSBUZGVsYXlfbnMtPnZhbHVlLm51bWJlcjsKKyAgICBtc2ctPnNhbXBsZV9wZXJpb2RfdXMgPSBUc2FtcGxlX3VzLT52YWx1ZS5udW1iZXI7CisgICAgbXNnLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZy0+b3NfbXNnLCAwKTsKKyAgICBCVUdfT04ocmMpOworCisKKyAgICByZXR1cm4gcmM7Cit9IC8qIG9tb25fY21kX3NhbXBsZSAqLworCitzdGF0aWMKK2JjbW9zX2Vycm5vIG9tb25fY21kX3RyeF9kYXRhKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgb21vbl9saW5rX2tleSBsaW5rX2tleTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmVwb25fbmk7CisgICAgb21vbl90YXNrX21zZyAqbXNnOworCisgICAgLyogR2V0IHRoZSBDTEkgcGFyYW1ldGVycy4gKi8KKyAgICBlcG9uX25pID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworCisgICAgbGlua19rZXkuZGV2aWNlX2lkID0gY3VycmVudF9kZXZpY2U7CisgICAgbGlua19rZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSllcG9uX25pLT52YWx1ZS5udW1iZXI7CisKKyAgICAvKiBTZW5kIGFuIGluZGljYXRpb24gdG8gdGhlIGludGVybmFsIHRhc2sncyBtZXNzYWdlIHF1ZXVlIHRvIGJlCisgICAgICAgcHJvY2Vzc2VkLiAqLworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgbXNnLT5vc19tc2cudHlwZSA9IEJDTU9TX01TR19JRF9JTklUSUFURV9UUlhfU1RBVFVTOworICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBvbW9uX29zX21zZ19oYW5kbGU7CisgICAgbXNnLT5saW5rX2tleSA9IGxpbmtfa2V5OworICAgIG1zZy0+c2Vzc2lvbiA9IHNlc3Npb247CisgICAgcmMgPSBiY21vc19tc2dfc2VuZF90b19tb2R1bGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9PTU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPm9zX21zZywgMCk7CisgICAgQlVHX09OKHJjKTsKKworCisgICAgcmV0dXJuIHJjOworfQorLyogb21vbl9jbWRfdHJ4X2RhdGEgKi8KKworc3RhdGljCitiY21vc19lcnJubyBvbW9uX2NtZF9yZWFkX3Jzc2lfcmVzdWx0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgb21vbl9saW5rX2tleSBsaW5rX2tleTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmVwb25fbmk7CisgICAgb21vbl90YXNrX21zZyAqbXNnOworCisgICAgLyogR2V0IHRoZSBDTEkgcGFyYW1ldGVycy4gKi8KKyAgICBlcG9uX25pID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworCisgICAgbGlua19rZXkuZGV2aWNlX2lkID0gY3VycmVudF9kZXZpY2U7CisgICAgbGlua19rZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSllcG9uX25pLT52YWx1ZS5udW1iZXI7CisKKyAgICAvKiBTZW5kIGFuIGluZGljYXRpb24gdG8gdGhlIGludGVybmFsIHRhc2sncyBtZXNzYWdlIHF1ZXVlIHRvIGJlCisgICAgICAgcHJvY2Vzc2VkLiAqLworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgbXNnLT5vc19tc2cudHlwZSA9IEJDTU9TX01TR19JRF9JTklUSUFURV9SU1NJX1JFQUQ7CisgICAgbXNnLT5vc19tc2cuaGFuZGxlciA9IG9tb25fb3NfbXNnX2hhbmRsZTsKKyAgICBtc2ctPmxpbmtfa2V5ID0gbGlua19rZXk7CisgICAgbXNnLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZy0+b3NfbXNnLCAwKTsKKyAgICBCVUdfT04ocmMpOworCisKKyAgICByZXR1cm4gcmM7Cit9CisvKiBvbW9uX2NtZF9yZWFkX3Jzc2lfcmVzdWx0ICovCisKK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9jbWRfbGxpZF9zY2FuKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgb21vbl9saW5rX2tleSBsaW5rX2tleTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmVwb25fbmk7CisgICAgYmNtY2xpX2NtZF9wYXJtICplcG9uX2xsaWQ7CisgICAgYmNtY2xpX2NtZF9wYXJtICplcG9uX21vZGU7CisgICAgb21vbl90YXNrX21zZyAqbXNnOworCisgICAgLyogR2V0IHRoZSBDTEkgcGFyYW1ldGVycy4gKi8KKyAgICBlcG9uX25pID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGVwb25fbW9kZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNjYW5fbW9kZSIpOworICAgIGVwb25fbGxpZCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbGxpZCIpOworCisgICAgbGlua19rZXkuZGV2aWNlX2lkID0gY3VycmVudF9kZXZpY2U7CisgICAgbGlua19rZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSllcG9uX25pLT52YWx1ZS5udW1iZXI7CisKKyAgICAvKiBTZW5kIGFuIGluZGljYXRpb24gdG8gdGhlIGludGVybmFsIHRhc2sncyBtZXNzYWdlIHF1ZXVlIHRvIGJlCisgICAgICAgcHJvY2Vzc2VkLiAqLworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgbXNnLT5vc19tc2cudHlwZSA9IEJDTU9TX01TR19JRF9JTklUSUFURV9ST0dVRV9TQ0FOOworICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBvbW9uX29zX21zZ19oYW5kbGU7CisgICAgbXNnLT5saW5rX2tleSA9IGxpbmtfa2V5OworICAgIG1zZy0+c2Vzc2lvbiA9IHNlc3Npb247CisgICAgbXNnLT5sbGlkID0gZXBvbl9sbGlkLT52YWx1ZS5udW1iZXI7CisgICAgbXNnLT5zY2FuX21vZGUgPSBlcG9uX21vZGUtPnZhbHVlLm51bWJlcjsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZy0+b3NfbXNnLCAwKTsKKyAgICBCVUdfT04ocmMpOworCisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBcYnJpZWYgSW5zdGFsbCBDTEkgY29tbWFuZHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIG9wdGljYWwgbW9uaXRvcmluZyBjb21tYW5kIGRpcmVjdG95ICJvbW9uIiBhbmQKKyAqIGluc3RhbGxzIG9wdGljYWwgbW9uaXRvcmluZyBDTEkgY29tbWFuZHMgdG8gdGhpcyBkaXJlY3RvcnkuCisgKgorICogXHBhcmFtIHRvcF9kaXIgUGFyZW50IG9mICJvbW9uIiBkaXJlY3RvcnkKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29tb25fY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpkaXJfbmFtZSA9ICJvbW9uIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVQT04gb3B0aWNhbCBtb25pdG9yaW5nIGNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJVR19PTihkaXIgPT0gTlVMTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAicnhfcG93ZXIiLCAiSXNzdWUgUlggUG93ZXIgTWVhc3VyZW1lbnQiLCBvbW9uX2NtZF9yeF9wb3dlciwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJncmFudGVkX2xpbmsiLCAiTGluayBtYWMgYWRkcmVzcywgMDAwMDAwMDAwMDAwIGZvciBJZGxlIFBvd2VyIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInRyaWdnZXJfd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlNTSSBUcmlnZ2VyIFdpZHRoIChUdykgaW4gbnMsIERlc2lyZWQgd2lkdGggb2YgUlNTSSBUcmlnZ2VyIGJhc2VkIG9uIHRoZSBPcHRpY2FsIE1vZHVsZSBTcGVjaWZpY2F0aW9ucy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciB1c2VkIGZvciBhbGwgUlggUG93ZXIgbWVhc3VyZW1lbnRzICggaW5jbHVkaW5nIElkbGUgcG93ZXIpIGFuZCBtdXN0IG5vdCBiZSAwLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoZSBncmFudWxhcml0eSBvZiB0aGUgZGV2aWNlIGlzIDEgVFEgKDE2bnMpIHRoZSBpbnB1dCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgVFEuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0cmlnZ2VyX2RlbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJTU0kgVHJpZ2dlciBEZWxheSAoVGQpIGluIG5zLCBEZXNpcmVkIGRlbGF5IHRvIG1lZXQgdGhlIHRyaWdnZXIgZGVsYXkgdGltaW5nIHJlcXVpcmVtZW50IG9mIHRoZSBPcHRpY2FsIE1vZHVsZSBTcGVjaWZpY2F0aW9ucy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcnNzaSB0cmlnZ2VyIGRlbGF5IGlzIG1lYXN1cmVkIGZyb20gdGhlIHN0YXJ0IG9mIHN5bmNfdGltZSBhbmQgaXMgYWRqdXN0ZWQgYXMgbmVlZGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgdHJpZ2dlciBkZWxheSBtb3ZlcyB0aGUgYXNzZXJ0aW9uIG9mIHRoZSBSU1NJIFRyaWdnZXIgc3Ryb2JlIGludG8gdGhlIGdyYW50IHdpbmRvdy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RlOiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIGRldmljZSBpcyAxIFRRICgxNm5zKSB0aGUgaW5wdXQgd2lsbCBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IFRRLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic2FtcGxlX3BlcmlvZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoVGkyYykgU2FtcGxlIHBlcmlvZCBpbiB1UywgaW50ZXJuYWwgSTJDIGhvbGQvcHJvaGliaXQgdGltZSB3aGVyZSBhY2Nlc3MgdG8gZGV2aWNlIGlzIG5vdCBhbGxvd2VkLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cmluZyB0aGlzIHBlcmlvZCB0aGUgaW50ZXJuYWwgUlNTSSBkYXRhIGlzIGludmFsaWQgYW5kIEkyQyBvcGVydGlvbnMgb24gdGhpcyBkZXZpY2UgbXVzdCBub3QgYmUgZXhlY3V0ZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSB2YWx1ZSBvZiA1MDB1UyBpcyByZWNvbW1lbmRlZCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJ0cnhfZGF0YSIsICJSZWFkIFRyYW5jZWl2ZXIgRGF0YSIsIG9tb25fY21kX3RyeF9kYXRhLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAicmVhZF9yc3NpIiwgIlJlYWQgUlNTSSBSZXN1bHQgZnJvbSBUcmFuY2VpdmVyIiwgb21vbl9jbWRfcmVhZF9yc3NpX3Jlc3VsdCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImxsaWRfc2NhbiIsICJSdW4gUm9ndWUgT05VIExMSUQgU2NhbiIsIG9tb25fY21kX2xsaWRfc2NhbiwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzY2FuX21vZGUiLCAiTExJRCBzY2FuIG1vZGUgMSBmb3IgZnVsbCBwb24gc2NhbiwgMCBmb3IgdGFyZ2V0ZWQgKGxsaWQgcmVxdWlyZWQgZm9yIHRhcmdldGVkKSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX2xsaWQiLCAiRVBPTiBsbGlkIHRvIHNjYW4gd2hlbiBtb2RlPTAiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKK30KKy8qIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vbW9uX2NsaV9pbml0ICovCisKKworLyogRW5kIG9mIGZpbGUgb21vbi5jICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9vbW9uLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24vb21vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzFiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24vb21vbi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfT01PTl9IXworI2RlZmluZSBfT01PTl9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF91dGlscy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisKKworCisvKioKKyAqIFxicmllZiBTdGFydCB0aGUgb3B0aWNhbCBtb25pdG9yaW5nIHRhc2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgdXNlciBsZXZlbCBvcHRpY2FsIG1vbml0b3JpbmcgdGFzayBhbmQgY3JlYXRlcyB0aGUKKyAqIG9wdGljYWwgbW9uaXRvcmluZyBtb2R1bGUuICBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBhdCBzdGFydCB1cC4KKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK2V4dGVybgordm9pZCBiY21vbHRfZXBvbl9vbW9uX2FwcGxfaW5pdCAodm9pZCk7CisKKworLyoqCisgKiBcYnJpZWYgSW5zdGFsbCBDTEkgY29tbWFuZHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIG9wdGljYWwgbW9uaXRvcmluZyBjb21tYW5kIGRpcmVjdG95ICJvbW9uIiBhbmQKKyAqIGluc3RhbGxzIG9wdGljYWwgbW9uaXRvcmluZyBDTEkgY29tbWFuZHMgdG8gdGhpcyBkaXJlY3RvcnkuCisgKgorICogXHBhcmFtIHRvcF9kaXIgUGFyZW50IG9mICJvbW9uIiBkaXJlY3RvcnkKKyAqLworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vbW9uX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9vbW9uX2hhbmRsZV9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDhfdCBpbnN0YW5jZSwgYmNtb2x0X2F1dG8gKmluZCk7CisKKworI2VuZGlmIC8qIEVuZCBvZiBmaWxlIG9tb24uaCAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcGxheWJhY2svTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3NDAyOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcGxheWJhY2svTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAoraWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX3BsYXliYWNrCisgICAgTU9EX1RZUEUgPSBsaWIKKyAgICBNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cgY29tbW9uX2FwaSB0cmFuc3BvcnQKKyAgICBzcmNzID0gYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5jCisgICAgaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorICAgIGVuZGlmCisKKyAgICBVU0VfTElOVD15ZXMKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcGxheWJhY2svYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiNDYzYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcGxheWJhY2svYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5jCkBAIC0wLDAgKzEsMTU3MyBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisjaW5jbHVkZSAiYmNtX2FwaV9jbGlfaGVscGVycy5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbXRyX2RlYnVnLmgiCisjaW5jbHVkZSAiYmNtdHJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5oIgorI2luY2x1ZGUgImJjbW9sdF9iaXRfdXRpbHMuaCIKKworLyogJ01QQngnIGluIEFTQ0lJIChNKWFwbGUgKFApbGF5KGIpYWNrIHZlcnNpb24geCAqLworI2RlZmluZSBWRVJTSU9OMCAgICAweDRkNTA0MjMwCisjZGVmaW5lIFZFUlNJT04xICAgIDB4NGQ1MDQyMzEKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IENIVU5LX1NJWkUgPSAyMDAwOworCitzdGF0aWMgY29uc3QgY2hhciAqY2FwX2xvY19zdHJbQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX19OVU1fT0ZdID0KK3sKKyAgICAiZGV2aWNlIiwKKyAgICAiaG9zdCIKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7Cit9IHBsYXliYWNrX2NvbnRleHQ7CisKK3N0YXRpYyBwbGF5YmFja19jb250ZXh0IHBiX2N0eHRbQkNNVFJfTUFYX09MVFNdOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBQQl9GT1JNQVRfQVBJX0NMSSwKKyAgICBQQl9GT1JNQVRfQ19BUEksCisKKyAgICBQQl9GT1JNQVRfX0NPVU5UCit9IHBiX2Zvcm1hdDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUEJfQ0xJX0VYVFJBX05PTkUsCisgICAgUEJfQ0xJX0VYVFJBX01VTFRJLAorICAgIFBCX0NMSV9FWFRSQV9TVEFULAorICAgIFBCX0NMSV9FWFRSQV9TVUJHUk9VUAorfSBwYl9jbGlfZXh0cmE7CisKK3R5cGVkZWYgZW51bQoreworICAgIFBCX0ZJRUxEU19OT05FLAorICAgIFBCX0ZJRUxEU19HRVQsCisgICAgUEJfRklFTERTX01VTFRJLAorICAgIFBCX0ZJRUxEU19TRVQKK30gcGJfZmllbGRzOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2F0aW9uOworICAgIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIGZ3X3ZlcjsKKyAgICBiY21vbHRfaG9zdF9zd192ZXJzaW9uIGhvc3RfdmVyOworICAgIHVpbnQzMl90IGJ1Zl9zaXplOworICAgIHZvaWQgKmNhcHR1cmVfYnVmZmVyOworfSBiY21vbHRfcGxheWJhY2s7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgYmNtdHJfY2FwdHVyZV9lbnRyeSBoZHI7CisgICAgdWludDhfdCAqbXNnX3N0YXJ0OworfSBwbGF5YmFja19pdGVyYXRvcl9yYXc7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgcGxheWJhY2tfaXRlcmF0b3JfcmF3IHJhdzsKKyAgICBiY21vbHRfYnVmIG1zZ19idWY7CisgICAgYmNtb2x0X21zZyAqbXNnOworICAgIGJjbW9zX2Vycm5vIGVycjsKK30gcGxheWJhY2tfaXRlcmF0b3I7CisKKyNkZWZpbmUgRk9SX0VBQ0hfQ0FQVFVSRV9FTlRSWShpdCwgYnVmZmVyLCBzaXplKSBcCisgICAgYmNtb2x0X2J1Zl9pbml0KCYoaXQpLmJ1Ziwgc2l6ZSwgYnVmZmVyLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7IFwKKyAgICB3aGlsZSAoYmNtdHJfY2FwdHVyZV9lbnRyeV9nZXRfbmV4dCgmKGl0KS5idWYsICYoaXQpLmhkciwgJihpdCkubXNnX3N0YXJ0KSkKKworI2RlZmluZSBGT1JfRUFDSF9QTEFZQkFDS19NU0coaXQsIGJ1ZmZlciwgc2l6ZSkgXAorICAgIGJjbW9sdF9idWZfaW5pdCgmKGl0KS5yYXcuYnVmLCBzaXplLCBidWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsgXAorICAgIChpdCkubXNnID0gTlVMTDsgXAorICAgIHdoaWxlIChwbGF5YmFja19uZXh0X2VudHJ5X3VucGFja2VkKCYoaXQpKSkKKworI2RlZmluZSBERVZJQ0VfUkVGICJkZXZpY2VfaWQiCisjZGVmaW5lIFJDX1JFRiAicmMiCisjZGVmaW5lIFZBTF9SRUYgInZhbCIKKyNkZWZpbmUgTVNHX1JFRiAibXNnIgorI2RlZmluZSBLRVlfUkVGICJrZXkiCisjZGVmaW5lIExJU1RfTUVNX1JFRiAibGlzdF9tZW0iCisjZGVmaW5lIE1TR19TRVRfUkVGICJtc2dfc2V0IgorI2RlZmluZSBNQVhfTVNHU19SRUYgIm1heF9tc2dzIgorI2RlZmluZSBJTlZFUlRfRklMVEVSX1JFRiAiaW52ZXJ0X2ZpbHRlciIKKyNkZWZpbmUgU1RBVF9GTEFHU19SRUYgInN0YXRfZmxhZ3MiCisjZGVmaW5lIERZTl9MSVNUX1NJWkUgIkFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUiCisKK3N0YXRpYyB2b2lkIHBsYXliYWNrX2l0ZXJhdG9yX2NsZWFudXAocGxheWJhY2tfaXRlcmF0b3IgKml0KQoreworICAgIGlmICgoaXQtPmVyciA9PSBCQ01fRVJSX09LKSAmJiAoaXQtPm1zZyAhPSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShpdC0+bXNnKTsKKyAgICAgICAgaXQtPm1zZyA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja19uZXh0X2VudHJ5X3VucGFja2VkKHBsYXliYWNrX2l0ZXJhdG9yICppdCkKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvcl9jbGVhbnVwKGl0KTsKKyAgICBiY21vc19ib29sIHJldCA9IGJjbXRyX2NhcHR1cmVfZW50cnlfZ2V0X25leHQoJml0LT5yYXcuYnVmLCAmaXQtPnJhdy5oZHIsICZpdC0+cmF3Lm1zZ19zdGFydCk7CisgICAgaWYgKHJldCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmaXQtPm1zZ19idWYsIGl0LT5yYXcuaGRyLm1zZ19zaXplLCBpdC0+cmF3Lm1zZ19zdGFydCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgICAgICBpdC0+ZXJyID0gYmNtb2x0X21zZ191bnBhY2soJml0LT5tc2dfYnVmLCAmaXQtPm1zZyk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19yZWFkX2Jsb2NrKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwgdWludDhfdCAqYnVmKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2ZnIGRlYnVnX2NmZzsKKyAgICBiY21vbHRfZGVidWdfa2V5IGRlYnVnX2tleSA9IHsgfTsKKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciByZWFkZXIgPSB7IC5vZmZzZXQgPSBvZmZzZXQsIC5zaXplID0gc2l6ZSB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZkZWJ1Z19jZmcsIGRlYnVnLCBkZWJ1Z19rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmRlYnVnX2NmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLCByZWFkZXIpOworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGN1cnJlbnRfZGV2aWNlLCAmZGVidWdfY2ZnLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiRmFpbGVkIHRvIHVwZGF0ZSByZWFkZXIgKCV1LCAldSkhXG4iLCBvZmZzZXQsIHNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRlYnVnX2NmZywgZGVidWcsIGRlYnVnX2tleSk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmRlYnVnX2NmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcik7CisgICAgICAgIGRlYnVnX2NmZy5kYXRhLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwgPSBidWY7CisgICAgICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmZGVidWdfY2ZnLmhkcik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiRmFpbGVkIHRvIHJldHJpZXZlIGNhcHR1cmUgYnVmZmVyIGNodW5rICgldSwgJXUpIVxuIiwKKyAgICAgICAgICAgICAgICBvZmZzZXQsIHNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX3JlYWQodm9pZCAqKmJ1ZmZlciwgdWludDMyX3QgKmxlbmd0aCwgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uICpjYXB0dXJlX2xvY2F0aW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2ZnIGRlYnVnX2NmZzsKKyAgICBiY21vbHRfZGVidWdfa2V5IGRlYnVnX2tleSA9IHsgfTsKKworICAgIGlmICgoYnVmZmVyID09IE5VTEwpIHx8IChsZW5ndGggPT0gTlVMTCkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJidWZmZXIgKCVwKSBhbmQgbGVuZ3RoICglcCkgY2Fubm90IGJlIE5VTExcbiIsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRlYnVnX2NmZywgZGVidWcsIGRlYnVnX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGVidWdfY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmRlYnVnX2NmZywgZGVidWcsIGFwaV9jYXB0dXJlX2NmZyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoY3VycmVudF9kZXZpY2UsICZkZWJ1Z19jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJGYWlsZWQgdG8gcmV0cmlldmUgY2FwdHVyZSBzdGF0cyFcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2b2lkICpjYXB0dXJlX2J1ZmZlcjsKKyAgICAgICAgdWludDMyX3QgYnVmX3NpemUgPSBkZWJ1Z19jZmcuZGF0YS5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlczsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKworICAgICAgICAqY2FwdHVyZV9sb2NhdGlvbiA9IGRlYnVnX2NmZy5kYXRhLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbjsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJSZXRyaWV2aW5nICV1IGJ5dGUgYnVmZmVyXG4iLCBidWZfc2l6ZSk7CisgICAgICAgIGNhcHR1cmVfYnVmZmVyID0gYmNtb3NfYWxsb2MoYnVmX3NpemUpOworICAgICAgICBpZiAoTlVMTCAhPSBjYXB0dXJlX2J1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKChvZmZzZXQgKyBDSFVOS19TSVpFKSA8IGJ1Zl9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlJlYWRpbmcgYnl0ZXMgJXUgLSAldVxuIiwgb2Zmc2V0LCBvZmZzZXQgKyBDSFVOS19TSVpFKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19yZWFkX2Jsb2NrKG9mZnNldCwgQ0hVTktfU0laRSwgKHVpbnQ4X3QqKWNhcHR1cmVfYnVmZmVyICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IENIVU5LX1NJWkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LID09IGVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJSZWFkaW5nIGJ5dGVzICV1IC0gJXVcbiIsIG9mZnNldCwgYnVmX3NpemUpOworICAgICAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX3JlYWRfYmxvY2sob2Zmc2V0LCBidWZfc2l6ZSAtIG9mZnNldCwgKHVpbnQ4X3QqKWNhcHR1cmVfYnVmZmVyICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICpidWZmZXIgPSBjYXB0dXJlX2J1ZmZlcjsKKyAgICAgICAgKmxlbmd0aCA9IGJ1Zl9zaXplOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19kdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCB2b2lkICpjYXB0dXJlX2J1ZiwgdWludDMyX3QgYnVmX3NpemUpCit7CisgICAgcGxheWJhY2tfaXRlcmF0b3IgaXQ7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIEZPUl9FQUNIX1BMQVlCQUNLX01TRyhpdCwgY2FwdHVyZV9idWYsIGJ1Zl9zaXplKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiRHVtcGluZyBtZXNzYWdlIGF0ICV1IG9mICV1ICgldSlcbiIsCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmaXQucmF3LmJ1ZiksIGJ1Zl9zaXplLCBpdC5yYXcuaGRyLm1zZ19zaXplKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlxuJTA4eCAldTpcbiIsIGl0LnJhdy5oZHIudGltZXN0YW1wLCBpdC5yYXcuaGRyLmV2ZW50KTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gaXQuZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgaXQubXNnKTsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIkR1bXAgc3RhdHVzOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJVbnBhY2tpbmcgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICBpZiAoKGl0LnJhdy5tc2dfc3RhcnQgKyBpdC5yYXcuaGRyLm1zZ19zaXplKSA+IChpdC5yYXcuYnVmLnN0YXJ0ICsgaXQucmF3LmJ1Zi5sZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJNZXNzYWdlIGxlbmd0aCBpcyBpbnNhbmUhXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9oZXhkdW1wKHNlc3Npb24sIGl0LnJhdy5tc2dfc3RhcnQsIDAsIGl0LnJhdy5oZHIubXNnX3NpemUsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgcGxheWJhY2tfc2hvdWxkX3NlbmQoYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGNhcHR1cmVfbG9jYXRpb24sIGJjbXRyX2NsZF9ldmVudF90eXBlIGV2ZW50X3R5cGUpCit7CisgICAgc3dpdGNoIChjYXB0dXJlX2xvY2F0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fREVWSUNFOgorICAgICAgICAgICAgc3dpdGNoIChldmVudF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNVFJfQ0xEX0VWX1JFQ1Y6CisgICAgICAgICAgICAgICAgY2FzZSBCQ01UUl9DTERfRVZfUkVDVl9ESVNDQVJEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0hPU1Q6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01UUl9DTERfRVZfU0VORDoKKyAgICAgICAgICAgICAgICBjYXNlIEJDTVRSX0NMRF9FVl9SRVNFTkQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qbGludCAtZXs0Mjl9ICovCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfcmVwbGF5KAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgdm9pZCAqY2FwdHVyZV9idWYsCisgICAgdWludDMyX3QgYnVmX3NpemUsCisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2F0aW9uLAorICAgIGJjbW9zX2Jvb2wga2VlcF90aW1lKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgcGxheWJhY2tfaXRlcmF0b3JfcmF3IGl0OworICAgIHVpbnQzMl90IGxhc3RfdGltZV91cyA9IDA7CisgICAgYmNtb3NfYm9vbCBmaXJzdCA9IEJDTU9TX1RSVUU7CisKKyAgICBGT1JfRUFDSF9DQVBUVVJFX0VOVFJZKGl0LCBjYXB0dXJlX2J1ZiwgYnVmX3NpemUpCisgICAgeworICAgICAgICBiY21vbHRfYnVmIG1zZ19idWY7CisgICAgICAgIGJjbW9sdF9tc2cgKm1zZyA9IE5VTEw7CisKKyAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIlByb2Nlc3NpbmcgbWVzc2FnZSAoJXUsJXUsJXUpXG4iLAorICAgICAgICAgICAgICAgIGl0Lmhkci5ldmVudCwgaXQuaGRyLnRpbWVzdGFtcCwgaXQuaGRyLm1zZ19zaXplKTsKKyAgICAgICAgaWYgKHBsYXliYWNrX3Nob3VsZF9zZW5kKGxvY2F0aW9uLCAoYmNtdHJfY2xkX2V2ZW50X3R5cGUpaXQuaGRyLmV2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGtlZXBfdGltZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYXBwcm94aW1hdGUgb3JpZ2luYWwgdGltaW5nOyBkb2Vzbid0IGFjY291bnQgZm9yIHByb2Nlc3NpbmcgdGltZSBpbiB0aGlzIGNvZGUgLSB0aGlzIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmVkICovCisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJTbGVlcGluZyBmb3IgJXUgdXNcbiIsIGl0Lmhkci50aW1lc3RhbXAgLSBsYXN0X3RpbWVfdXMpOworICAgICAgICAgICAgICAgICAgICBiY21vc191c2xlZXAoaXQuaGRyLnRpbWVzdGFtcCAtIGxhc3RfdGltZV91cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RfdGltZV91cyA9IGl0Lmhkci50aW1lc3RhbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2RldmljZV0ubG9nX2lkLCAiVW5wYWNraW5nIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9pbml0KCZtc2dfYnVmLCBpdC5oZHIubXNnX3NpemUsIGl0Lm1zZ19zdGFydCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgICAgICAgICAgZXJyID0gYmNtb2x0X21zZ191bnBhY2soJm1zZ19idWYsICZtc2cpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJTZW5kaW5nIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgICAgIGVyciA9IGJjbXRyX3NlbmQoZGV2aWNlLCBtc2csIEJDTVRSX1NFTkRfRkxBR1NfTk9ORSk7CisgICAgICAgICAgICAgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7CisgICAgICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBwYl9jdHh0W2RldmljZV0ubG9nX2lkLCAiU2VuZGluZyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBwYl9jdHh0W2RldmljZV0ubG9nX2lkLCAiVW5wYWNraW5nIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY2xpX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHZvaWQgKmNhcHR1cmVfYnVmZmVyOworICAgIHVpbnQzMl90IGJ1Zl9zaXplOworICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbiBsb2NhdGlvbjsKKworICAgIGVyciA9IHBsYXliYWNrX3JlYWQoJmNhcHR1cmVfYnVmZmVyLCAmYnVmX3NpemUsICZsb2NhdGlvbik7CisKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSBlcnIpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkNhcHR1cmUgZnJvbSAlczpcbiIsIGNhcF9sb2Nfc3RyW2xvY2F0aW9uXSk7CisgICAgICAgIHBsYXliYWNrX2R1bXAoc2Vzc2lvbiwgY2FwdHVyZV9idWZmZXIsIGJ1Zl9zaXplKTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKGNhcHR1cmVfYnVmZmVyKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHBsYXliYWNrX2Z3X3ZlcnNpb25fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uICpmdykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jZmcgZGV2X2NmZzsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBkZXZfa2V5ID0geyB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZkZXZfY2ZnLCBkZXZpY2UsIGRldl9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmRldl9jZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmZGV2X2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coV0FSTklORywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIkZhaWxlZCB0byByZXRyaWV2ZSBmdyB2ZXJzaW9uIVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpmdyA9IGRldl9jZmcuZGF0YS5maXJtd2FyZV9zd192ZXJzaW9uOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGxheWJhY2tfaG9zdF92ZXJzaW9uX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfaG9zdF9zd192ZXJzaW9uICpob3N0KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBkZXZfY2ZnOworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGRldl9rZXkgPSB7IH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRldl9jZmcsIGRldmljZSwgZGV2X2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGV2X2NmZywgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pOworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZSwgJmRldl9jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJGYWlsZWQgdG8gcmV0cmlldmUgaG9zdCB2ZXJzaW9uIVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpob3N0ID0gZGV2X2NmZy5kYXRhLmhvc3Rfc3dfdmVyc2lvbjsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jbGlfc2F2ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGUiKS0+dmFsdWUuc3RyaW5nOworICAgIGJjbW9sdF9wbGF5YmFjayBtcGIgPSB7fTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgRklMRSAqZmlsZTsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgZXJyID0gcGxheWJhY2tfcmVhZCgmbXBiLmNhcHR1cmVfYnVmZmVyLCAmbXBiLmJ1Zl9zaXplLCAmbXBiLmxvY2F0aW9uKTsKKworICAgIGlmIChCQ01fRVJSX09LID09IGVycikKKyAgICB7CisgICAgICAgIHBsYXliYWNrX2Z3X3ZlcnNpb25fZ2V0KGN1cnJlbnRfZGV2aWNlLCAmbXBiLmZ3X3Zlcik7CisgICAgICAgIHBsYXliYWNrX2hvc3RfdmVyc2lvbl9nZXQoY3VycmVudF9kZXZpY2UsICZtcGIuaG9zdF92ZXIpOworCisgICAgICAgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgICAgIC8qIHdyaXRlIGZpbGUgdmVyc2lvbiAqLworICAgICAgICB0ZW1wID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMzIsIFZFUlNJT04xKTsKKyAgICAgICAgZndyaXRlKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgLyogd3JpdGUgY2FwdHVyZSBsb2NhdGlvbiAqLworICAgICAgICB0ZW1wID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMzIsICh1aW50MzJfdCltcGIubG9jYXRpb24pOworICAgICAgICBmd3JpdGUoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAvKiB3cml0ZSBmaXJtd2FyZSB2ZXJzaW9uICovCisgICAgICAgIGZ3cml0ZSgmbXBiLmZ3X3Zlci5tYWpvciwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKCZtcGIuZndfdmVyLm1pbm9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoJm1wYi5md192ZXIucmV2aXNpb24sIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXBiLmZ3X3Zlci5tb2RlbCk7CisgICAgICAgIGZ3cml0ZSgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZShtcGIuZndfdmVyLmJ1aWxkX3RpbWUsIHNpemVvZihtcGIuZndfdmVyLmJ1aWxkX3RpbWUpLCAxLCBmaWxlKTsKKyAgICAgICAgLyogd3JpdGUgaG9zdCB2ZXJzaW9uICovCisgICAgICAgIGZ3cml0ZSgmbXBiLmhvc3RfdmVyLm1ham9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoJm1wYi5ob3N0X3Zlci5taW5vciwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKCZtcGIuaG9zdF92ZXIucmV2aXNpb24sIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXBiLmhvc3RfdmVyLm1vZGVsKTsKKyAgICAgICAgZndyaXRlKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKG1wYi5ob3N0X3Zlci5idWlsZF90aW1lLCBzaXplb2YobXBiLmhvc3RfdmVyLmJ1aWxkX3RpbWUpLCAxLCBmaWxlKTsKKyAgICAgICAgLyogd3JpdGUgY2FwdHVyZSBidWZmZXIgKi8KKyAgICAgICAgdGVtcCA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCBtcGIuYnVmX3NpemUpOworICAgICAgICBmd3JpdGUoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUobXBiLmNhcHR1cmVfYnVmZmVyLCBtcGIuYnVmX3NpemUsIDEsIGZpbGUpOworICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtcGIuY2FwdHVyZV9idWZmZXIpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgcGxheWJhY2tfdmVyc2lvbl9tYXRjaChjb25zdCBiY21vbHRfcGxheWJhY2sgKm1wYikKK3sKKyAgICBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiBmd19jdXJyID0ge307CisgICAgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiBob3N0X2N1cnIgPSB7fTsKKworICAgIHBsYXliYWNrX2Z3X3ZlcnNpb25fZ2V0KGN1cnJlbnRfZGV2aWNlLCAmZndfY3Vycik7CisgICAgcGxheWJhY2tfaG9zdF92ZXJzaW9uX2dldChjdXJyZW50X2RldmljZSwgJmhvc3RfY3Vycik7CisKKyAgICBpZiAoKG1wYi0+ZndfdmVyLm1vZGVsICE9IGZ3X2N1cnIubW9kZWwpIHx8IChtcGItPmhvc3RfdmVyLm1vZGVsICE9IGhvc3RfY3Vyci5tb2RlbCkgfHwKKyAgICAgICAgKGZ3X2N1cnIubW9kZWwgPT0gMCkgfHwgKGhvc3RfY3Vyci5tb2RlbCA9PSAwKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coV0FSTklORywgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLAorICAgICAgICAgICAgICAgICJQb3NzaWJsZSB2ZXJzaW9uIG1pc21hdGNoOiBDYXB0dXJlIEZXICV1LCBIT1NUICV1OyBDdXJyZW50IEZXICV1LCBIT1NUICV1XG4iLAorICAgICAgICAgICAgICAgIG1wYi0+ZndfdmVyLm1vZGVsLCBtcGItPmhvc3RfdmVyLm1vZGVsLCBmd19jdXJyLm1vZGVsLCBob3N0X2N1cnIubW9kZWwpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19maWxlX29wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGJjbW9sdF9wbGF5YmFjayAqbXBiKQoreworICAgIEZJTEUgKmZpbGU7CisgICAgdWludDMyX3QgdGVtcDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IGl0ZW1zX3JlYWQ7CisKKyAgICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOworICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisKKyAgICBtcGItPnZlcnNpb24gPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgc3dpdGNoIChtcGItPnZlcnNpb24pCisgICAgeworICAgICAgICBjYXNlIFZFUlNJT04wOgorICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0ZW1wID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIHRlbXApOworICAgICAgICAgICAgbXBiLT5sb2NhdGlvbiA9IChiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24pdGVtcDsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbXBiLT5idWZfc2l6ZSA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCB0ZW1wKTsKKyAgICAgICAgICAgIG1wYi0+Y2FwdHVyZV9idWZmZXIgPSBiY21vc19hbGxvYyhtcGItPmJ1Zl9zaXplKTsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZChtcGItPmNhcHR1cmVfYnVmZmVyLCBtcGItPmJ1Zl9zaXplLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWRVJTSU9OMToKKyAgICAgICAgICAgIC8qIHJlYWQgY2FwdHVyZSBsb2NhdGlvbiAqLworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0ZW1wID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIHRlbXApOworICAgICAgICAgICAgbXBiLT5sb2NhdGlvbiA9IChiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24pdGVtcDsKKyAgICAgICAgICAgIC8qIHJlYWQgZmlybXdhcmUgdmVyc2lvbiAqLworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZtcGItPmZ3X3Zlci5tYWpvciwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJm1wYi0+ZndfdmVyLm1pbm9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmbXBiLT5md192ZXIucmV2aXNpb24sIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtcGItPmZ3X3Zlci5tb2RlbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCB0ZW1wKTsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZChtcGItPmZ3X3Zlci5idWlsZF90aW1lLCBzaXplb2YobXBiLT5md192ZXIuYnVpbGRfdGltZSksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIHJlYWQgaG9zdCB2ZXJzaW9uICovCisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJm1wYi0+aG9zdF92ZXIubWFqb3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZtcGItPmhvc3RfdmVyLm1pbm9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmbXBiLT5ob3N0X3Zlci5yZXZpc2lvbiwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1wYi0+aG9zdF92ZXIubW9kZWwgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQobXBiLT5ob3N0X3Zlci5idWlsZF90aW1lLCBzaXplb2YobXBiLT5ob3N0X3Zlci5idWlsZF90aW1lKSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogcmVhZCBjYXB0dXJlIGJ1ZmZlciAqLworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtcGItPmJ1Zl9zaXplID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIHRlbXApOworICAgICAgICAgICAgbXBiLT5jYXB0dXJlX2J1ZmZlciA9IGJjbW9zX2FsbG9jKG1wYi0+YnVmX3NpemUpOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKG1wYi0+Y2FwdHVyZV9idWZmZXIsIG1wYi0+YnVmX3NpemUsIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiVW5rbm93biB2ZXJzaW9uOiAldVxuIiwgbXBiLT52ZXJzaW9uKTsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmY2xvc2UoZmlsZSk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY2xpX3JlcGxheShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGUiKS0+dmFsdWUuc3RyaW5nOworICAgIGJjbW9zX2Jvb2wgaWdub3JlX3ZlciA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcGxheWJhY2sgbXBiID0ge307CisKKyAgICBiY21jbGlfY21kX3Bhcm0gKml2X3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZ25vcmVfdmVyc2lvbiIpOworICAgIGlmIChpdl9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZ25vcmVfdmVyID0gaXZfcGFybS0+dmFsdWUuZW51bV92YWwgPT0gKGxvbmcpQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBlcnIgPSBwbGF5YmFja19maWxlX29wZW4oZmlsZW5hbWUsICZtcGIpOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgIHsKKyAgICAgICAgaWYgKHBsYXliYWNrX3ZlcnNpb25fbWF0Y2goJm1wYikgfHwgaWdub3JlX3ZlcikKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfcmVwbGF5KGN1cnJlbnRfZGV2aWNlLCBtcGIuY2FwdHVyZV9idWZmZXIsIG1wYi5idWZfc2l6ZSwgbXBiLmxvY2F0aW9uLCBCQ01PU19UUlVFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiUG9zc2libGUgdmVyc2lvbiBtaXNtYXRjaDsgdXNlIGlnbm9yZV92ZXJzaW9uPXllcyB0byBmb3JjZSBwbGF5YmFja1xuIik7CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX0lNQUdFX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShtcGIuY2FwdHVyZV9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19hcGlfY2xpX2FwcGVuZF9wcm9wKAorICAgIGJjbW9sdF9zdHJpbmcgKmFwaV9jbGksCisgICAgdWludDMyX3Qgc2l6ZSwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwKKyAgICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWNsaV9zZXNzaW9uICpzdHI7CisgICAgdm9pZCAqcHJvcF9kYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIHBkLT5vZmZzZXQpOworCisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKHBkLT5vZmZzZXQgPj0gc2l6ZSwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgZXJyID0gYmNtY2xpX3Nlc3Npb25fb3Blbl9zdHJpbmcoJnN0ciwgYXBpX2NsaSk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgZXJyID0gYXBpY2xpX2R1bXBfcHJvcF9wYXJhbShzdHIsIHBkLCBwcm9wX2RhdGEsIHByZWZpeCk7CisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2Uoc3RyKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfYXBpX2NsaV9rZXlfd3JpdGUoCisgICAgYmNtb2x0X3N0cmluZyogYXBpX2NsaSwKKyAgICBjb25zdCBiY21vbHRfbXNnKiBtc2csCisgICAgdWludDMyX3Qga2V5X3NpemUsCisgICAgdWludDMyX3Qga2V5X29mZnNldCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworICAgIHZvaWQgKmRhdGEgPSAodm9pZCAqKSgobG9uZyltc2cgKyBrZXlfb2Zmc2V0KTsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgZXJyID0gcGxheWJhY2tfYXBpX2NsaV9hcHBlbmRfcHJvcChhcGlfY2xpLCBrZXlfc2l6ZSwgZGF0YSwgcGQsICIgIik7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfYXBpX2NsaV9wbV93cml0ZShiY21vbHRfc3RyaW5nICphcGlfY2xpLCBjb25zdCBiY21vbHRfbXNnKiBtc2csIGJjbW9sdF9wcmVzZW5jZV9tYXNrIHBtKQoreworICAgIGludCBuOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAoIShwbSAmICgxVUxMIDw8IHByb3ApKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGFwaV9jbGksICIgJXM9eWVzIiwgcGQtPm5hbWUpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2FwaV9jbGlfcHJvcHNfd3JpdGUoCisgICAgYmNtb2x0X3N0cmluZyAqYXBpX2NsaSwKKyAgICBjb25zdCBiY21vbHRfbXNnKiBtc2csCisgICAgY29uc3QgY2hhciAqcHJlZml4LAorICAgIHVpbnQzMl90IHNpemUsCisgICAgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisgICAgdm9pZCAqZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIG9mZnNldCk7CisKKyAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgaWYgKCEobXNnLT5wcmVzZW5jZV9tYXNrICYgKDFVTEwgPDwgcHJvcCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX2FwcGVuZF9wcm9wKGFwaV9jbGksIHNpemUsIGRhdGEsIHBkLCBwcmVmaXgpOworICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldCgKKyAgICBiY21vbHRfc3RyaW5nICphcGlfY2xpLAorICAgIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywKKyAgICBjb25zdCBjaGFyICpjbWQsCisgICAgcGJfY2xpX2V4dHJhIGV4dHJhX3Bhcm1zLAorICAgIHBiX2ZpZWxkcyBmaWVsZF9wYXJtcykKK3sKKyAgICBpbnQgbjsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICAgIHVpbnQzMl90IGtleV9zaXplOworICAgIHVpbnQzMl90IGtleV9vZmZzZXQ7CisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IGRhdGFfb2Zmc2V0OworCisgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiU3RhcnQgJXNcbiIsIGNtZCk7CisKKyAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9uYW1lKG1zZy0+b2JqX3R5cGUsICZuYW1lLCAmZGVzYyk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisKKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoYXBpX2NsaSwgIi9hcGkvJXMgb2JqZWN0PSVzIiwgY21kLCBuYW1lKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKworICAgIHN3aXRjaCAoZXh0cmFfcGFybXMpCisgICAgeworICAgICAgICBjYXNlIFBCX0NMSV9FWFRSQV9NVUxUSToKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZCgKKyAgICAgICAgICAgICAgICBhcGlfY2xpLAorICAgICAgICAgICAgICAgICIgbWF4X21zZ3M9JXUgZmlsdGVyX2ludmVydD0lcyIsCisgICAgICAgICAgICAgICAgbXNnLT5tc2dfc2V0LT5tYXhfaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgIEJJVFNfU0VUKG1zZy0+bXNnX3NldC0+ZmlsdGVyX2ZsYWdzLCBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04pID8gInllcyIgOiAibm8iKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfQ0xJX0VYVFJBX1NUQVQ6CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoYXBpX2NsaSwgIiBjbGVhcj0lcyIsIEJJVFNfU0VUKG1zZy0+dHlwZSwgQkNNT0xUX01TR19UWVBFX0NMRUFSKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBCX0NMSV9FWFRSQV9TVUJHUk9VUDoKKyAgICAgICAgICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgJm5hbWUsICZkZXNjKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGFwaV9jbGksICIgc3ViPSVzIiwgbmFtZSk7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogZ2V0IG1lc3NhZ2UgaW5mbyAqLworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N0cnVjdF9zaXplKAorICAgICAgICBtc2ctPm9ial90eXBlLAorICAgICAgICBtc2ctPmdyb3VwLAorICAgICAgICBtc2ctPnN1Ymdyb3VwLAorICAgICAgICAma2V5X3NpemUsCisgICAgICAgICZrZXlfb2Zmc2V0LAorICAgICAgICAmZGF0YV9zaXplLAorICAgICAgICAmZGF0YV9vZmZzZXQpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworCisgICAgaWYgKEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcgIT0gbXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIC8qIHdyaXRlIGtleSAqLworICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX2tleV93cml0ZShhcGlfY2xpLCBtc2csIGtleV9zaXplLCBrZXlfb2Zmc2V0KTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZF9wYXJtcykKKyAgICB7CisgICAgICAgIGNhc2UgUEJfRklFTERTX0dFVDoKKyAgICAgICAgICAgIC8qIHdyaXRlIHByZXNlbmNlIG1hc2sgKi8KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfcG1fd3JpdGUoYXBpX2NsaSwgbXNnLCBtc2ctPnByZXNlbmNlX21hc2spOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQl9GSUVMRFNfTVVMVEk6CisgICAgICAgICAgICAvKiB3cml0ZSBmaWx0ZXIgKi8KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfcHJvcHNfd3JpdGUoYXBpX2NsaSwgbXNnLCAiIGZpbHRlci4iLCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgLyogd3JpdGUgcHJlc2VuY2UgbWFzayAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfYXBpX2NsaV9wbV93cml0ZShhcGlfY2xpLCBtc2csIG1zZy0+bXNnX3NldC0+cHJlc2VuY2VfbWFzayk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBCX0ZJRUxEU19TRVQ6CisgICAgICAgICAgICAvKiB3cml0ZSBwcm9wZXJ0aWVzICovCisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX3Byb3BzX3dyaXRlKGFwaV9jbGksIG1zZywgIiAiLCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoYXBpX2NsaSwgIlxuIik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJFbmQgJXNcbiIsIGNtZCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfYXBpX2NsaV9nZXQoYmNtb2x0X3N0cmluZyogYXBpX2NsaSwgY29uc3QgYmNtb2x0X21zZyogbXNnKQoreworICAgIHN3aXRjaCAobXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAiZ2V0IiwgUEJfQ0xJX0VYVFJBX05PTkUsIFBCX0ZJRUxEU19HRVQpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJtdWx0aWdldCIsIFBCX0NMSV9FWFRSQV9NVUxUSSwgUEJfRklFTERTX01VTFRJKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAic2V0IiwgUEJfQ0xJX0VYVFJBX05PTkUsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgImNsZWFyIiwgUEJfQ0xJX0VYVFJBX05PTkUsIFBCX0ZJRUxEU19OT05FKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAic3RhdCIsIFBCX0NMSV9FWFRSQV9TVEFULCBQQl9GSUVMRFNfR0VUKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgc3dpdGNoIChtc2ctPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgInNhZ2V0IiwgUEJfQ0xJX0VYVFJBX1NVQkdST1VQLCBQQl9GSUVMRFNfTk9ORSk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgInNhc2V0IiwgUEJfQ0xJX0VYVFJBX1NVQkdST1VQLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAiYWNnZXQiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX0dFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgImFjc2V0IiwgUEJfQ0xJX0VYVFJBX05PTkUsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJvcGVyIiwgUEJfQ0xJX0VYVFJBX1NVQkdST1VQLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJzZW5kIiwgUEJfQ0xJX0VYVFJBX1NVQkdST1VQLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NvbnZlcnRfYXBpX2NsaShiY21vbHRfcGxheWJhY2sgKm1wYiwgRklMRSAqb3V0X2ZpbGUpCit7CisgICAgcGxheWJhY2tfaXRlcmF0b3IgaXQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9zdHJpbmcgKnN0cjsKKworICAgIGVyciA9IGJjbW9sdF9zdHJpbmdfY3JlYXRlKCZzdHIsIDIwNDgpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIEZPUl9FQUNIX1BMQVlCQUNLX01TRyhpdCwgbXBiLT5jYXB0dXJlX2J1ZmZlciwgbXBiLT5idWZfc2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChwbGF5YmFja19zaG91bGRfc2VuZChtcGItPmxvY2F0aW9uLCAoYmNtdHJfY2xkX2V2ZW50X3R5cGUpaXQucmF3Lmhkci5ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LID09IGl0LmVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfc3RyaW5nX3Jlc2V0KHN0cik7CisgICAgICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfYXBpX2NsaV9nZXQoc3RyLCBpdC5tc2cpOworICAgICAgICAgICAgICAgIGZ3cml0ZShiY21vbHRfc3RyaW5nX2dldChzdHIpLCBzaXplb2YoY2hhciksIHN0cmxlbihiY21vbHRfc3RyaW5nX2dldChzdHIpKSwgb3V0X2ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IGl0LmVycjsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJVbnBhY2tpbmcgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYmNtb2x0X3N0cmluZ19kZXN0cm95KHN0cik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja19maWVsZF9jb250YWluc192YXJfbGlzdChjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdHlwZSkKK3sKKyAgICBpZiAodHlwZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCkKKyAgICB7CisgICAgICAgIHJldHVybiBwbGF5YmFja19maWVsZF9jb250YWluc192YXJfbGlzdCh0eXBlLT54LmFycl9maXhlZC5lbGVtX3R5cGUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QpCisgICAgeworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgdHlwZS0+eC5zLm51bV9maWVsZHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KHR5cGUtPngucy5maWVsZHNbaV0udHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04pCisgICAgeworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgdHlwZS0+eC51Lm51bV9jb21tb25fZmllbGRzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwbGF5YmFja19maWVsZF9jb250YWluc192YXJfbGlzdCh0eXBlLT54LnUuY29tbW9uX2ZpZWxkc1tpXS50eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyB0eXBlLT54LnUuY29tbW9uX2ZpZWxkc1t0eXBlLT54LnUuY2xhc3NpZmllcl9pZHhdLnR5cGUtPnguZVtpXS5uYW1lICE9IE5VTEw7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KHR5cGUtPngudS51bmlvbl9maWVsZHNbaV0udHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogbm90IGEgdmFyaWFibGUgc2l6ZWQgbGlzdCAqLworICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgcGxheWJhY2tfbXNnX2NvbnRhaW5zX3Zhcl9saXN0KGNvbnN0IGJjbW9sdF9tc2cqIG1zZykKK3sKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgaWYgKHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KHBkLT50eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoYmNtb2x0X3N0cmluZyAqZGVzdCwgY29uc3QgY2hhciogc3JjKQoreworICAgIGludCBuOworCisgICAgd2hpbGUgKCpzcmMgIT0gJ1wwJykKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChkZXN0LCAiJWMiLCAoY2hhcil0b3VwcGVyKChpbnQpKnNyYykpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgKytzcmM7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9wbV93cml0ZSgKKyAgICBiY21vbHRfc3RyaW5nICpjX2FwaSwKKyAgICBjb25zdCBiY21vbHRfbXNnKiBtc2csCisgICAgYmNtb2x0X3ByZXNlbmNlX21hc2sgcG0sCisgICAgY29uc3QgY2hhciAqZXh0cmEsCisgICAgY29uc3QgY2hhciAqZmllbGQsCisgICAgY29uc3QgY2hhciAqb2JqKQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgaWYgKCEocG0gJiAoMVVMTCA8PCBwcm9wKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0QkNNT0xUXyVzIiwgZXh0cmEpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgZXJyID0gcGxheWJhY2tfc3RyaW5nX3dyaXRlX3VwcGVyKGNfYXBpLCBhcGljbGlfbWd0X2dyb3VwX3RvX3N0cihtc2ctPmdyb3VwKSk7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJfUFJPUF9HRVQoJXMsICVzLCAlcyk7XG4iLCBmaWVsZCwgb2JqLCBwZC0+bmFtZSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfYXBwZW5kX2luaXQoCisgICAgYmNtb2x0X3N0cmluZyAqY19hcGksCisgICAgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgY29uc3QgY2hhciogbmFtZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21jbGlfc2Vzc2lvbiAqc3RyOworCisgICAgcmMgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3N0cmluZygmc3RyLCBjX2FwaSk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICByYyA9IGFwaWNsaV9kdW1wX2R5bl9hcnJheShzdHIsIHRkLCBkYXRhLCBuYW1lKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShzdHIpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfYXBwZW5kX3Byb3AoCisgICAgYmNtb2x0X3N0cmluZyAqY19hcGksCisgICAgdWludDMyX3Qgc2l6ZSwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtY2xpX3Nlc3Npb24gKnN0cjsKKyAgICB2b2lkICpwcm9wX2RhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgcGQtPm9mZnNldCk7CisKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IocGQtPm9mZnNldCA+PSBzaXplLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBlcnIgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3N0cmluZygmc3RyLCBjX2FwaSk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgZXJyID0gYXBpY2xpX2R1bXBfcHJvcF9pbml0aWFsaXplcihzdHIsIHBkLCBwcm9wX2RhdGEpOworICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKHN0cik7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKAorICAgIGJjbW9sdF9zdHJpbmcgKmNfYXBpLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0eXBlLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgbjsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTikKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0JXMgJXNbXSA9ICIsIHR5cGUtPnguYXJyX2R5bi5lbGVtX3R5cGUtPm5hbWUsIG5hbWUpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgcmMgPSBwbGF5YmFja19jX2FwaV9hcHBlbmRfaW5pdChjX2FwaSwgZGF0YSwgdHlwZSwgbmFtZSk7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIjtcbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IHR5cGUtPnguYXJyX2ZpeGVkLnNpemU7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBpbmRleF9uYW1lWzY0XTsKKworICAgICAgICAgICAgc3ByaW50ZihpbmRleF9uYW1lLCAiJXMldSIsIG5hbWUsIGkpOworICAgICAgICAgICAgcmMgPSBwbGF5YmFja19jX2FwaV9tYWtlX3Zhcl9saXN0cyhjX2FwaSwgdHlwZS0+eC5hcnJfZml4ZWQuZWxlbV90eXBlLCBkYXRhLCBpbmRleF9uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisgICAgICAgICAgICBkYXRhID0gKHZvaWQqKSgobG9uZylkYXRhICsgdHlwZS0+eC5hcnJfZml4ZWQuZWxlbV90eXBlLT5zaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QpCisgICAgeworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgdHlwZS0+eC5zLm51bV9maWVsZHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmaWVsZCA9ICZ0eXBlLT54LnMuZmllbGRzW2ldOworICAgICAgICAgICAgcmMgPSBwbGF5YmFja19jX2FwaV9tYWtlX3Zhcl9saXN0cyhjX2FwaSwgZmllbGQtPnR5cGUsICh2b2lkKikoKGxvbmcpZGF0YSArIGZpZWxkLT5vZmZzZXQpLCBmaWVsZC0+bmFtZSk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IocmMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IHR5cGUtPngudS5udW1fY29tbW9uX2ZpZWxkczsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZpZWxkID0gJnR5cGUtPngudS5jb21tb25fZmllbGRzW2ldOworICAgICAgICAgICAgcmMgPSBwbGF5YmFja19jX2FwaV9tYWtlX3Zhcl9saXN0cyhjX2FwaSwgZmllbGQtPnR5cGUsICh2b2lkKikoKGxvbmcpZGF0YSArIGZpZWxkLT5vZmZzZXQpLCBmaWVsZC0+bmFtZSk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IocmMpOworICAgICAgICB9CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IHR5cGUtPngudS5jb21tb25fZmllbGRzW3R5cGUtPngudS5jbGFzc2lmaWVyX2lkeF0udHlwZS0+eC5lW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZpZWxkID0gJnR5cGUtPngudS51bmlvbl9maWVsZHNbaV07CisgICAgICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCBmaWVsZC0+dHlwZSwgKHZvaWQqKSgobG9uZylkYXRhICsgZmllbGQtPm9mZnNldCksIGZpZWxkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogbm90IGEgdmFyaWFibGUgc2l6ZWQgbGlzdCAqLworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfcHJvcHNfd3JpdGUoCisgICAgYmNtb2x0X3N0cmluZyAqY19hcGksCisgICAgY29uc3QgYmNtb2x0X21zZyogbXNnLAorICAgIGNvbnN0IGNoYXIqIG9iamVjdCwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICBpbnQgbjsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgY29uc3QgY2hhciAqc3ViZ3JvdXA7CisgICAgY29uc3QgY2hhciAqZGVzYzsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisgICAgdm9pZCAqZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIG9mZnNldCk7CisKKyAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgaWYgKCEobXNnLT5wcmVzZW5jZV9tYXNrICYgKDFVTEwgPDwgcHJvcCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwbGF5YmFja19jX2FwaV9tYWtlX3Zhcl9saXN0cyhjX2FwaSwgcGQtPnR5cGUsICh2b2lkKikoKGxvbmcpZGF0YSArIHBkLT5vZmZzZXQpLCBwZC0+bmFtZSk7CisgICAgfQorCisgICAgZm9yICh1aW50MTZfdCBwcm9wID0gMDsKKyAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsIHByb3AsICZwZCkgPT0gQkNNX0VSUl9PSzsKKyAgICAgICAgICsrcHJvcCkKKyAgICB7CisgICAgICAgIGlmICghKG1zZy0+cHJlc2VuY2VfbWFzayAmICgxVUxMIDw8IHByb3ApKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNUKSB8fAorICAgICAgICAgICAgKHBkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTikgfHwKKyAgICAgICAgICAgIChwZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTikgfHwKKyAgICAgICAgICAgIChwZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEKSkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQlcyAiVkFMX1JFRiIgPSAiLCBwZC0+dHlwZS0+bmFtZSk7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX2FwcGVuZF9wcm9wKGNfYXBpLCBzaXplLCBkYXRhLCBwZCk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIjtcbiIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdEJDTU9MVF8iKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfc3RyaW5nX3dyaXRlX3VwcGVyKGNfYXBpLCBhcGljbGlfbWd0X2dyb3VwX3RvX3N0cihtc2ctPmdyb3VwKSk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIl9QUk9QX1NFVCgmbXNnLCAlcyIsIG9iamVjdCk7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGlmICgobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX09QRVIpIHx8IChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgJnN1Ymdyb3VwLCAmZGVzYyk7CisgICAgICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCAlcyIsIHN1Ymdyb3VwKTsKKyAgICAgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgJXMsICJWQUxfUkVGIik7XG4iLCBwZC0+bmFtZSk7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0QkNNT0xUXyIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiX1BST1BfU0VUKCZtc2csICVzIiwgb2JqZWN0KTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgaWYgKChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUikgfHwgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmc3ViZ3JvdXAsICZkZXNjKTsKKyAgICAgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICVzIiwgc3ViZ3JvdXApOworICAgICAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCAlcywgIiwgcGQtPm5hbWUpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19jX2FwaV9hcHBlbmRfcHJvcChjX2FwaSwgc2l6ZSwgZGF0YSwgcGQpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIpO1xuIik7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoCisgICAgYmNtb2x0X3N0cmluZyogY19hcGksCisgICAgY29uc3QgYmNtb2x0X21zZyogbXNnLAorICAgIGNvbnN0IGNoYXIgKmNhbGwsCisgICAgcGJfZmllbGRzIGZpZWxkX3Bhcm1zKQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBjaGFyICpvYmplY3Q7CisgICAgY29uc3QgY2hhciAqZ3JvdXA7CisgICAgY29uc3QgY2hhciAqc3ViZ3JvdXA7CisgICAgY29uc3QgY2hhciAqZGVzYzsKKyAgICB1aW50MzJfdCBrZXlfc2l6ZTsKKyAgICB1aW50MzJfdCBrZXlfb2Zmc2V0OworICAgIHVpbnQzMl90IGRhdGFfc2l6ZTsKKyAgICB1aW50MzJfdCBkYXRhX29mZnNldDsKKyAgICB2b2lkICpkYXRhOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICBiY21vc19ib29sIHZhcl9saXN0ID0gKEJDTU9MVF9NU0dfVFlQRV9HRVQgPT0gbXNnLT50eXBlKSAmJiBwbGF5YmFja19tc2dfY29udGFpbnNfdmFyX2xpc3QobXNnKTsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X25hbWUobXNnLT5vYmpfdHlwZSwgJm9iamVjdCwgJmRlc2MpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgJnN1Ymdyb3VwLCAmZGVzYyk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisKKyAgICBncm91cCA9IGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApOworCisgICAgLyogZ2V0IG1lc3NhZ2UgaW5mbyAqLworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N0cnVjdF9zaXplKAorICAgICAgICBtc2ctPm9ial90eXBlLAorICAgICAgICBtc2ctPmdyb3VwLAorICAgICAgICBtc2ctPnN1Ymdyb3VwLAorICAgICAgICAma2V5X3NpemUsCisgICAgICAgICZrZXlfb2Zmc2V0LAorICAgICAgICAmZGF0YV9zaXplLAorICAgICAgICAmZGF0YV9vZmZzZXQpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworCisgICAgLyogaW5pdCB2YXJpYWJsZXMgKi8KKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdHtcbiIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIGlmICgobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX09QRVIpIHx8IChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFkpKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vbHRfJXNfJXMgIk1TR19SRUYiO1xuIiwgb2JqZWN0LCBzdWJncm91cCk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9sdF8lc18lcyAiTVNHX1JFRiI7XG4iLCBvYmplY3QsIGdyb3VwKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0YmNtb2x0XyVzX2tleSAiS0VZX1JFRiIgPSB7IH07XG4iLCBvYmplY3QpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworCisgICAgaWYgKHZhcl9saXN0KQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHR1aW50OF90KiAiTElTVF9NRU1fUkVGIjtcbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisKKyAgICBpZiAobXNnLT50eXBlID09IEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEkpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9sdF9tc2dfc2V0KiAiTVNHX1NFVF9SRUYiID0gTlVMTDtcbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHR1aW50MzJfdCAiTUFYX01TR1NfUkVGIjtcbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vc19ib29sICJJTlZFUlRfRklMVEVSX1JFRiI7XG5cbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiTUFYX01TR1NfUkVGIiA9ICVkO1xuIiwgbXNnLT5tc2dfc2V0LT5tYXhfaW5zdGFuY2VzKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0IklOVkVSVF9GSUxURVJfUkVGIiA9ICVzO1xuIiwgQklUU19TRVQobXNnLT5tc2dfc2V0LT5maWx0ZXJfZmxhZ3MsIEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0YmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF8iKTsKKyAgICAgICAgZXJyID0gcGxheWJhY2tfc3RyaW5nX3dyaXRlX3VwcGVyKGNfYXBpLCBvYmplY3QpOworICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCBCQ01PTFRfTUdUX0dST1VQXyIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgZXJyID0gcGxheWJhY2tfc3RyaW5nX3dyaXRlX3VwcGVyKGNfYXBpLCBncm91cCk7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICJNQVhfTVNHU19SRUYiLCAmIk1TR19TRVRfUkVGIik7XG4iKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIGVsc2UgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vbHRfc3RhdF9mbGFncyAiU1RBVF9GTEFHU19SRUYiO1xuXG4iKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0IlNUQVRfRkxBR1NfUkVGIiA9ICVzO1xuIiwgQklUU19TRVQobXNnLT50eXBlLCBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpID8gIkJDTU9MVF9TVEFUX0ZMQUdTX0NMRUFSX09OX1JFQUQiIDogIkJDTU9MVF9TVEFUX0ZMQUdTX05PTkUiKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlxuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKworICAgIC8qIHNldCBrZXkgKi8KKyAgICBpZiAoQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRyAhPSBtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUga2V5ICovCisgICAgICAgIGRhdGEgPSAodm9pZCAqKSgobG9uZyltc2cgKyBrZXlfb2Zmc2V0KTsKKyAgICAgICAgZm9yICh1aW50MTZfdCBwcm9wID0gMDsKKyAgICAgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgICAgICsrcHJvcCkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiS0VZX1JFRiIuJXMgPSAiLCBwZC0+bmFtZSk7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGlmICgoQkNNT0xUX0JBU0VfVFlQRV9JRF9NQUMgPT0gcGQtPnR5cGUtPmJhc2VfdHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoQkNNT0xUX0JBU0VfVFlQRV9JRF9JUFY0ID09IHBkLT50eXBlLT5iYXNlX3R5cGUpIHx8CisgICAgICAgICAgICAgICAgKEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNUID09IHBkLT50eXBlLT5iYXNlX3R5cGUpIHx8CisgICAgICAgICAgICAgICAgKEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04gPT0gcGQtPnR5cGUtPmJhc2VfdHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiKCVzKSIsIHBkLT50eXBlLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX2FwcGVuZF9wcm9wKGNfYXBpLCBrZXlfc2l6ZSwgZGF0YSwgcGQpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICI7XG4iKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0IHByb3BlcnRpZXMgKi8KKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdEJDTU9MVF8iKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGdyb3VwKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJfSU5JVCgmIk1TR19SRUYiLCAlcyIsIG9iamVjdCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgaWYgKChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcpIHx8CisgICAgICAgIChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUikgfHwKKyAgICAgICAgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWSkpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICVzIiwgc3ViZ3JvdXApOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCAiS0VZX1JFRiIpO1xuIik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBzd2l0Y2ggKGZpZWxkX3Bhcm1zKQorICAgIHsKKyAgICAgICAgY2FzZSBQQl9GSUVMRFNfR0VUOgorICAgICAgICAgICAgLyogd3JpdGUgcHJlc2VuY2UgbWFzayAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfcG1fd3JpdGUoY19hcGksIG1zZywgbXNnLT5wcmVzZW5jZV9tYXNrLCAiIiwgIiYiTVNHX1JFRiwgb2JqZWN0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgaWYgKHZhcl9saXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0IkxJU1RfTUVNX1JFRiIgPSBiY21vc19jYWxsb2MoIkRZTl9MSVNUX1NJWkUiKTtcbiIpOworICAgICAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgY19hcGksCisgICAgICAgICAgICAgICAgICAgICJcdEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCYiTVNHX1JFRiIsICVzLCAiTElTVF9NRU1fUkVGIiwgIkRZTl9MSVNUX1NJWkUiKTtcbiIsIG9iamVjdCk7CisgICAgICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQl9GSUVMRFNfTVVMVEk6CisgICAgICAgICAgICAvKiB3cml0ZSBmaWx0ZXIgKi8KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX3Byb3BzX3dyaXRlKGNfYXBpLCBtc2csIG9iamVjdCwgZGF0YV9zaXplLCBkYXRhX29mZnNldCk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIC8qIHdyaXRlIHByZXNlbmNlIG1hc2sgKi8KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX3BtX3dyaXRlKGNfYXBpLCBtc2csIG1zZy0+cHJlc2VuY2VfbWFzaywgIk1TR1NFVF8iLCBNU0dfU0VUX1JFRiwgb2JqZWN0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfRklFTERTX1NFVDoKKyAgICAgICAgICAgIC8qIHdyaXRlIHByb3BlcnRpZXMgKi8KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX3Byb3BzX3dyaXRlKGNfYXBpLCBtc2csIG9iamVjdCwgZGF0YV9zaXplLCBkYXRhX29mZnNldCk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdCJSQ19SRUYiID0gYmNtb2x0XyVzXyVzKCJERVZJQ0VfUkVGIiwgJiJNU0dfUkVGIi5oZHIiLCBncm91cCwgY2FsbCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgaWYgKG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKAorICAgICAgICAgICAgY19hcGksCisgICAgICAgICAgICAiLCAoIklOVkVSVF9GSUxURVJfUkVGIikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsICJNU0dfU0VUX1JFRik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKyAgICBlbHNlIGlmIChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCkKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgIlNUQVRfRkxBR1NfUkVGKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICB9CisgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiKTtcbiIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0YmNtb3NfcHJpbnRmKFwiYmNtb2x0XyVzXyVzIHJldHVybmVkICUlcyAoJSVkKVxcblwiLCBiY21vc19zdHJlcnJvcigiUkNfUkVGIiksICJSQ19SRUYiKTtcbiIsIGdyb3VwLCBjYWxsKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdH1cblxuIik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NfYXBpX2dldChiY21vbHRfc3RyaW5nKiBjX2FwaSwgY29uc3QgYmNtb2x0X21zZyogbXNnKQoreworICAgIHN3aXRjaCAobXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiZ2V0IiwgUEJfRklFTERTX0dFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgImdldF9tdWx0aSIsIFBCX0ZJRUxEU19NVUxUSSk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgInNldCIsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgImNsZWFyIiwgUEJfRklFTERTX05PTkUpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJnZXQiLCBQQl9GSUVMRFNfR0VUKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgc3dpdGNoIChtc2ctPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgImdldCIsIFBCX0ZJRUxEU19OT05FKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAic2V0IiwgUEJfRklFTERTX1NFVCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgc3dpdGNoIChtc2ctPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgImdldCIsIFBCX0ZJRUxEU19HRVQpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJzZXQiLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAic3VibWl0IiwgUEJfRklFTERTX1NFVCk7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAic2VuZCIsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY29udmVydF9jX2FwaShiY21vbHRfcGxheWJhY2sgKm1wYiwgRklMRSAqb3V0X2ZpbGUpCit7CisgICAgcGxheWJhY2tfaXRlcmF0b3IgaXQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9zdHJpbmcgKnN0cjsKKyAgICB1aW50MzJfdCBsYXN0X3RpbWVfdXMgPSAwOworICAgIGJjbW9zX2Jvb2wgZmlyc3QgPSBCQ01PU19UUlVFOworCisgICAgZXJyID0gYmNtb2x0X3N0cmluZ19jcmVhdGUoJnN0ciwgMTYzODQpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIGZwcmludGYob3V0X2ZpbGUsICJ2b2lkIHJ1bl9wbGF5YmFjayh2b2lkKVxue1xuIik7CisgICAgZnByaW50ZihvdXRfZmlsZSwgIlx0YmNtb2x0X2RldmlkICJERVZJQ0VfUkVGIiA9ICVkO1xuIiwgY3VycmVudF9kZXZpY2UpOworICAgIGZwcmludGYob3V0X2ZpbGUsICJcdGJjbW9zX2Vycm5vICJSQ19SRUYiID0gQkNNX0VSUl9PSztcblxuIik7CisgICAgRk9SX0VBQ0hfUExBWUJBQ0tfTVNHKGl0LCBtcGItPmNhcHR1cmVfYnVmZmVyLCBtcGItPmJ1Zl9zaXplKQorICAgIHsKKyAgICAgICAgaWYgKHBsYXliYWNrX3Nob3VsZF9zZW5kKG1wYi0+bG9jYXRpb24sIChiY210cl9jbGRfZXZlbnRfdHlwZSlpdC5yYXcuaGRyLmV2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gaXQuZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSBvcmlnaW5hbCB0aW1pbmc7IGRvZXNuJ3QgYWNjb3VudCBmb3IgcHJvY2Vzc2luZyB0aW1lIGluIHRoaXMgY29kZSAtIHRoaXMgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfZmlsZSwgIlxuXHRiY21vc191c2xlZXAoJXUpO1xuXG4iLCBpdC5yYXcuaGRyLnRpbWVzdGFtcCAtIGxhc3RfdGltZV91cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RfdGltZV91cyA9IGl0LnJhdy5oZHIudGltZXN0YW1wOworICAgICAgICAgICAgICAgIGJjbW9sdF9zdHJpbmdfcmVzZXQoc3RyKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19jX2FwaV9nZXQoc3RyLCBpdC5tc2cpOworICAgICAgICAgICAgICAgIGZ3cml0ZShiY21vbHRfc3RyaW5nX2dldChzdHIpLCBzaXplb2YoY2hhciksIHN0cmxlbihiY21vbHRfc3RyaW5nX2dldChzdHIpKSwgb3V0X2ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IGl0LmVycjsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJVbnBhY2tpbmcgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihvdXRfZmlsZSwgIn1cbiIpOworICAgIGJjbW9sdF9zdHJpbmdfZGVzdHJveShzdHIpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NvbnZlcnQoYmNtb2x0X3BsYXliYWNrICptcGIsIHBiX2Zvcm1hdCBmb3JtYXQsIEZJTEUgKm91dF9maWxlKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIHN3aXRjaCAoZm9ybWF0KQorICAgIHsKKyAgICAgICAgY2FzZSBQQl9GT1JNQVRfQVBJX0NMSToKKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NvbnZlcnRfYXBpX2NsaShtcGIsIG91dF9maWxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBCX0ZPUk1BVF9DX0FQSToKKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NvbnZlcnRfY19hcGkobXBiLCBvdXRfZmlsZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlVua25vd24gZm9ybWF0OiAlZFxuIiwgZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jbGlfY29udihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICppbmZpbGVuYW1lID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5maWxlIiktPnZhbHVlLnN0cmluZzsKKyAgICBjb25zdCBjaGFyICpvdXRmaWxlbmFtZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm91dGZpbGUiKS0+dmFsdWUuc3RyaW5nOworICAgIHBiX2Zvcm1hdCBmb3JtYXQgPSAocGJfZm9ybWF0KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZvcm1hdCIpLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICBiY21vc19ib29sIGlnbm9yZV92ZXIgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3BsYXliYWNrIG1wYiA9IHt9OworICAgIEZJTEUgKm91dF9maWxlOworCisgICAgYmNtY2xpX2NtZF9wYXJtICppdl9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaWdub3JlX3ZlcnNpb24iKTsKKyAgICBpZiAoaXZfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWdub3JlX3ZlciA9IGl2X3Bhcm0tPnZhbHVlLmVudW1fdmFsID09IChsb25nKUJDTU9TX1RSVUU7CisgICAgfQorCisgICAgZXJyID0gcGxheWJhY2tfZmlsZV9vcGVuKGluZmlsZW5hbWUsICZtcGIpOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgIHsKKyAgICAgICAgaWYgKHBsYXliYWNrX3ZlcnNpb25fbWF0Y2goJm1wYikgfHwgaWdub3JlX3ZlcikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgIndiIik7CisgICAgICAgICAgICBwbGF5YmFja19jb252ZXJ0KCZtcGIsIGZvcm1hdCwgb3V0X2ZpbGUpOworICAgICAgICAgICAgZmNsb3NlKG91dF9maWxlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiUG9zc2libGUgdmVyc2lvbiBtaXNtYXRjaDsgdXNlIGlnbm9yZV92ZXJzaW9uPXllcyB0byBmb3JjZSBjb252ZXJzaW9uXG4iKTsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU1BR0VfVFlQRTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKG1wYi5jYXB0dXJlX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgYmNtY2xpX2VudHJ5ICpwbGJfZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgInBsYXliYWNrIiwgInBsYXliYWNrIiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQlVHX09OKE5VTEwgPT0gcGxiX2Rpcik7CisKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGZvcm1hdF9lbnVtX3RhYmxlW1BCX0ZPUk1BVF9fQ09VTlQrMV0gPQorICAgIHsKKyAgICAgICAgey5uYW1lID0gImFwaV9jbGkiLCAudmFsID0gKGxvbmcpUEJfRk9STUFUX0FQSV9DTEl9LAorICAgICAgICB7Lm5hbWUgPSAiY19hcGkiLCAudmFsID0gKGxvbmcpUEJfRk9STUFUX0NfQVBJfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKHBsYl9kaXIsICJkdW1wIiwgImR1bXAgY2FwdHVyZSIsIHBsYXliYWNrX2NsaV9kdW1wKTsKKyAgICBCQ01DTElfTUFLRV9DTUQocGxiX2RpciwgInNhdmUiLCAic2F2ZSBjYXB0dXJlIiwgcGxheWJhY2tfY2xpX3NhdmUsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZpbGUiLCAiZmlsZW5hbWUiLCBCQ01DTElfUEFSTV9TVFJJTkcsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkpOworICAgIEJDTUNMSV9NQUtFX0NNRChwbGJfZGlyLCAicmVwbGF5IiwgInJlcGxheSBjYXB0dXJlIiwgcGxheWJhY2tfY2xpX3JlcGxheSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZmlsZSIsICJmaWxlbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJpZ25vcmVfdmVyc2lvbiIsICJJZ25vcmUgdmVyc2lvbiBtaXNtYXRjaCIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyAgICBCQ01DTElfTUFLRV9DTUQocGxiX2RpciwgImNvbnYiLCAiQ29udmVydCBjYXB0dXJlIiwgcGxheWJhY2tfY2xpX2NvbnYsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZmlsZSIsICJJbnB1dCBmaWxlbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgib3V0ZmlsZSIsICJPdXRwdXQgZmlsZW5hbWUiLCBCQ01DTElfUEFSTV9TVFJJTkcsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiZm9ybWF0IiwgIk91dHB1dCBmb3JtYXQiLCBmb3JtYXRfZW51bV90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJpZ25vcmVfdmVyc2lvbiIsICJJZ25vcmUgdmVyc2lvbiBtaXNtYXRjaCIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyNlbmRpZgorfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcGxheWJhY2tfaW5pdCh2b2lkKQoreworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSktMSwgInVzZXJfYXBwbF9wbGF5YmFja18ldSIsIGkpOworICAgICAgICBwYl9jdHh0W2ldLmxvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19uYW1lLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcGxheWJhY2svYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzN2M2MQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcGxheWJhY2svYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfUExBWUJBQ0tfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfUExBWUJBQ0tfSF8KKworI2luY2x1ZGUgImJjbWNsaS5oIgorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcGxheWJhY2tfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfQkNNT0xUX1VTRVJfQVBQTF9QTEFZQkFDS19IXyAqLworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmYyZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjIHByb3RlY3Rpb24gc3dpdGNoaW5nIHVzZXIgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX3BzCisgICAgTU9EX1RZUEUgPSBsaWIKKyAgICBNT0RfREVQUyA9IGhvc3RfYXBpIGJjbV9ib2FyZAorICAgIHNyY3MgPSBiY21vbHRfdXNlcl9hcHBsX3BzLmMgXAorCSAgIGJjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmMgXAorCSAgIGJjbW9sdF91c2VyX2FwcGxfcHNfZ3Bvbi5jIFwKKwkgICBiY21vbHRfdXNlcl9hcHBsX3BzX2Vwb24uYyBcCisJICAgYmNtb2x0X3VzZXJfYXBwbF9wc194Z3Bvbi5jCisKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wcy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjOGQzMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wcy5jCkBAIC0wLDAgKzEsNzU2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZ19wYWNrLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wc19pbnRlcm5hbC5oIgorCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyNpbmNsdWRlIDxiY21vbHRfYm9hcmQuaD4KKyNlbmRpZgorCisjZGVmaW5lIFBTX0RFRkFVTFRfTUFYX1BBSVJTIDE2CisjZGVmaW5lIFBTX1RBU0tfTVNHX1FfU0laRSA2NAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9wc19wYWlyIHBhaXI7CisgICAgYmNtb3NfYm9vbCBpc192YWxpZDsKK30gcHNfcGFpcl9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19ib29sIGlzX3J1bm5pbmc7CisgICAgYmNtb2x0X3BzX2dsb2JhbF9jZmcgY2ZnOworICAgIHBzX3BhaXJfc3RhdGUgKnBhaXJzOworICAgIHVpbnQzMl90IHN3aXRjaF9zdGFydF90aW1lX3VzOworfSBwc19nbG9iYWxfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnIG9zX21zZzsKKyAgICBiY21vbHRfcHNfcG9uIHBvbjsKKyAgICBiY21vbHRfYXV0byAqaW5kOworfSBwc190YXNrX21zZzsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUFNfUE9OX01PREVfSU5WQUxJRCwKKyAgICBQU19QT05fTU9ERV9HUE9OLAorICAgIFBTX1BPTl9NT0RFX0VQT04sCisgICAgUFNfUE9OX01PREVfWEdQT04sCit9IHBzX3Bvbl9tb2RlOworCitzdGF0aWMgcHNfZ2xvYmFsX3N0YXRlIHBzX3N0YXRlID0ge307CitzdGF0aWMgYmNtb3NfbXV0ZXggcHNfbXV0ZXg7CitzdGF0aWMgYmNtb3NfdGFzayBwc190YXNrOworCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGRldl9sb2dfaWQgcHNfbG9nX2lkOworZGV2X2xvZ19pZCBwc19nZXRfbG9nX2lkKHZvaWQpCit7CisgICAgcmV0dXJuIHBzX2xvZ19pZDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgcHNfcG9uX2VxdWFsKGNvbnN0IGJjbW9sdF9wc19wb24gKmEsIGNvbnN0IGJjbW9sdF9wc19wb24gKmIpCit7CisgICAgcmV0dXJuIGEtPmRldmljZV9pZCA9PSBiLT5kZXZpY2VfaWQgJiYgYS0+cG9uX2lkID09IGItPnBvbl9pZDsKK30KKworc3RhdGljIGlubGluZSBiY21vc19ib29sIHBzX3BhaXJfZXF1YWwoY29uc3QgYmNtb2x0X3BzX3BhaXIgKmEsIGNvbnN0IGJjbW9sdF9wc19wYWlyICpiKQoreworICAgIHJldHVybiBwc19wb25fZXF1YWwoJmEtPnN0YW5kYnksICZiLT5zdGFuZGJ5KSAmJiBwc19wb25fZXF1YWwoJmEtPndvcmtpbmcsICZiLT53b3JraW5nKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9wc19wb25fcGFpcl9nZXQoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBiY21vbHRfcHNfcGFpciAqKnBhaXIpCit7CisgICAgdWludDE2X3QgaTsKKworICAgIGlmICghcHNfc3RhdGUuaXNfcnVubmluZykKKyAgICB7CisgICAgICAgICpwYWlyID0gTlVMTDsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBub3QgcnVubmluZ1xuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1NUQVRFOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlyczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBzX3N0YXRlLnBhaXJzW2ldLmlzX3ZhbGlkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHNfcG9uX2VxdWFsKHBvbiwgJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXIuc3RhbmRieSkgfHwKKyAgICAgICAgICAgICAgICBwc19wb25fZXF1YWwocG9uLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci53b3JraW5nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcGFpciA9ICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19pbml0X3Rhc2sodm9pZCkKK3sKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAidXNlcl9hcHBsX3BzIiwKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9VU0VSX0FQUExfUFMsCisgICAgICAgIC5jb3JlID0gQkNNT1NfQ1BVX0NPUkVfQU5ZLCAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICAgICAgLmluaXRfaGFuZGxlciA9IE5VTEwKKyAgICB9OworCisgICAgcmV0dXJuIGJjbW9zX3Rhc2tfY3JlYXRlKCZwc190YXNrLCAmdGFza19wYXJhbXMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9IHsgLm5hbWUgPSAidXNlcl9hcHBsX3BzIiwgLnNpemUgPSBQU19UQVNLX01TR19RX1NJWkUgfQorICAgIH07CisKKyAgICByZXR1cm4gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX1BTLCAmcHNfdGFzaywgJm1vZHVsZV9wYXJhbXMpOworfQorCitzdGF0aWMgcHNfcG9uX21vZGUgcHNfcG9uX21vZGVfZ2V0KGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsKKworICAgIGVyciA9IGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoZGV2LCAmc3lzdGVtX21vZGUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBQU19QT05fTU9ERV9JTlZBTElEOworICAgIH0KKyAgICBzd2l0Y2ggKHN5c3RlbV9tb2RlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g6CisgICAgICAgIHJldHVybiBQU19QT05fTU9ERV9HUE9OOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRzoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRzoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRzoKKyAgICAgICAgcmV0dXJuIFBTX1BPTl9NT0RFX0VQT047CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0c6CisgICAgICAgIHJldHVybiBQU19QT05fTU9ERV9YR1BPTjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUFNfUE9OX01PREVfSU5WQUxJRDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzX2hhbmRsZV9tc2coYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgcHNfdGFza19tc2cgKm1zZyA9IChwc190YXNrX21zZyAqKW9zX21zZzsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAvKiBwcm9jZXNzIHRoZSBpbmRpY2F0aW9uICovCisgICAgaWYgKG1zZy0+aW5kLT5oZHIub2JqX3R5cGUgPT0gQkNNT0xUX09CSl9JRF9ERVZJQ0UgfHwgbXNnLT5pbmQtPmhkci5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFQlVHKQorICAgIHsKKyAgICAgICAgLyogdGhlcmUncyBubyBuZWVkIHRvIG1pcnJvciBkZXZpY2UtbGV2ZWwgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwc19wb25fbW9kZV9nZXQobXNnLT5wb24uZGV2aWNlX2lkKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFBTX1BPTl9NT0RFX0dQT046CisgICAgICAgICAgICBlcnIgPSBwc19wcm9jZXNzX2luZF9ncG9uKCZtc2ctPnBvbiwgbXNnLT5pbmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFNfUE9OX01PREVfRVBPTjoKKyAgICAgICAgICAgIGVyciA9IHBzX3Byb2Nlc3NfaW5kX2Vwb24oJm1zZy0+cG9uLCBtc2ctPmluZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQU19QT05fTU9ERV9YR1BPTjoKKyAgICAgICAgICAgIGVyciA9IHBzX3Byb2Nlc3NfaW5kX3hncG9uKCZtc2ctPnBvbiwgbXNnLT5pbmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX1NUQVRFOyAvKiBub3QgYSBzdXBwb3J0ZWQgc3lzdGVtIG1vZGUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2F1dG8gKmluZCA9IG1zZy0+aW5kOworCisgICAgICAgIFBTX0VSUigiRXJyb3IgcHJvY2Vzc2luZyBpbmRpY2F0aW9uIChvYmpfdHlwZT0ldSwgc3ViZ3JvdXA9JXUpOiAlc1xuIiwgaW5kLT5oZHIub2JqX3R5cGUsIGluZC0+aGRyLnN1Ymdyb3VwLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisKKyAgICAvKiBmcmVlIHRoZSBjbG9uZWQgaW5kaWNhdGlvbiBzaW5jZSB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgaXQgKi8KKyAgICBiY21vbHRfbXNnX2ZyZWUoJm1zZy0+aW5kLT5oZHIpOworCisgICAgLyogZnJlZSB0aGUgaW50ZXJuYWwgT1MgbWVzc2FnZSBoYW5kbGUgKi8KKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3ZvaWQgYmNtb2x0X3BzX2FwcGxfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBwc19sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigidXNlcl9hcHBsX3BzIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisjZW5kaWYKKworICAgIGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmcHNfbXV0ZXgsIDAsIE5VTEwpOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKKyAgICBlcnIgPSBwc19pbml0X3Rhc2soKTsKKyAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgZXJyID0gcHNfaW5pdF9tb2R1bGUoKTsKKyAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfYXBwbF9zdGFydChjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqY2ZnKQoreworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKworICAgIGlmIChwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgICAgIFBTX0VSUigiUFMgYXBwbGljYXRpb24gYWxyZWFkeSBydW5uaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorCisgICAgcHNfc3RhdGUuY2ZnID0gKmNmZzsKKyAgICBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlycyA9IChwc19zdGF0ZS5jZmcubWF4X251bV9wYWlycyA9PSAwKSA/IFBTX0RFRkFVTFRfTUFYX1BBSVJTIDogcHNfc3RhdGUuY2ZnLm1heF9udW1fcGFpcnM7CisgICAgcHNfc3RhdGUucGFpcnMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpwc19zdGF0ZS5wYWlycykgKiBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlycyk7CisgICAgaWYgKHBzX3N0YXRlLnBhaXJzID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTUVNWkVST19TVFJVQ1QoJnBzX3N0YXRlKTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgICAgIFBTX0VSUigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgcHNfc3RhdGUuaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICBQU19JTkZPKCJQUyBhcHBsaWNhdGlvbiBzdGFydGVkXG4iKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2FwcGxfc3RvcCh2b2lkKQoreworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKworICAgIGlmICghcHNfc3RhdGUuaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorCisgICAgcHNfc3RhdGUuaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworCisgICAgYmNtb3NfZnJlZShwc19zdGF0ZS5wYWlycyk7CisgICAgQkNNX01FTVpFUk9fU1RSVUNUKCZwc19zdGF0ZSk7CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICBQU19JTkZPKCJQUyBhcHBsaWNhdGlvbiBzdG9wcGVkXG4iKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfYm9vbCBiY21vbHRfcHNfYXBwbF9pc19ydW5uaW5nKHZvaWQpCit7CisgICAgYmNtb3NfYm9vbCByZXQ7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworICAgIHJldCA9IHBzX3N0YXRlLmlzX3J1bm5pbmc7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIHJldDsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKworICAgIGlmICghcHNfc3RhdGUuaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIFBTX0VSUigiUFMgYXBwbGljYXRpb24gbm90IHJ1bm5pbmdcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX1NUQVRFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqY2ZnID0gcHNfc3RhdGUuY2ZnOworICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgIH0KKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19nbG9iYWxfY2ZnX3VwZGF0ZShjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqY2ZnKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisKKyAgICBpZiAoIXBzX3N0YXRlLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2ZnLT5tYXhfbnVtX3BhaXJzICE9IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJjYW5ub3QgY2hhbmdlIG1heCBudW1iZXIgb2YgcHJvdGVjdGVkIHBhaXJzIHdoaWxlIHJ1bm5pbmdcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBzX3N0YXRlLmNmZyA9ICpjZmc7CisgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3BhaXJzX2dldCh1aW50MTZfdCBhcnJheV9sZW4sIGJjbW9sdF9wc19wYWlyICpwYWlycywgdWludDE2X3QgKm51bV93cml0dGVuKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICB1aW50MTZfdCBpOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBub3QgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpudW1fd3JpdHRlbiA9IDA7CisgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCpudW1fd3JpdHRlbiA9PSBhcnJheV9sZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQU19FUlIoImFycmF5IHNpemUgdG9vIHNtYWxsIHRvIGNvbGxlY3QgYWxsIHBhaXJzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFpcnNbKm51bV93cml0dGVuXSA9IHBzX3N0YXRlLnBhaXJzW2ldLnBhaXI7CisgICAgICAgICAgICAgICAgKCpudW1fd3JpdHRlbikrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wYWlyX2FkZChjb25zdCBiY21vbHRfcHNfcGFpciAqcGFpcikKK3sKKyAgICB1aW50MTZfdCBpOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKworICAgIGlmICghcHNfc3RhdGUuaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIFBTX0VSUigiUFMgYXBwbGljYXRpb24gbm90IHJ1bm5pbmdcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX1NUQVRFOworICAgIH0KKyAgICBlbHNlIGlmIChwc19wb25fZXF1YWwoJnBhaXItPndvcmtpbmcsICZwYWlyLT5zdGFuZGJ5KSkKKyAgICB7CisgICAgICAgIFBTX0VSUigiQSBQT04gY2Fubm90IHByb3RlY3QgaXRzZWxmXG4iKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHNfc3RhdGUuY2ZnLm1heF9udW1fcGFpcnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBzX3N0YXRlLnBhaXJzW2ldLmlzX3ZhbGlkICYmCisgICAgICAgICAgICAgICAgKHBzX3Bvbl9lcXVhbCgmcGFpci0+d29ya2luZywgJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXIud29ya2luZykgfHwKKyAgICAgICAgICAgICAgICBwc19wb25fZXF1YWwoJnBhaXItPndvcmtpbmcsICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyLnN0YW5kYnkpIHx8CisgICAgICAgICAgICAgICAgcHNfcG9uX2VxdWFsKCZwYWlyLT5zdGFuZGJ5LCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci53b3JraW5nKSB8fAorICAgICAgICAgICAgICAgIHBzX3Bvbl9lcXVhbCgmcGFpci0+c3RhbmRieSwgJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXIuc3RhbmRieSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBTX0VSUigiT25lIG9mIHRoZSBQT05zIHdhcyBhbHJlYWR5IHByZXNlbnQgaW4gYW4gZXhpc3RpbmcgcGFpclxuIik7CisgICAgICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9BTFJFQURZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX05PUkVTOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBzX3N0YXRlLnBhaXJzW2ldLnBhaXIgPSAqcGFpcjsKKyAgICAgICAgICAgICAgICAgICAgcHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IEJDTV9FUlJfTk9SRVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFNfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSBhdmFpbGFibGUgdG8gYWRkIHBhaXJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Bvbl9yZW1vdmUoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIHVpbnQxNl90IGk7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBub3QgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVyciA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQgJiYKKyAgICAgICAgICAgICAgICAocHNfcG9uX2VxdWFsKHBvbiwgJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXIud29ya2luZykgfHwKKyAgICAgICAgICAgICAgICBwc19wb25fZXF1YWwocG9uLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci5zdGFuZGJ5KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9OT0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgUFNfRVJSKCJTcGVjaWZpZWQgUE9OIG5vdCBmb3VuZFxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfcG9uX3N0YXRlX2dldChjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGJjbW9sdF9wc19wb25fc3RhdGUgKnN0YXRlLCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfcGFpciAqcGFpcjsKKworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKyAgICBlcnIgPSBiY21vbHRfcHNfcG9uX3BhaXJfZ2V0KHBvbiwgJnBhaXIpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgaWYgKHBzX3Bvbl9lcXVhbChwb24sICZwYWlyLT5zdGFuZGJ5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gQkNNT0xUX1BTX1BPTl9TVEFURV9TVEFOREJZOworICAgICAgICAgICAgKnBhcnRuZXIgPSBwYWlyLT53b3JraW5nOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gQkNNT0xUX1BTX1BPTl9TVEFURV9XT1JLSU5HOworICAgICAgICAgICAgKnBhcnRuZXIgPSBwYWlyLT5zdGFuZGJ5OworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlIGlmIChlcnIgPT0gQkNNX0VSUl9OT0VOVCkKKyAgICB7CisgICAgICAgICpzdGF0ZSA9IEJDTU9MVF9QU19QT05fU1RBVEVfVU5BU1NPQ0lBVEVEOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wcm9jZXNzX2luZChjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGJjbW9sdF9hdXRvICppbmQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9tc2cgKmluZF9jbG9uZSA9IE5VTEw7CisKKyAgICBpZiAoIWJjbW9sdF9wc19hcHBsX2lzX3J1bm5pbmcoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIE1ha2UgYSBjb3B5IG9mIGFsbCBpbmRpY2F0aW9ucyByZWNlaXZlZCBzbyB0aGV5IGNhbiBiZSBoYW5kbGVkIGxhdGVyIGFzeW5jaHJvbm91c2x5LiBXZSBkb24ndCB2YWxpZGF0ZSBQT04gc3RhdGUKKyAgICAgKiBoZXJlIHNpbmNlIGl0IG1pZ2h0IGNoYW5nZSBiZWZvcmUgd2UgZ2V0IGFyb3VuZCB0byBoYW5kbGluZyBpdC4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvdWxkIGJlIG9wdGltaXplZCB0byBmaWx0ZXIgb3V0IGluZGljYXRpb25zIHRoYXQgYXJlbid0IHJlbGV2YW50IGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBiZWZvcmUKKyAgICAgKiBjb3B5aW5nIHRoZW0sIGJ1dCB0aGlzIGlzIGxlZnQgb3V0IGZvciBzaW1wbGljaXR5LiAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfY2xvbmUoJmluZF9jbG9uZSwgJmluZC0+aGRyKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBQU19FUlIoIkluZGljYXRpb24gY2xvbmUgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogc2VuZCB0aGlzIGluZGljYXRpb24gdG8gdGhlIGludGVybmFsIHRhc2sncyBtZXNzYWdlIHF1ZXVlIHRvIGJlIHByb2Nlc3NlZCAqLworICAgIHBzX3Rhc2tfbXNnICptc2cgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCptc2cpKTsKKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgeworICAgICAgICBQU19FUlIoIk1lc3NhZ2UgY2FsbG9jIGZhaWxlZFxuIik7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShpbmRfY2xvbmUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBtc2ctPm9zX21zZy5oYW5kbGVyID0gcHNfaGFuZGxlX21zZzsKKyAgICBtc2ctPm9zX21zZy5yZWxlYXNlID0gYmNtb2x0X29zX21zZ19yZWxlYXNlX2NiOworICAgIG1zZy0+cG9uID0gKnBvbjsKKyAgICBtc2ctPmluZCA9IChiY21vbHRfYXV0byAqKWluZF9jbG9uZTsKKworICAgIGVyciA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX1BTLCAmbXNnLT5vc19tc2csIDApOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIFBTX0VSUigiTWVzc2FnZSBzZW5kIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3BzX2NoYW5nZV9wb25fdG9fc3RhbmRieShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgUFNfSU5GTygiU3dpdGNoaW5nIFBPTiA8JWQ6JWQ+IHdvcmtpbmctPnN0YW5kYnlcbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCk7CisgICAgc3dpdGNoIChwc19wb25fbW9kZV9nZXQocG9uLT5kZXZpY2VfaWQpKQorICAgIHsKKyAgICBjYXNlIFBTX1BPTl9NT0RFX0dQT046CisgICAgICAgIGVyciA9IHBzX21vdmVfdG9fc3RhbmRieV9ncG9uKHBvbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFNfUE9OX01PREVfRVBPTjoKKyAgICAgICAgZXJyID0gcHNfbW92ZV90b19zdGFuZGJ5X2Vwb24ocG9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQU19QT05fTU9ERV9YR1BPTjoKKyAgICAgICAgZXJyID0gcHNfbW92ZV90b19zdGFuZGJ5X3hncG9uKHBvbik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7IC8qIG5vdCBhIHN1cHBvcnRlZCBzeXN0ZW0gbW9kZSAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCI8JWQ6JWQ+IHdvcmtpbmctPnN0YW5kYnkgQVBJIGZhaWxlZDogJXNcbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b193b3JraW5nKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBQU19JTkZPKCJTd2l0Y2hpbmcgUE9OIDwlZDolZD4gc3RhbmRieS0+d29ya2luZ1xuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKyAgICBzd2l0Y2ggKHBzX3Bvbl9tb2RlX2dldChwb24tPmRldmljZV9pZCkpCisgICAgeworICAgIGNhc2UgUFNfUE9OX01PREVfR1BPTjoKKyAgICAgICAgZXJyID0gcHNfbW92ZV90b193b3JraW5nX2dwb24ocG9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQU19QT05fTU9ERV9FUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3dvcmtpbmdfZXBvbihwb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBTX1BPTl9NT0RFX1hHUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3dvcmtpbmdfeGdwb24ocG9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsgLyogbm90IGEgc3VwcG9ydGVkIHN5c3RlbSBtb2RlICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBQU19FUlIoIjwlZDolZD4gc3RhbmRieS0+d29ya2luZyBBUEkgZmFpbGVkOiAlc1xuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9wc19kaXNhYmxlX3R4X29wdGljcyhjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgUFNfSU5GTygiRGlzYWJsaW5nIFRSWCBmb3IgUE9OIDwlZDolZDolZD5cbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCwgcG9uLT50cmFuc2NlaXZlcl9pZCk7CisKKyAgICAvKiBUaGlzIGRpc2FibGVzIHRoZSBUWCBvcHRpY2FsIGNoYW5uZWwgb24gYSBnaXZlbiBQT04gcG9ydCBvbiB0aGUgQkNNNjg2MjAgU1ZLIGJvYXJkLgorICAgICAgIEZvciBvdGhlciBib2FyZHMsIHRoaXMgbXVzdCBiZSBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBib2FyZCBkZXNpZ24uICovCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICByZXR1cm4gYmNtX2JvYXJkX3RyeF9lbmFibGUocG9uLT50cmFuc2NlaXZlcl9pZCwgQkNNT1NfRkFMU0UpOworI2Vsc2UKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyNlbmRpZgorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3BzX2VuYWJsZV90eF9vcHRpY3MoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgYmNtb3NfZXJybm8gcmV0OworI2VuZGlmCisKKyAgICBQU19JTkZPKCJFbmFibGluZyBUUlggZm9yIFBPTiA8JWQ6JWQ6JWQ+XG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQsIHBvbi0+dHJhbnNjZWl2ZXJfaWQpOworCisgICAgLyogVGhpcyBlbmFibGVzIHRoZSBUWCBvcHRpY2FsIGNoYW5uZWwgb24gYSBnaXZlbiBQT04gcG9ydCBvbiB0aGUgQkNNNjg2MjAgU1ZLIGJvYXJkLgorICAgICAgIEZvciBvdGhlciBib2FyZHMsIHRoaXMgbXVzdCBiZSBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBib2FyZCBkZXNpZ24uICovCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICByZXQgPSBiY21fYm9hcmRfdHJ4X2VuYWJsZShwb24tPnRyYW5zY2VpdmVyX2lkLCBCQ01PU19UUlVFKTsKKyAgICBiY21vc191c2xlZXAocHNfc3RhdGUuY2ZnLnRyeF93YXJtaW5nX2RlbGF5KTsKKyAgICByZXR1cm4gcmV0OworI2Vsc2UKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyNlbmRpZgorfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfc3dpdGNoX3BlcmZvcm0oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfcGFpciAqcGFpcjsKKyAgICBiY21vbHRfcHNfcG9uIHRlbXBfcG9uOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworICAgIHBzX3N0YXRlLnN3aXRjaF9zdGFydF90aW1lX3VzID0gYmNtb3NfdGltZXN0YW1wKCk7CisgICAgZXJyID0gYmNtb2x0X3BzX3Bvbl9wYWlyX2dldChwb24sICZwYWlyKTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiAocHNfc3RhdGUuY2ZnLnN3aXRjaF9zZXF1ZW5jZSA9PSBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1RSWF9GSVJTVCkKKyAgICB7CisgICAgICAgIC8qIHN0ZXAgMTogZGlzYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2YgdGhlIHdvcmtpbmcgUE9OICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19kaXNhYmxlX3R4X29wdGljcygmcGFpci0+d29ya2luZyk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RlcCAyOiBlbmFibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHRoZSBzdGFuZGJ5IFBPTiAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfZW5hYmxlX3R4X29wdGljcygmcGFpci0+c3RhbmRieSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RlcCAzOiBjaGFuZ2UgdGhlIHN0YW5kYnkgUE9OIHN0YXRlIHRvIHdvcmtpbmcgKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X3BzX2NoYW5nZV9wb25fdG9fd29ya2luZygmcGFpci0+c3RhbmRieSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RlcCA0OiBjaGFuZ2UgdGhlIHdvcmtpbmcgUE9OIHN0YXRlIHRvIHN0YW5kYnkgKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X3BzX2NoYW5nZV9wb25fdG9fc3RhbmRieSgmcGFpci0+d29ya2luZyk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogcHNfc3RhdGUuY2ZnLnN3aXRjaF9zZXF1ZW5jZSA9PSBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1NUQU5EQVJEICovCisgICAgeworICAgICAgICAvKiBzdGVwIDE6IGNoYW5nZSB0aGUgd29ya2luZyBQT04gc3RhdGUgdG8gc3RhbmRieSAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b19zdGFuZGJ5KCZwYWlyLT53b3JraW5nKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdGVwIDI6IGRpc2FibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHRoZSB3b3JraW5nIFBPTiAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfZGlzYWJsZV90eF9vcHRpY3MoJnBhaXItPndvcmtpbmcpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0ZXAgMzogZW5hYmxlIG9wdGljYWwgVFggY2hhbm5lbCBvZiB0aGUgc3RhbmRieSBQT04gKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X3BzX2VuYWJsZV90eF9vcHRpY3MoJnBhaXItPnN0YW5kYnkpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0ZXAgNDogY2hhbmdlIHRoZSBzdGFuZGJ5IFBPTiBzdGF0ZSB0byB3b3JraW5nICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19jaGFuZ2VfcG9uX3RvX3dvcmtpbmcoJnBhaXItPnN0YW5kYnkpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0ZXAgNTogdXBkYXRlIGludGVybmFsIGRhdGFiYXNlIGZvciBuZXcgUE9OIHN0YXRlcyAqLworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKyAgICB0ZW1wX3BvbiA9IHBhaXItPndvcmtpbmc7CisgICAgcGFpci0+d29ya2luZyA9IHBhaXItPnN0YW5kYnk7CisgICAgcGFpci0+c3RhbmRieSA9IHRlbXBfcG9uOworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworCitleGl0OgorICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiPCVkOiVkPiBzd2l0Y2hvdmVyIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5ICg8JWQ6JWQ+IGlzIG5vdyBzdGFuZGJ5KVxuIiwKKyAgICAgICAgICAgIHBhaXItPndvcmtpbmcuZGV2aWNlX2lkLAorICAgICAgICAgICAgcGFpci0+d29ya2luZy5wb25faWQsCisgICAgICAgICAgICBwYWlyLT5zdGFuZGJ5LmRldmljZV9pZCwKKyAgICAgICAgICAgIHBhaXItPnN0YW5kYnkucG9uX2lkKTsKKyAgICB9CisgICAgZWxzZSBpZiAocGFpcikKKyAgICB7CisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiPCVkOiVkPiBzd2l0Y2hvdmVyIGVuY291bnRlcmVkIGFuIGVycm9yOiAlc1xuIiwKKyAgICAgICAgICAgIHBhaXItPndvcmtpbmcuZGV2aWNlX2lkLAorICAgICAgICAgICAgcGFpci0+d29ya2luZy5wb25faWQsCisgICAgICAgICAgICBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit1aW50MzJfdCBwc19nZXRfbGFzdF9zd2l0Y2hfc3RhcnRfdGltZV91cyh2b2lkKQoreworICAgIHVpbnQzMl90IHJldDsKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisgICAgcmV0ID0gcHNfc3RhdGUuc3dpdGNoX3N0YXJ0X3RpbWVfdXM7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wcy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyMjRiZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wcy5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfUFNfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfUFNfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKworLyoqIENvbmRpdGlvbnMgdGhhdCBjYW4gY2F1c2UgYSBwcm90ZWN0aW9uIHN3aXRjaCB0byBiZSBwZXJmb3JtZWQuICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9MT1MsICAgIC8qKjwgU3dpdGNoIHdoZW4gTG9TIGFsYXJtIGlzIHJlY2VpdmVkIGZvciBhIHdvcmtpbmcgUE9OLiAqLworICAgIEJDTU9MVF9QU19TV0lUQ0hfQ09ORElUSU9OX01BTlVBTCwgLyoqPCBEbyBub3Qgc3dpdGNoIGF1dG9tYXRpY2FsbHkuICovCit9IGJjbW9sdF9wc19zd2l0Y2hfY29uZGl0aW9uOworCisvKiogSG93IHByb3Zpc2lvbmluZyBzaG91bGQgYmUgbWlycm9yZWQgZnJvbSB3b3JraW5nIHRvIHN0YW5kYnkuICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUFNfTUlSUk9SX01PREVfQVVUTywgLyoqPCBXaGVuZXZlciBhbiBpbmRpY2F0aW9uIGlzIHJlY2VpdmVkIG9uIHRoZSB3b3JraW5nIFBPTiwgbWlycm9yIGFsbCBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHRvIHN0YW5kYnkgUE9OLiAqLworICAgIEJDTU9MVF9QU19NSVJST1JfTU9ERV9OT05FLCAvKio8IERvIG5vdCBhdXRvbWF0aWNhbGx5IG1pcnJvciBhbnkgcHJvdmlzaW9uaW5nIGZyb20gd29ya2luZyB0byBzdGFuZGJ5LiAqLworfSBiY21vbHRfcHNfbWlycm9yX21vZGU7CisKKy8qKiBXaGF0IHRoZSBvcmRlciBvZiBvcGVyYXRpb25zIHNob3VsZCBiZSB3aGVuIHBlcmZvcm1pbmcgYSBzd2l0Y2hvdmVyLiAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1BTX1NXSVRDSF9TRVFVRU5DRV9TVEFOREFSRCwgIC8qKjwgInN0YW5kYXJkIiBvcmRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBDaGFuZ2UgdGhlIHdvcmtpbmcgUE9OIHN0YXRlIHRvIHN0YW5kYnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRGlzYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2Ygd29ya2luZyBQT04uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogRW5hYmxlIG9wdGljYWwgVFggY2hhbm5lbCBvZiBzdGFuZGJ5IFBPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OiBDaGFuZ2UgdGhlIHN0YW5kYnkgUE9OIHN0YXRlIHRvIHdvcmtpbmcuICovCisgICAgQkNNT0xUX1BTX1NXSVRDSF9TRVFVRU5DRV9UUlhfRklSU1QsIC8qKjwgUGVyZm9ybSB0cmFuc2NlaXZlciBlbmFibGUvZGlzYWJsZSBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBEaXNhYmxlIG9wdGljYWwgVFggY2hhbm5lbCBvZiB3b3JraW5nIFBPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBFbmFibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHN0YW5kYnkgUE9OLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6IENoYW5nZSB0aGUgc3RhbmRieSBQT04gc3RhdGUgdG8gd29ya2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OiBDaGFuZ2UgdGhlIHdvcmtpbmcgUE9OIHN0YXRlIHRvIHN0YW5kYnkuICovCit9IGJjbW9sdF9wc19zd2l0Y2hfc2VxdWVuY2U7CisKKy8qKiBHbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MTZfdCBtYXhfbnVtX3BhaXJzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgcHJvdGVjdGVkIHBhaXJzIHN1cHBvcnRlZC4gKi8KKyAgICBiY21vbHRfcHNfc3dpdGNoX2NvbmRpdGlvbiBzd2l0Y2hfY29uZGl0aW9uOyAgIC8qKjwgQ29uZGl0aW9uIHRoYXQgc2hvdWxkIGNhdXNlIGEgc3dpdGNob3Zlci4gKi8KKyAgICBiY21vbHRfcHNfc3dpdGNoX3NlcXVlbmNlIHN3aXRjaF9zZXF1ZW5jZTsgICAgIC8qKjwgT3JkZXIgb2Ygb3BlcmF0aW9ucyB3aGVuIHBlcmZvcm1pbmcgYSBzd2l0Y2hvdmVyLiAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBvbmx5IHVzZWQgaW4gR1BPTiBtb2RlLiAqLworICAgIGJjbW9sdF9wc19taXJyb3JfbW9kZSBtaXJyb3JfbW9kZTsgICAgICAgICAgICAgLyoqPCBIb3cgcHJvdmlzaW9uaW5nIHNob3VsZCBiZSBtaXJyb3JlZCBmcm9tIHdvcmtpbmcgdG8gc3RhbmRieS4gKi8KKyAgICBiY21vc19ib29sIG1pcnJvcl9tYWNfZW50cmllczsgICAgICAgICAgICAgICAgIC8qKjwgSWYgVFJVRSwgbWlycm9yIGFsbCBNQUMgbGVhcm5pbmcgZW50cmllcyB0byB0aGUgc3RhbmRieSBQT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBsZWFybmluZyBpbmRpY2F0aW9ucyBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgd29ya2luZyBQT04uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBhbHNvIGNhdXNlIGVudHJpZXMgdG8gYmUgYXV0b21hdGljYWxseSBkZWxldGVkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdpbmcgaW5kaWNhdGlvbnMgYXJlIHJlY2VpdmVkIGFuZCBtb3ZlZCB3aGVuIE1BQyBtb3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRpb25zIGFyZSByZWNlaXZlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRpY19tYWNfZW50cmllczsgICAgICAgICAgICAgICAgIC8qKjwgSWYgVFJVRSwgd2hlbiBlbnRyaWVzIGFyZSBtaXJyb3JlZCB0byB0aGUgc3RhbmRieSBQT04sIHRyZWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW0gYXMgInN0YXRpYyIgKG5vdCBhZ2VkKS4gKi8KKyAgICB1aW50MzJfdCB0cnhfd2FybWluZ19kZWxheTsgICAgICAgICAgICAgICAgICAgIC8qKjwgRGVsYXkgKGluIHVzZWMpIHRvIHdhaXQgYWZ0ZXIgVFJYIGVuYWJsZSwgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmFudGVlIHRoYXQgUE9QVVAgUExPQU1zIGFyZSBjb3JyZWN0bHkgc2VlbiBieSBPTlVzLiAqLworfSBiY21vbHRfcHNfZ2xvYmFsX2NmZzsKKworLyoqIEEgc2luZ2xlIFBPTiBvbiBhbiBPTFQgZGV2aWNlIC0gaGFsZiBvZiBhIHByb3RlY3RlZCBwYWlyLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGJjbW9sdF9wb25fbmkgcG9uX2lkOworICAgIGJjbW9sdF9wb25fbmkgdHJhbnNjZWl2ZXJfaWQ7Cit9IGJjbW9sdF9wc19wb247CisKKy8qKiBBIHByb3RlY3RlZCBwYWlyIG9mIFBPTnMsIG9uIHRoZSBzYW1lIE9MVCBkZXZpY2Ugb3IgZGlmZmVyZW50IGRldmljZXMuICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9wc19wb24gd29ya2luZzsKKyAgICBiY21vbHRfcHNfcG9uIHN0YW5kYnk7Cit9IGJjbW9sdF9wc19wYWlyOworCisvKiogUG9zc2libGUgc3RhdGVzIGZvciBhIHNpbmdsZSBQT04gZnJvbSBhIHByb3RlY3Rpb24gc3dpdGNoaW5nIHBvaW50LW9mLXZpZXcuICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUFNfUE9OX1NUQVRFX1VOQVNTT0NJQVRFRCwgLyoqPCBUaGUgUE9OIGlzIG5vdCBwYXJ0IG9mIGEgcHJvdGVjdGVkIHBhaXIuICovCisgICAgQkNNT0xUX1BTX1BPTl9TVEFURV9XT1JLSU5HLCAgICAgIC8qKjwgVGhlIFBPTiBpcyBkZXNpZ25hdGVkIGFzIHdvcmtpbmcgd2l0aCB0aGUgVFJYIGVuYWJsZWQgd2hpbGUgYWN0aXZlLiAqLworICAgIEJDTU9MVF9QU19QT05fU1RBVEVfU1RBTkRCWSwgICAgICAvKio8IFRoZSBQT04gaXMgZGVzaWduYXRlZCBhcyBzdGFuZGJ5IHdpdGggdGhlIFRSWCBkaXNhYmxlZCB3aGlsZSBhY3RpdmUuICovCit9IGJjbW9sdF9wc19wb25fc3RhdGU7CisKKy8qKiBJbml0aWFsaXplIHRoZSBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbiAodGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzIHBhcnQgb2YgYXBwbGljYXRpb24gc3RhcnR1cCkuICovCit2b2lkIGJjbW9sdF9wc19hcHBsX2luaXQodm9pZCk7CisKKy8qKiBTdGFydCB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24gKHRoaXMgaXMgZ2xvYmFsIGZvciB0aGUgZW50aXJlIHN5c3RlbSkuCisgKgorICogXHBhcmFtW2luXSBjZmcgR2xvYmFsIHByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbmZpZ3VyYXRpb24uCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2FwcGxfc3RhcnQoY29uc3QgYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmNmZyk7CisKKy8qKiBTdG9wIHRoZSBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbiAodGhpcyBpcyBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgc3lzdGVtKS4KKyAqCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3RvcHBlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2FwcGxfc3RvcCh2b2lkKTsKKworLyoqIFF1ZXJ5IHdoZXRoZXIgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBydW5uaW5nLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEJDTU9TX1RSVUUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHNfYXBwbF9pc19ydW5uaW5nKHZvaWQpOworCisvKiogR2V0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBydW5uaW5nIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uICh0aGlzIGlzIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBzeXN0ZW0pLgorICoKKyAqIFxwYXJhbVtvdXRdIGNmZyBHbG9iYWwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4KKyAqIFxyZXR1cm4gICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBjb25maWd1cmF0aW9uIHdhcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19nbG9iYWxfY2ZnX2dldChiY21vbHRfcHNfZ2xvYmFsX2NmZyAqY2ZnKTsKKworLyoqIENoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcnVubmluZyBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbiAodGhpcyBpcyBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgc3lzdGVtKS4KKyAqCisgKiBccGFyYW1baW5dIGNmZyBHbG9iYWwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19nbG9iYWxfY2ZnX3VwZGF0ZShjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqY2ZnKTsKKworLyoqIEdldCB0aGUgbGlzdCBvZiBhbGwgcHJvdGVjdGVkIHBhaXJzIGN1cnJlbnRseSB0cmFja2VkIGJ5IHRoZSBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbi4KKyAqCisgKiBccGFyYW1baW5dICBhcnJheV9sZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBwYWlycyBhcnJheS4KKyAqIFxwYXJhbVtvdXRdIHBhaXJzICAgICAgIEFuIGFycmF5IG9mIHByb3RlY3RlZCBwYWlycyB0byBmaWxsLgorICogXHBhcmFtW291dF0gbnVtX3dyaXR0ZW4gVGhlIG51bWJlciBvZiBwYWlycyB3cml0dGVuIHRvIHRoZSBhcnJheS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFycmF5IHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfcGFpcnNfZ2V0KHVpbnQxNl90IGFycmF5X2xlbiwgYmNtb2x0X3BzX3BhaXIgKnBhaXJzLCB1aW50MTZfdCAqbnVtX3dyaXR0ZW4pOworCisvKiogQWRkIGEgcHJvdGVjdGVkIHBhaXIgdG8gdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGRhdGFiYXNlLgorICoKKyAqIEFmdGVyIHRoaXMgaGFzIGJlZW4gY2FsbGVkLCBwcm92aXNpb25pbmcgd2lsbCBiZSBtaXJyb3JlZCBmcm9tIHRoZSB3b3JraW5nIFBPTiB0byB0aGUgc3RhbmRieSBQT04gYWNjb3JkaW5nIHRvIHRoZQorICogbWlycm9yX21vZGUgZ2xvYmFsIHBhcmFtZXRlciwgYW5kIGEgc3dpdGNoIHdpbGwgYmUgcGVyZm9ybWVkIHBlciB0aGUgc3dpdGNoX2NvbmRpdGlvbiBnbG9iYWwgcGFyYW1ldGVyLgorICoKKyAqIFxwYXJhbVtpbl0gcGFpciBBIHBhaXIgb2YgUE9OcyB0byBhZGQgLSB0aGV5IGNhbiBiZSBvbiB0aGUgc2FtZSBPTFQgZGV2aWNlIG9yIGRpZmZlcmVudCBkZXZpY2VzLgorICogXHJldHVybiAgICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIHBhaXIgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfcGFpcl9hZGQoY29uc3QgYmNtb2x0X3BzX3BhaXIgKnBhaXIpOworCisvKiogUmVtb3ZlIHRoZSBwcm90ZWN0ZWQgcGFpciBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgUE9OIGZyb20gdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGRhdGFiYXNlLgorKgorKiBccGFyYW1baW5dIHBvbiBBIFBPTiB0aGF0IGlzIGEgbWVtYmVyIG9mIGEgcHJvdGVjdGlvbiBwYWlyLgorKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBQT04gd2FzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Bvbl9yZW1vdmUoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKKworLyoqIFF1ZXJ5IGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIHByb3RlY3RlZCBQT04uCisqCisqIFxwYXJhbVtpbl0gIHBvbiAgICAgVGhlIFBPTiB0byBxdWVyeS4KKyogXHBhcmFtW291dF0gc3RhdGUgICBUaGUgcHJvdGVjdGlvbiBzdGF0ZSBvZiB0aGUgUE9OIChlLmcuIHdvcmtpbmcvc3RhbmRieSkuCisqIFxwYXJhbVtvdXRdIHBhcnRuZXIgSWYgdGhpcyBQT04gaXMgcHJvdGVjdGVkLCB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgcHJvdGVjdGVkIHBhaXIuCisqIFxyZXR1cm4gICAgICAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgUE9OIHdhcyBxdWVyaWVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wb25fc3RhdGVfZ2V0KGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgYmNtb2x0X3BzX3Bvbl9zdGF0ZSAqc3RhdGUsIGJjbW9sdF9wc19wb24gKnBhcnRuZXIpOworCisvKiogUHJvY2VzcyBhbiBpbmRpY2F0aW9uIHJlY2VpdmVkIGJ5IHRoZSB3b3JraW5nIFBPTi4KKyAqCisgKiBUaGUgYWN0aW9uIHRha2VuIHdpbGwgZGVwZW5kIG9uIHRoZSBvYmplY3QvaW5kaWNhdGlvbiB0eXBlIGFuZCB0aGUgbWlycm9yX21vZGUgZ2xvYmFsIHBhcmFtZXRlci4KKyAqIElmIHRoZSBhcHBsaWNhdGlvbiBpc24ndCBydW5uaW5nLCB0aGUgc3VwcGxpZWQgUE9OIGlzbid0IGluIGEgcHJvdGVjdGVkIHdvcmtpbmcgc3RhdGUgb3IgdGhlIGluZGljYXRpb24gaXNuJ3QKKyAqIHJlbGV2YW50IGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZywgdGhlIGluZGljYXRpb24gd2lsbCBiZSBpZ25vcmVkLgorICoKKyAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZnJlZSB0aGUgaW5kaWNhdGlvbi4KKyAqIFRoZSBjYWxsZXIgbXVzdCBmcmVlIGl0IHVzaW5nIGJjbW9zX21zZ19mcmVlKCkgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gcG9uIFRoZSBQT04gb24gd2hpY2ggdGhlIGluZGljYXRpb24gd2FzIHJlY2VpdmVkLgorICogXHBhcmFtW2luXSBpbmQgVGhlIGluZGljYXRpb24gdGhhdCB3YXMgcmVjZWl2ZWQuCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBpbmRpY2F0aW9uIHdhcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5IG9yIGlnbm9yZWQsIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Byb2Nlc3NfaW5kKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgYmNtb2x0X2F1dG8gKmluZCk7CisKKy8qKiBJbW1lZGlhdGVseSBwZXJmb3JtIGEgcHJvdGVjdGlvbiBzd2l0Y2ggb24gdGhlIGdpdmVuIFBPTiwgd2hpY2ggbXVzdCBiZWxvbmcgdG8gYSBwcm90ZWN0ZWQgcGFpci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIEJDTU9MVF9QU19TV0lUQ0hfQ09ORElUSU9OX01BTlVBTCBzd2l0Y2ggY29uZGl0aW9uLCBvciBmb3IKKyAqIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHdhaXQgZm9yIHRoZSBzd2l0Y2ggdG8gY29tcGxldGUgLSBpdCBtZXJlbHkganVzdCBjb25maWd1cmVzIHRoZSB0cmFuc2NlaXZlcnMgYW5kIGluaXRpYXRlcworICogdGhlIFBPTiBzdGF0ZSB0cmFuc2l0aW9ucy4gIFRvIHdhaXQgZm9yIGNvbXBsZXRpb24sIHRoZSBob3N0IG11c3Qgd2FpdCBmb3IgdGhlIFBPTiBOSSBzdGF0ZSBjaGFuZ2UgY29tcGxldGUgb3IKKyAqICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIgaW5kaWNhdGlvbnMgdG8gYmUgcmVjZWl2ZWQuCisgKgorICogXHBhcmFtW2luXSBwYWlyIFRoZSBQT04gb24gd2hpY2ggdG8gcGVyZm9ybSB0aGUgc3dpdGNoIChlaXRoZXIgdGhlIHdvcmtpbmcgb3Igc3RhbmRieSBQT04gb2YgYSBwcm90ZWN0ZWQgcGFpcikuCisgKiBccmV0dXJuICAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgc3dpdGNoIHdhcyBzdWNjZXNzZnVsLCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19zd2l0Y2hfcGVyZm9ybShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzViZDAwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5jCkBAIC0wLDAgKzEsMjkxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHMuaCIKKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtOworICAgIGJjbW9sdF9wc19nbG9iYWxfY2ZnIGNmZyA9IHt9OworCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9wYWlycyIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcubWF4X251bV9wYWlycyA9ICh1aW50MTZfdClwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN3aXRjaF9jb25kaXRpb24iKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2ZnLnN3aXRjaF9jb25kaXRpb24gPSAoYmNtb2x0X3BzX3N3aXRjaF9jb25kaXRpb24pcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzd2l0Y2hfc2VxdWVuY2UiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2ZnLnN3aXRjaF9zZXF1ZW5jZSA9IChiY21vbHRfcHNfc3dpdGNoX3NlcXVlbmNlKXBhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWlycm9yX21vZGUiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2ZnLm1pcnJvcl9tb2RlID0gKGJjbW9sdF9wc19taXJyb3JfbW9kZSlwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pcnJvcl9tYWNfZW50cmllcyIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcubWlycm9yX21hY19lbnRyaWVzID0gKGJjbW9zX2Jvb2wpcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0aWNfbWFjX2VudHJpZXMiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2ZnLnN0YXRpY19tYWNfZW50cmllcyA9IChiY21vc19ib29sKXBhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJ4X3dhcm1pbmdfZGVsYXkiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2ZnLnRyeF93YXJtaW5nX2RlbGF5ID0gcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfcHNfYXBwbF9zdGFydCgmY2ZnKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9zdG9wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X3BzX2FwcGxfc3RvcCgpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX2dldF9jZmcoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBjZmc7CisgICAgCisgICAgZXJyID0gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KCZjZmcpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIm1heF9wYWlycz0lZFxuIiwgY2ZnLm1heF9udW1fcGFpcnMpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAic3dpdGNoX2NvbmRpdGlvbj0lc1xuIiwKKyAgICAgICAgY2ZnLnN3aXRjaF9jb25kaXRpb24gPT0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTE9TID8gImxvcyIgOiAibWFudWFsIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgICJzd2l0Y2hfc2VxdWVuY2U9JXNcbiIsCisgICAgICAgIGNmZy5zd2l0Y2hfc2VxdWVuY2UgPT0gQkNNT0xUX1BTX1NXSVRDSF9TRVFVRU5DRV9TVEFOREFSRCA/ICJzdGQiIDogInRyeF9maXJzdCIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAibWlycm9yX21vZGU9JXNcbiIsCisgICAgICAgIGNmZy5taXJyb3JfbW9kZSA9PSBCQ01PTFRfUFNfTUlSUk9SX01PREVfQVVUTyA/ICJhdXRvIiA6ICJub25lIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIm1pcnJvcl9tYWNfZW50cmllcz0lc1xuIiwgY2ZnLm1pcnJvcl9tYWNfZW50cmllcyA/ICJ5ZXMiIDogIm5vIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgInN0YXRpY19tYWNfZW50cmllcz0lc1xuIiwgY2ZnLnN0YXRpY19tYWNfZW50cmllcyA/ICJ5ZXMiIDogIm5vIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgInRyeF93YXJtaW5nX2RlbGF5PSV1XG4iLCBjZmcudHJ4X3dhcm1pbmdfZGVsYXkpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19jbWRfc2hvd19wYWlycyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19nbG9iYWxfY2ZnIGNmZzsKKyAgICBiY21vbHRfcHNfcGFpciAqcGFpcnM7CisgICAgdWludDE2X3QgbnVtX3dyaXR0ZW47CisKKyAgICBlcnIgPSBiY21vbHRfcHNfZ2xvYmFsX2NmZ19nZXQoJmNmZyk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwYWlycyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKnBhaXJzKSAqIGNmZy5tYXhfbnVtX3BhaXJzKTsKKworICAgIGVyciA9IGJjbW9sdF9wc19wYWlyc19nZXQoY2ZnLm1heF9udW1fcGFpcnMsIHBhaXJzLCAmbnVtX3dyaXR0ZW4pOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGk7CisKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICAgIHdvcmtpbmcgIHwgc3RhbmRieVxuIik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgICAgICA9PT09PT09PT0rPT09PT09PT09XG4iKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV93cml0dGVuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgIlslMmRdOiAlMmQuJTJkLiUyZCB8ICUyZC4lMmQuJTJkXG4iLAorICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgcGFpcnNbaV0ud29ya2luZy5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgcGFpcnNbaV0ud29ya2luZy5wb25faWQsCisgICAgICAgICAgICAgICAgcGFpcnNbaV0ud29ya2luZy50cmFuc2NlaXZlcl9pZCwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS5zdGFuZGJ5LmRldmljZV9pZCwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS5zdGFuZGJ5LnBvbl9pZCwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS5zdGFuZGJ5LnRyYW5zY2VpdmVyX2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX2ZyZWUocGFpcnMpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19jbWRfYWRkX3BhaXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqd29ya2luZ19kZXZpY2UgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3b3JraW5nLmRldmljZSIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqd29ya2luZ19wb24gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3b3JraW5nLnBvbiIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqd29ya2luZ190cmFuc2NlaXZlciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmcudHJhbnNjZWl2ZXIiKTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnN0YW5kYnlfZGV2aWNlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieS5kZXZpY2UiKTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnN0YW5kYnlfcG9uID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieS5wb24iKTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnN0YW5kYnlfdHJhbnNjZWl2ZXIgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGFuZGJ5LnRyYW5zY2VpdmVyIik7CisKKyAgICBiY21vbHRfcHNfcGFpciBwYWlyID0KKyAgICB7CisgICAgICAgIC53b3JraW5nID0KKyAgICAgICAgeworICAgICAgICAgICAgLmRldmljZV9pZCA9IChiY21vbHRfZGV2aWQpd29ya2luZ19kZXZpY2UtPnZhbHVlLm51bWJlciwKKyAgICAgICAgICAgIC5wb25faWQgPSAoYmNtb2x0X3Bvbl9uaSl3b3JraW5nX3Bvbi0+dmFsdWUubnVtYmVyLAorICAgICAgICAgICAgLnRyYW5zY2VpdmVyX2lkID0gKGJjbW9sdF9wb25fbmkpd29ya2luZ190cmFuc2NlaXZlci0+dmFsdWUubnVtYmVyCisgICAgICAgIH0sCisgICAgICAgIC5zdGFuZGJ5ID0KKyAgICAgICAgeworICAgICAgICAgICAgLmRldmljZV9pZCA9IChiY21vbHRfZGV2aWQpc3RhbmRieV9kZXZpY2UtPnZhbHVlLm51bWJlciwKKyAgICAgICAgICAgIC5wb25faWQgPSAoYmNtb2x0X3Bvbl9uaSlzdGFuZGJ5X3Bvbi0+dmFsdWUubnVtYmVyLAorICAgICAgICAgICAgLnRyYW5zY2VpdmVyX2lkID0gKGJjbW9sdF9wb25fbmkpc3RhbmRieV90cmFuc2NlaXZlci0+dmFsdWUubnVtYmVyCisgICAgICAgIH0sCisgICAgfTsKKworICAgIC8vIFNldCB0cmFuc2NlaXZlcl9pZCB0byBwb25faWQgaWYgZGVmYXVsdAorICAgIGlmIChwYWlyLndvcmtpbmcudHJhbnNjZWl2ZXJfaWQgPT0gKGJjbW9sdF9wb25fbmkpLTEpCisgICAgeworICAgICAgICBwYWlyLndvcmtpbmcudHJhbnNjZWl2ZXJfaWQgPSBwYWlyLndvcmtpbmcucG9uX2lkOworICAgIH0KKyAgICBpZiAocGFpci5zdGFuZGJ5LnRyYW5zY2VpdmVyX2lkID09IChiY21vbHRfcG9uX25pKS0xKQorICAgIHsKKyAgICAgICAgcGFpci5zdGFuZGJ5LnRyYW5zY2VpdmVyX2lkID0gcGFpci5zdGFuZGJ5LnBvbl9pZDsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X3BzX3BhaXJfYWRkKCZwYWlyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9yZW1vdmVfcG9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmRldmljZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZSIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqcG9uID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uIik7CisKKyAgICBiY21vbHRfcHNfcG9uIHBzX3BvbiA9CisgICAgeworICAgICAgICAuZGV2aWNlX2lkID0gKGJjbW9sdF9kZXZpZClkZXZpY2UtPnZhbHVlLm51bWJlciwKKyAgICAgICAgLnBvbl9pZCA9IChiY21vbHRfcG9uX25pKXBvbi0+dmFsdWUubnVtYmVyCisgICAgfTsKKworICAgIHJldHVybiBiY21vbHRfcHNfcG9uX3JlbW92ZSgmcHNfcG9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9wZXJmb3JtX3N3aXRjaChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpkZXZpY2UgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2UiKTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBvbiA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbiIpOworCisgICAgYmNtb2x0X3BzX3BvbiBwc19wb24gPQorICAgIHsKKyAgICAgICAgLmRldmljZV9pZCA9IChiY21vbHRfZGV2aWQpZGV2aWNlLT52YWx1ZS5udW1iZXIsCisgICAgICAgIC5wb25faWQgPSAoYmNtb2x0X3Bvbl9uaSlwb24tPnZhbHVlLm51bWJlcgorICAgIH07CisKKyAgICByZXR1cm4gYmNtb2x0X3BzX3N3aXRjaF9wZXJmb3JtKCZwc19wb24pOworfQorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3BzX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIHN3aXRjaF9jb25kX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJsb3MiLCAgICAudmFsID0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTE9TIH0sCisgICAgICAgIHsgLm5hbWUgPSAibWFudWFsIiwgLnZhbCA9IEJDTU9MVF9QU19TV0lUQ0hfQ09ORElUSU9OX01BTlVBTCB9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgc3dpdGNoX3NlcV90YWJsZVtdID0KKyAgICB7CisgICAgICAgIHsgLm5hbWUgPSAic3RkIiwgICAgICAgLnZhbCA9IEJDTU9MVF9QU19TV0lUQ0hfU0VRVUVOQ0VfU1RBTkRBUkQgfSwKKyAgICAgICAgeyAubmFtZSA9ICJ0cnhfZmlyc3QiLCAudmFsID0gQkNNT0xUX1BTX1NXSVRDSF9TRVFVRU5DRV9UUlhfRklSU1QgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIG1pcnJvcl9tb2RlX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJhdXRvIiwgLnZhbCA9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPIH0sCisgICAgICAgIHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUFNfTUlSUk9SX01PREVfTk9ORSB9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0KKyAgICAgICAgYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgInBzIiwgIlByb3RlY3Rpb24gc3dpdGNoaW5nIHVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhcnQiLCAiU3RhcnQgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24iLCBwc19jbWRfc3RhcnQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1heF9wYWlycyIsICJNYXggbnVtYmVyIG9mIHByb3RlY3RlZCBwYWlycyIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgic3dpdGNoX2NvbmRpdGlvbiIsICJTd2l0Y2ggY29uZGl0aW9uIiwgc3dpdGNoX2NvbmRfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInN3aXRjaF9zZXF1ZW5jZSIsICJTd2l0Y2ggc2VxdWVuY2UiLCBzd2l0Y2hfc2VxX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJtaXJyb3JfbW9kZSIsICJNaXJyb3IgbW9kZSIsIG1pcnJvcl9tb2RlX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKAorICAgICAgICAgICAgIm1pcnJvcl9tYWNfZW50cmllcyIsICJNaXJyb3IgTUFDIGVudHJpZXMiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKAorICAgICAgICAgICAgInN0YXRpY19tYWNfZW50cmllcyIsICJTdGF0aWMgTUFDIGVudHJpZXMiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidHJ4X3dhcm1pbmdfZGVsYXkiLCAiVFJYIHdhcm1pbmcgZGVsYXkgKGluIHVzZWMpIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAic3RvcCIsICJTdG9wIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uIiwgcHNfY21kX3N0b3ApOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJnZXRfY2ZnIiwgIlNob3cgcnVubmluZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCBwc19jbWRfZ2V0X2NmZyk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgInNob3dfcGFpcnMiLCAiU2hvdyBjdXJyZW50IHByb3RlY3RlZCBwYWlycyIsIHBzX2NtZF9zaG93X3BhaXJzKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJhZGRfcGFpciIsICJBZGQgcHJvdGVjdGVkIHBhaXIiLCBwc19jbWRfYWRkX3BhaXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIndvcmtpbmcuZGV2aWNlIiwgIkRldmljZSBJRCBvZiB0aGUgd29ya2luZyBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ3b3JraW5nLnBvbiIsICJQT04gTkkgb2YgdGhlIHdvcmtpbmcgUE9OIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoIndvcmtpbmcudHJhbnNjZWl2ZXIiLCAiVHJhbnNjZWl2ZXIgSWQgb2YgdGhlIHdvcmtpbmcgUE9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLCAtMSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInN0YW5kYnkuZGV2aWNlIiwgIkRldmljZSBJRCBvZiB0aGUgc3RhbmRieSBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzdGFuZGJ5LnBvbiIsICJQT04gTkkgb2YgdGhlIHN0YW5kYnkgUE9OIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoInN0YW5kYnkudHJhbnNjZWl2ZXIiLCAiVHJhbnNjZWl2ZXIgSWQgb2YgdGhlIHN0YW5kYnkgUE9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLCAtMSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInJlbW92ZV9wb24iLCAiUmVtb3ZlIHByb3RlY3RlZCBwYWlyIGZvciAoZWl0aGVyKSBQT04iLCBwc19jbWRfcmVtb3ZlX3BvbiwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZGV2aWNlIiwgIkRldmljZSBJRCBvZiB0aGUgZWl0aGVyIHdvcmtpbmcvc3RhbmRieSBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwb24iLCAiUE9OIE5JIG9mIHRoZSBlaXRoZXIgd29ya2luZy9zdGFuZGJ5IFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInBlcmZvcm1fc3dpdGNoIiwgIlBlcmZvcm0gcHJvdGVjdGlvbiBzd2l0Y2ggbWFudWFsbHkiLCBwc19jbWRfcGVyZm9ybV9zd2l0Y2gsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImRldmljZSIsICJEZXZpY2UgSUQgb2YgdGhlIGVpdGhlciB3b3JraW5nL3N0YW5kYnkgUE9OIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uIiwgIlBPTiBOSSBvZiB0aGUgZWl0aGVyIHdvcmtpbmcvc3RhbmRieSBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzdjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX1BTX0NMSV9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9QU19DTElfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3BzX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2Vwb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19lcG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiOTNjYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19lcG9uLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbW9zX2NvbW1vbi5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzX2ludGVybmFsLmgiCisKKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV9ub19yZXBvcnRzKGJjbW9sdF9wc19nbG9iYWxfY2ZnICogZ2xvYmFsX2NmZywgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzICogaW5kKQoreworICAgIGlmIChpbmQtPmRhdGEuYWxhcm1fc3RhdHVzID09IEJDTU9MVF9TVEFUVVNfT0ZGKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gY2xlYXJlZFxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gcmFpc2VkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworCisgICAgaWYgKGdsb2JhbF9jZmctPnN3aXRjaF9jb25kaXRpb24gPT0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMKQorICAgIHsKKyAgICAgICAgLyogZG9uJ3QgcmVhY3QgdG8gdGhlIHN3aXRjaCBpZiB3ZSdyZSBpbiBtYW51YWwgc3dpdGNoIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfcHNfc3dpdGNoX3BlcmZvcm0ocG9uKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbG9naWNhbF9saW5rX2Rpc2NvdmVyZWQoYmNtb2x0X3BzX2dsb2JhbF9jZmcgKiBnbG9iYWxfY2ZnLCBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkICogaW5kKQoreworICAgIGJjbW9sdF9wc19wb25fc3RhdGUgc3RhdGU7CisgICAgYmNtb2x0X3BzX3BvbiBwYXJ0bmVyOworICAgIGJjbW9zX2Vycm5vIHJlc3VsdDsKKworICAgIGlmIChnbG9iYWxfY2ZnLT5taXJyb3JfbW9kZSAhPSBCQ01PTFRfUFNfTUlSUk9SX01PREVfQVVUTykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICAKKyAgICAvL0F0IHRoaXMgcG9pbnQgd2Uga25vdyB3ZSBoYXZlIGEgbGluayBkaXNjb3ZlcmVkIG9uIGEgUE9OIHRoYXQgaXMgaW4gdGhlIFBST1RFQ1RFRCBXT1JLSU5HIHN0YXRlLgorICAgIC8vVGhpcyBtZWFucyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGlzIGlzIHNldHVwIG9uIHRoZSBQUk9DVEVDVEVEIFNUQU5EQlkgUE9OLiAgSXQgaXMgcG9zc2libGUKKyAgICAvL1RoYXQgdGhpcyBsaW5rIGhhcyBiZWVuIHByZXZpb3VzbHkgY29uZmlndXJlZCBvbiB0aGUgU1RBTkRCWSBQT04gc28gd2UgaGF2ZSB0byBoYW5kbGUgdGhhdCBjYXNlCisgICAgLy9ncmFjZWZ1bGx5IGFzIHdlbGwuCisgICAgcmVzdWx0ID0gYmNtb2x0X3BzX3Bvbl9zdGF0ZV9nZXQocG9uLCAmc3RhdGUsICZwYXJ0bmVyKTsKKyAgICBQU19JTkZPKCJwb24gJWQsIGJjbW9sdF9wc19wb25fc3RhdGVfZ2V0IHJlc3VsdCA9PSAlZCwgc3RhdGUgPT0gJWQsIHBhcnRuZXIucG9uX2lkID09ICVkXG4iLCBwb24tPnBvbl9pZCwgcmVzdWx0LCBzdGF0ZSwgcGFydG5lci5wb25faWQpOworICAgIGlmICgoQkNNX0VSUl9PSyA9PSByZXN1bHQpICYmIChzdGF0ZSA9PSBCQ01PTFRfUFNfUE9OX1NUQVRFX1dPUktJTkcpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsgYWRkX3N0YW5kYnkgPSB7fTsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHt9OworICAgICAgICBQU19JTkZPKCJNaXJyb3JpbmcgcmVjZWl2ZWQgbGluayBkaXNjb3ZlcmVkIG9uIHdvcmtpbmcgUE9OXG4iKTsKKworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSlwYXJ0bmVyLnBvbl9pZDsgIC8vU2V0dXAgdGhlIHN0YW5kYnkgUE9OIGFzIHRoZSBsb2NhdGlvbiB0byBhZGQgdGhlIGxpbmsuCisgICAgICAgIAorICAgICAgICAvL1NldHVwIG9wZXJhdGlvbiBrZXkgZm9yIGFwaSBjYWxsLgorICAgICAgICBCQ01PTFRfT1BFUl9JTklUKCZhZGRfc3RhbmRieSwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIGtleSk7CisKKyAgICAgICAgLy9Db3B5IG92ZXIgdGhlIGRhdGEgZnJvbSB0aGUgcmVjZWl2ZWQgbWVzc2FnZXM6CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZhZGRfc3RhbmRieSwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIG1hY19hZGRyZXNzLCBpbmQtPmtleS5tYWNfYWRkcmVzcyk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZhZGRfc3RhbmRieSwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIHdvcmtpbmdfbGlua19pbmZvLCBpbmQtPmRhdGEubGlua19pbmZvKTsKKworICAgICAgICByZXN1bHQgPSBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci5kZXZpY2VfaWQsICZhZGRfc3RhbmRieS5oZHIpOworCisgICAgICAgIC8vV2UgaGF2ZSBtdWx0aXBsZSBhY2NlcHRhYmxlIHJldHVybiBjb2RlcyBoZXJlOiAgCisgICAgICAgIC8vICBCQ01fRVJSX09LICAgICAgLSBJbmRpY2F0ZXMgbmV3IGVudHJ5IGNyZWF0ZWQuCisgICAgICAgIC8vICBCQ01fRVJSX0FMUkVBRFkgLSBJbmRpY2F0ZXMgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIChwb3NzaWJsZSBhZnRlciBkZXJlZ2lzdHJhdGlvbi9yZXJlZ2lzdHJhdGlvbikuCisgICAgICAgIFBTX0lORk8oIk1pcnJvcmluZyBhZGQgcHJvdGVjdGVkIHN0YW5kYnkgbGluayByZXN1bHQgJWRcbiIsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKCAocmVzdWx0ID09IEJDTV9FUlJfT0spIHx8IChyZXN1bHQgPT0gQkNNX0VSUl9BTFJFQURZKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiBzdGF0aWNfcmVnID0ge307CisgICAgICAgICAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSA9IHt9OworCisgICAgICAgICAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKXBhcnRuZXIucG9uX2lkOworICAgICAgICAgICAgbGlua19rZXkubWFjX2FkZHJlc3MgPSBpbmQtPmtleS5tYWNfYWRkcmVzczsKKworICAgICAgICAgICAgLy9TZXR1cCBvcGVyYXRpb24ga2V5IGZvciBhcGkgY2FsbC4KKyAgICAgICAgICAgIEJDTU9MVF9PUEVSX0lOSVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgbGlua19rZXkpOworICAgICAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgbGFzZXJvbl90aW1lX3RxLCBpbmQtPmRhdGEubGlua19pbmZvLm9udV9sYXNlcl9vbl90aW1lX3RxKTsKKyAgICAgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZzdGF0aWNfcmVnLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGxhc2Vyb2ZmX3RpbWVfdHEsIGluZC0+ZGF0YS5saW5rX2luZm8ub251X2xhc2VyX29mZl90aW1lX3RxKTsKKyAgICAgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZzdGF0aWNfcmVnLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHJhbmdlX3ZhbHVlX3RxLCBpbmQtPmRhdGEubGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxKTsKKyAgICAgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZzdGF0aWNfcmVnLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHBlbmRpbmdfZ3JhbnRzLCBpbmQtPmRhdGEubGlua19pbmZvLnBlbmRpbmdfZ3JhbnRzKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLmRldmljZV9pZCwgJnN0YXRpY19yZWcuaGRyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQU19FUlIoIlN0YXRpYyByZWdpc3RyYXRpb24gZmFpbGVkICVkXG4iLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBTX0lORk8oIlN0YXRpYyByZWdpc3RyYXRpb24gc3VjY2Vzc1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQU19FUlIoIkFkZCBwcm90ZWN0ZWQgc3RhbmRieSBmYWlsZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX2Vwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBnbG9iYWxfY2ZnOworCisgICAgZXJyID0gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KCZnbG9iYWxfY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIFBTX0lORk8oInBzX3Byb2Nlc3NfaW5kX2Vwb24gVHlwZTogJWQgQ0ZHX0lEOiAlZFxuIiwgaW5kLT5oZHIub2JqX3R5cGUsIGluZC0+aGRyLnN1Ymdyb3VwKTsKKyAgICBzd2l0Y2ggKGluZC0+aGRyLm9ial90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9OSToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX05PX1JFUE9SVFM6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX25vX3JlcG9ydHMoJmdsb2JhbF9jZmcsIHBvbiwgKChjb25zdCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0xJTks6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfRElTQ09WRVJFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbG9naWNhbF9saW5rX2Rpc2NvdmVyZWQoJmdsb2JhbF9jZmcsIHBvbiwgKChjb25zdCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X2Vwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlIHNldF9wb25fc3RhdGU7IAorICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7fTsKKyAgICBrZXkuZXBvbl9uaSA9IHBvbi0+cG9uX2lkOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIGVwb25fbmksIHNldF9lcG9uX25pX2VuX3N0YXRlLCBuZXdfc3RhdGUsIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBvbi0+ZGV2aWNlX2lkLCAmc2V0X3Bvbl9zdGF0ZS5oZHIpOworfQorCitiY21vc19lcnJubyBwc19tb3ZlX3RvX3dvcmtpbmdfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsKKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0ge307CisgICAga2V5LmVwb25fbmkgPSBwb24tPnBvbl9pZDsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJnNldF9wb25fc3RhdGUsIGVwb25fbmksIHNldF9lcG9uX25pX2VuX3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZzZXRfcG9uX3N0YXRlLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwgbmV3X3N0YXRlLCBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9URUNURURfV09SS0lORyk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwb24tPmRldmljZV9pZCwgJnNldF9wb25fc3RhdGUuaGRyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfZ3Bvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2dwb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNlN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2dwb24uYwpAQCAtMCwwICsxLDg3OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaCIKKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV9sb3MoCisgICAgY29uc3QgYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmdsb2JhbF9jZmcsCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX25pX2xvcyAqaW5kKQoreworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzID09IEJDTU9MVF9TVEFUVVNfT0ZGKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gY2xlYXJlZFxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gcmFpc2VkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworCisgICAgaWYgKGdsb2JhbF9jZmctPnN3aXRjaF9jb25kaXRpb24gPT0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMKQorICAgIHsKKyAgICAgICAgLyogZG9uJ3QgcmVhY3QgdG8gdGhlIHN3aXRjaCBpZiB3ZSdyZSBpbiBtYW51YWwgc3dpdGNoIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfcHNfc3dpdGNoX3BlcmZvcm0ocG9uKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfc3RhdGVfY2hhbmdlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXkpOworCisgICAgaWYgKGluZC0+ZGF0YS5wcmV2aW91c19zdGF0ZSA9PSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFICYmCisgICAgICAgIGluZC0+ZGF0YS5uZXdfc3RhdGUgPT0gQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORykKKyAgICB7CisgICAgICAgIFBTX0lORk8oIiVzOiBhY3RpdmF0aW5nIFBPTiA8JWQ6JWQ+XG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5kLT5kYXRhLnByZXZpb3VzX3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcgJiYKKyAgICAgICAgaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiJXM6IGRlYWN0aXZhdGluZyBQT04gPCVkOiVkPlxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmkpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIG9ubHkgY2hhbmdlIHRoZSBzdGFuZGJ5IFBPTidzIHN0YXRlIGlmIHdlJ3JlIHByZS1wcm92aXNpb25pbmcgdGhlIHdvcmtpbmcgUE9OCisgICAgICAgICAgKHRoZSBzd2l0Y2hvdmVyIGlzIGhhbmRsZWQgc2VwYXJhdGVseSkgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfdHJhZmZpY19yZXN1bWUoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lICppbmQpCit7CisgICAgdWludDMyX3QgYWZ0ZXJfdXMgID0gYmNtb3NfdGltZXN0YW1wKCk7CisgICAgdWludDMyX3QgYmVmb3JlX3VzID0gcHNfZ2V0X2xhc3Rfc3dpdGNoX3N0YXJ0X3RpbWVfdXMoKTsKKyAgICB1aW50MzJfdCB0aW1lX3Rha2VuX3VzID0gKGFmdGVyX3VzID4gYmVmb3JlX3VzKSA/IGFmdGVyX3VzIC0gYmVmb3JlX3VzIDogYmVmb3JlX3VzIC0gYWZ0ZXJfdXM7CisgICAgY29uc3QgY2hhciAqdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKGluZC0+ZGF0YS5yZXN1bHQpCisgICAgeworICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gInN1Y2Nlc3MiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfRkFJTFVSRToKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciA9ICJmYWlsdXJlIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVU1BFQ1RFRF9MT1M6CisgICAgICAgIHRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSAic3VzcGVjdGVkX2xvcyI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIFBTX0lORk8oCisgICAgICAgICI8JWQ6JWQ+IFRyYWZmaWMgcmVzdW1lICVzLiBUaW1lIHNpbmNlIHN0YXJ0IG9mIHN3aXRjaDogJWQgbXMuXG4iLAorICAgICAgICBwb24tPmRldmljZV9pZCwKKyAgICAgICAgcG9uLT5wb25faWQsCisgICAgICAgIHRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIsCisgICAgICAgIHRpbWVfdGFrZW5fdXMgLyAxMDAwKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX29udXNfcmFuZ2VkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgKmluZCkKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGJjbW9zX2Vycm5vIGxhc3RfZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIGFwcGx5IGFsbCBvZiB0aGUgbmV3IE9OVSBFUURzIHRvIHRoZSBzdGFuZGJ5IFBPTiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpbmQtPmRhdGEub251cy5sZW47IGkrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+ZGF0YS5vbnVzLnZhbFtpXS5vbnVfaWQgfTsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgICAgICBQU19JTkZPKAorICAgICAgICAgICAgIiVzOiB1cGRhdGluZyBFUUQgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgICAgICBrZXkucG9uX25pLAorICAgICAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgICAgIGluZC0+ZGF0YS5vbnVzLnZhbFtpXS5lcWQpOworCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCBpbmQtPmRhdGEub251cy52YWxbaV0uZXFkKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgUFNfRVJSKCJFUUQgdXBkYXRlIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgbGFzdF9lcnIgPSBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGFzdF9lcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3JhbmdpbmdfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisKKyAgICAvKiBvbmx5IHJlYWN0IHRvIHN1Y2Nlc3MgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIEVRRCA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5lcWQpOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgaW5kLT5kYXRhLmVxZCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKworICAgIFBTX0lORk8oIiVzOiB1cGRhdGluZyBBRVMga2V5IDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5LCBpbmQtPmRhdGEubmV3X2tleSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisKKyAgICAvKiBvbmx5IHJlYWN0IHRvIHN1Y2Nlc3MgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogdXBkYXRpbmcgcGFzc3dvcmQgPCVkOiVkPiBPTlUgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCwgaW5kLT5kYXRhLnBhc3N3b3JkKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2FjdGl2YXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBvbmx5IHJlYWN0IHRvIHN1Y2Nlc3MgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBvcGVyOworCisgICAgLyogTm90ZTogd2UgcmVhY3QgdG8gdGhpcyBpbmRpY2F0aW9uIHdoZXRoZXIgb3Igbm90IHRoZSBkZWFjdGl2YXRpb24gd2FzIHN1Y2Nlc3NmdWwuICBGYWlsdXJlIGluZGljYXRlcyB0aGF0IHRoZQorICAgICAqIE9OVSBkaWRuJ3QgcmVzcG9uZCB0byB0aGUgZGVhY3RpdmF0aW9uLCBidXQgd2Ugc3RpbGwgcmVtb3ZlIHRoZSBPTlUgZnJvbSBPTFQgaGFyZHdhcmUgc28gaXQgbXVzdCBiZSBtaXJyb3JlZC4gKi8KKworICAgIFBTX0lORk8oIiVzOiBkZWFjdGl2YXRpbmcgPCVkOiVkPiBPTlUgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9JTkFDVElWRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2VuYWJsZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBvcGVyOworCisgICAgLyogZG9uJ3QgdHJ5IHRvIG1pcnJvciBicm9hZGNhc3QgZW5hYmxlL2Rpc2FibGUgKi8KKyAgICBpZiAoa2V5Lm9udV9pZCA9PSBCQ01PTFRfR1BPTl9PTlVfSURfSU5WQUxJRCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oIiVzOiBlbmFibGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0VOQUJMRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2Rpc2FibGVfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBkb24ndCB0cnkgdG8gbWlycm9yIGJyb2FkY2FzdCBlbmFibGUvZGlzYWJsZSAqLworICAgIGlmIChrZXkub251X2lkID09IEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiJXM6IGRpc2FibGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0RJU0FCTEUpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgdm9pZCBwc19hbGFybV9zdGF0ZV9pbml0KGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSAqYWxhcm1fc3RhdGUpCit7CisgICAgYWxhcm1fc3RhdGUtPmxvc2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+bG9maSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2FtaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5kZ2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+dGl3aSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5kb3dpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPnN1ZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c2ZpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPnNkaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5kZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+bG9haSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2tpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2FsYXJtKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm0gKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUubG9zaSA9IGluZC0+ZGF0YS5vbnVfYWxhcm0ubG9zaTsKKyAgICBhbGFybV9zdGF0ZS5sb2ZpID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb2ZpOworICAgIGFsYXJtX3N0YXRlLmxvYW1pID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb2FtaTsKKyAgICAKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIE9OVSBhbGFybXMgPCVkOiVkPiBPTlUgJWQgLT4gJWQvJWQvJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBhbGFybV9zdGF0ZS5sb3NpLAorICAgICAgICBhbGFybV9zdGF0ZS5sb2ZpLAorICAgICAgICBhbGFybV9zdGF0ZS5sb2FtaSk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2Rvd2koY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X2Rvd2kgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIERPV2kgPCVkOiVkPiBPTlUgJWQgLT4gJWQgKEVRRCAlZClcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzLAorICAgICAgICBpbmQtPmRhdGEubmV3X2VxZCk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuZG93aSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKworICAgIGlmIChpbmQtPmRhdGEuYWxhcm1fc3RhdHVzID09IEJDTU9MVF9TVEFUVVNfT04pCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUsIGluZC0+ZGF0YS5uZXdfZXFkKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3NmaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2ZpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBTRkkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zZmkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9zZGkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X3NkaSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgU0RpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuc2RpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGZpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZmkgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIERGaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLmRmaSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3N1ZmkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X3N1ZmkgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIFNVRmkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zdWZpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfbG9haShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9haSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgTE9BaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLmxvYWkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kZ2koY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X2RnaSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgREdpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuZGdpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfdGl3aShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdGl3aSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgVElXaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnRpd2kgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9sb2tpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBMT0tpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUubG9raSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X29tY2lfcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+ZGF0YS5nZW1fcG9ydCB9OworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSBvcGVyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBrZXkpOworCisgICAgaWYgKGluZC0+ZGF0YS5vcGVyYXRpb24gPT0gQkNNT0xUX09NQ0lfUE9SVF9JRF9PUEVSQVRJT05fQ09ORklHVVJFKQorICAgIHsKKyAgICAgICAgLyogZG9uJ3QgcmVhY3QgdG8gdW5zdWNjZXNzZnVsIGFjdGl2YXRpb25zICovCisgICAgICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKworICAgICAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IEdFTSBwb3J0IElEICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5LmdlbV9wb3J0X2lkKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fZ2VtX3BvcnQsIHNldF9zdGF0ZSwgc3RhdGUsIEJDTU9MVF9HRU1fUE9SVF9PUEVSQVRJT05fQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQU19JTkZPKAorICAgICAgICAgICAgIiVzOiBkZWFjdGl2YXRpbmcgPCVkOiVkPiBHRU0gcG9ydCBJRCAlZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAgICAgIGtleS5wb25fbmksCisgICAgICAgICAgICBrZXkuZ2VtX3BvcnRfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBzdGF0ZSwgQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9ERUFDVElWQVRFKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9tYWNfdGFibGVfbmV3X21hYygKKyAgICBjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqZ2xvYmFsX2NmZywKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hYyAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5tYWNfYWRkcmVzcywgaW5kLT5rZXkudmxhbiB9OworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZzsKKworICAgIGlmICghZ2xvYmFsX2NmZy0+bWlycm9yX21hY19lbnRyaWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHdlIGFyZSBub3QgY29uZmlndXJlZCB0byBtaXJyb3IgTUFDIGVudHJpZXMgKi8KKyAgICB9CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkLCBpbmQtPmRhdGEuZmxvd19pZCk7CisKKyAgICBpZiAoZ2xvYmFsX2NmZy0+c3RhdGljX21hY19lbnRyaWVzKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQsIEJDTU9TX1RSVUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCwgQkNNT1NfRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9tYWNfdGFibGVfbWFjX2FnZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmdsb2JhbF9jZmcsCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm1hY19hZGRyZXNzLCBpbmQtPmtleS52bGFuIH07CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOworCisgICAgaWYgKCFnbG9iYWxfY2ZnLT5taXJyb3JfbWFjX2VudHJpZXMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogd2UgYXJlIG5vdCBjb25maWd1cmVkIHRvIG1pcnJvciBNQUMgZW50cmllcyAqLworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfY2xlYXIocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbWFjX3RhYmxlX21hY19tb3ZlKAorICAgIGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpnbG9iYWxfY2ZnLAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5tYWNfYWRkcmVzcywgaW5kLT5rZXkudmxhbiB9OworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZzsKKworICAgIGlmICghZ2xvYmFsX2NmZy0+bWlycm9yX21hY19lbnRyaWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHdlIGFyZSBub3QgY29uZmlndXJlZCB0byBtaXJyb3IgTUFDIGVudHJpZXMgKi8KKyAgICB9CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkLCBpbmQtPmRhdGEubmV3X2Zsb3dfaWQpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9hbGxvY19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5hbGxvY19pZCB9OworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZSBvcGVyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBrZXkpOworCisgICAgaWYgKGluZC0+ZGF0YS5uZXdfc3RhdGUgPT0gQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRSkKKyAgICB7CisgICAgICAgIC8qIGRvbid0IHJlYWN0IHRvIHVuc3VjY2Vzc2Z1bCBhY3RpdmF0aW9ucyAqLworICAgICAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisKKyAgICAgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgPCVkOiVkPiBhbGxvYyAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5hbGxvY19pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0FDVElWQVRFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfQUxMT0NfU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogZGVhY3RpdmF0aW5nIDwlZDolZD4gYWxsb2MgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkuYWxsb2NfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBzdGF0ZSwgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9ERUFDVElWQVRFKTsKKyAgICB9CisgICAgZWxzZSAvKiBpbmQtPmRhdGEubmV3X3N0YXRlIGlzIHNvbWV0aGluZyBlbHNlIChlLmcuIHVucHJvdmlzaW9uZWQsIGlmIHRoZSBhbGxvYyB3YXMgY2xlYXJlZCkgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5LmdlbV9wb3J0X2lkIH07CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkUpCisgICAgeworICAgICAgICAvKiBkb24ndCByZWFjdCB0byB1bnN1Y2Nlc3NmdWwgYWN0aXZhdGlvbnMgKi8KKyAgICAgICAgaWYgKGluZC0+ZGF0YS5zdGF0dXMgIT0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorCisgICAgICAgIFBTX0lORk8oIiVzOiBhY3RpdmF0aW5nIDwlZDolZD4gR0VNIHBvcnQgSUQgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkuZ2VtX3BvcnRfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBzdGF0ZSwgQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9BQ1RJVkFURSk7CisgICAgfQorICAgIGVsc2UgaWYgKGluZC0+ZGF0YS5uZXdfc3RhdGUgPT0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKAorICAgICAgICAgICAgIiVzOiBkZWFjdGl2YXRpbmcgPCVkOiVkPiBHRU0gcG9ydCBJRCAlZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAgICAgIGtleS5wb25fbmksCisgICAgICAgICAgICBrZXkuZ2VtX3BvcnRfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBzdGF0ZSwgQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9ERUFDVElWQVRFKTsKKyAgICB9CisgICAgZWxzZSAvKiBpbmQtPmRhdGEubmV3X3N0YXRlIGlzIHNvbWV0aGluZyBlbHNlIChlLmcuIHVucHJvdmlzaW9uZWQsIGlmIHRoZSBHRU0gcG9ydCB3YXMgY2xlYXJlZCkgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitiY21vc19lcnJubyBwc19wcm9jZXNzX2luZF9ncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgY29uc3QgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3BzX3Bvbl9zdGF0ZSBzdGF0ZTsKKyAgICBiY21vbHRfcHNfcG9uIHBhcnRuZXI7CisgICAgYmNtb2x0X3BzX2dsb2JhbF9jZmcgZ2xvYmFsX2NmZzsKKworICAgIGVyciA9IGJjbW9sdF9wc19nbG9iYWxfY2ZnX2dldCgmZ2xvYmFsX2NmZyk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZ2xvYmFsX2NmZy5taXJyb3JfbW9kZSAhPSBCQ01PTFRfUFNfTUlSUk9SX01PREVfQVVUTyAmJgorICAgICAgICBpbmQtPmhkci5zdWJncm91cCAhPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0xPUykKKyAgICB7CisgICAgICAgIC8qIG9ubHkgaGFuZGxlIG1vc3QgaW5kaWNhdGlvbnMgd2hpbGUgaW4gbWlycm9yIG1vZGUgJ2F1dG8nLCBidXQgcGVyZm9ybSBhIHN3aXRjaG92ZXIgb24gTG9TIGluIGFueSBjYXNlICAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfcHNfcG9uX3N0YXRlX2dldChwb24sICZzdGF0ZSwgJnBhcnRuZXIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHN0YXRlICE9IEJDTU9MVF9QU19QT05fU1RBVEVfV09SS0lORykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiBpZ25vcmUgaW5kaWNhdGlvbnMgZnJvbSBQT05zIHRoYXQgYXJlbid0IHByb3RlY3RlZCB3b3JraW5nICovCisgICAgfQorCisgICAgc3dpdGNoIChpbmQtPmhkci5vYmpfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fTkk6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0xPUzoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbmlfbG9zKCZnbG9iYWxfY2ZnLCBwb24sICgoY29uc3QgYmNtb2x0X2dwb25fbmlfbG9zICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV9zdGF0ZV9jaGFuZ2VkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV90cmFmZmljX3Jlc3VtZShwb24sICgoY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV9vbnVzX3JhbmdlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgTkkgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fT05VOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9yYW5naW5nX2NvbXBsZXRlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2FjdGl2YXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZW5hYmxlX2NvbXBsZXRlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9kaXNhYmxlX2NvbXBsZXRlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FMQVJNOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfYWxhcm0oJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0RPV0k6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9kb3dpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kb3dpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfc2ZpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZmkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TREk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zZGkoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X3NkaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2RmaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3N1ZmkoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X3N1ZmkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0FJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfbG9haSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9haSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0RHSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2RnaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGdpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3Rpd2koJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X3Rpd2kgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0tJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfbG9raSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9raSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X29tY2lfcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiBzaWxlbnRseSBpZ25vcmUgYWxsIG90aGVyIE9OVSBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX2FsbG9jX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiBzaWxlbnRseSBpZ25vcmUgYWxsIG90aGVyIGFsbG9jIGluZGljYXRpb25zICovCisgICAgICAgIH0KKworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JUOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgR0VNIHBvcnQgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQzoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbWFjX3RhYmxlX25ld19tYWMoCisgICAgICAgICAgICAgICAgJmdsb2JhbF9jZmcsCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hYyAqKWluZCk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbWFjX3RhYmxlX21hY19hZ2VkKAorICAgICAgICAgICAgICAgICZnbG9iYWxfY2ZnLAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgIChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkICopaW5kKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19NT1ZFOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9tYWNfdGFibGVfbWFjX21vdmUoCisgICAgICAgICAgICAgICAgJmdsb2JhbF9jZmcsIAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgIChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlICopaW5kKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiBzaWxlbnRseSBpZ25vcmUgYWxsIG90aGVyIG1hYyB0YWJsZSBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOyAvKiBzb21lb25lIGVsc2UgbmVlZHMgdG8gaGFuZGxlIHRoaXMgaW5kaWNhdGlvbiAqLworICAgIH0KK30KKworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAoYmNtb2x0X2dwb25fbmkpcG9uLT5wb25faWQgfTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJnNldF9wb25fc3RhdGUsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocG9uLT5kZXZpY2VfaWQsICZzZXRfcG9uX3N0YXRlLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ19ncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIHNldF9wb25fc3RhdGU7CisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgKGJjbW9sdF9ncG9uX25pKXBvbi0+cG9uX2lkIH07CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZzZXRfcG9uX3N0YXRlLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZzZXRfcG9uX3N0YXRlLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBvbi0+ZGV2aWNlX2lkLCAmc2V0X3Bvbl9zdGF0ZS5oZHIpOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2ludGVybmFsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzNmN2QxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2ludGVybmFsLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisvKiBUaGlzIGZpbGUgaXMgZm9yIGludGVybmFsIHVzZSB3aXRoaW4gdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIHVzZXIgYXBwbGljYXRpb24gLQorICAgbm8gZnVuY3Rpb25zIGhlcmUgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFueXdoZXJlIGVsc2UhICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfUFNfSU5URVJOQUxfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfUFNfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wcy5oIgorCisjaWZkZWYgRU5BQkxFX0xPRworZGV2X2xvZ19pZCBwc19nZXRfbG9nX2lkKHZvaWQpOworI2RlZmluZSBQU19FUlIoLi4uKSBCQ01fTE9HKEVSUk9SLCBwc19nZXRfbG9nX2lkKCksIF9fVkFfQVJHU19fKQorI2RlZmluZSBQU19JTkZPKC4uLikgQkNNX0xPRyhJTkZPLCBwc19nZXRfbG9nX2lkKCksIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgUFNfRVJSKC4uLikgYmNtb3NfcHJpbnRmKCJbUFMgRVJST1JdICIgX19WQV9BUkdTX18pCisjZGVmaW5lIFBTX0lORk8oLi4uKSBiY21vc19wcmludGYoIltQUyBJTkZPXSAiIF9fVkFfQVJHU19fKQorI2VuZGlmCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3VpbnQzMl90IHBzX2dldF9sYXN0X3N3aXRjaF9zdGFydF90aW1lX3VzKHZvaWQpOworCisvKiBHUE9OLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgKi8KK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfYXV0byAqaW5kKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fc3RhbmRieV9ncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CitiY21vc19lcnJubyBwc19tb3ZlX3RvX3dvcmtpbmdfZ3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pOworCisvKiBFUE9OLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgKi8KK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX2Vwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfYXV0byAqaW5kKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fc3RhbmRieV9lcG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CitiY21vc19lcnJubyBwc19tb3ZlX3RvX3dvcmtpbmdfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pOworCisvKiBYR1BPTi1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5ICovCitiY21vc19lcnJubyBwc19wcm9jZXNzX2luZF94Z3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9hdXRvICppbmQpOworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X3hncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CitiY21vc19lcnJubyBwc19tb3ZlX3RvX3dvcmtpbmdfeGdwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfeGdwb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc194Z3Bvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTE2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfeGdwb24uYwpAQCAtMCwwICsxLDY1NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaCIKKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV9sb3MoCisgICAgY29uc3QgYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmdsb2JhbF9jZmcsCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9sb3MgKmluZCkKK3sKKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyA9PSBCQ01PTFRfU1RBVFVTX09GRikKKyAgICB7CisgICAgICAgIFBTX0lORk8oIjwlZDolZD4gTG9TIGFsYXJtIGNsZWFyZWRcbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oIjwlZDolZD4gTG9TIGFsYXJtIHJhaXNlZFxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKworICAgIGlmIChnbG9iYWxfY2ZnLT5zd2l0Y2hfY29uZGl0aW9uID09IEJDTU9MVF9QU19TV0lUQ0hfQ09ORElUSU9OX01BTlVBTCkKKyAgICB7CisgICAgICAgIC8qIGRvbid0IHJlYWN0IHRvIHRoZSBzd2l0Y2ggaWYgd2UncmUgaW4gbWFudWFsIHN3aXRjaCBtb2RlICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X3BzX3N3aXRjaF9wZXJmb3JtKHBvbik7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX3N0YXRlX2NoYW5nZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQgfTsKKyAgICBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSBvcGVyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLnByZXZpb3VzX3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUgJiYKKyAgICAgICAgaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9XT1JLSU5HKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgUE9OIDwlZDolZD5cbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5kLT5kYXRhLnByZXZpb3VzX3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcgJiYKKyAgICAgICAgaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiJXM6IGRlYWN0aXZhdGluZyBQT04gPCVkOiVkPlxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmkpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBvbmx5IGNoYW5nZSB0aGUgc3RhbmRieSBQT04ncyBzdGF0ZSBpZiB3ZSdyZSBwcmUtcHJvdmlzaW9uaW5nIHRoZSB3b3JraW5nIFBPTgorICAgICAgICAgICh0aGUgc3dpdGNob3ZlciBpcyBoYW5kbGVkIHNlcGFyYXRlbHkpICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX3RyYWZmaWNfcmVzdW1lKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgKmluZCkKK3sKKyAgICB1aW50MzJfdCBhZnRlcl91cyAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB1aW50MzJfdCBiZWZvcmVfdXMgPSBwc19nZXRfbGFzdF9zd2l0Y2hfc3RhcnRfdGltZV91cygpOworICAgIHVpbnQzMl90IHRpbWVfdGFrZW5fdXMgPSAoYWZ0ZXJfdXMgPiBiZWZvcmVfdXMpID8gYWZ0ZXJfdXMgLSBiZWZvcmVfdXMgOiBiZWZvcmVfdXMgLSBhZnRlcl91czsKKyAgICBjb25zdCBjaGFyICp0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gTlVMTDsKKworICAgIHN3aXRjaCAoaW5kLT5kYXRhLnJlc3VsdCkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgIHRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSAic3VjY2VzcyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9GQUlMVVJFOgorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gImZhaWx1cmUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VTUEVDVEVEX0xPUzoKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciA9ICJzdXNwZWN0ZWRfbG9zIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgUFNfSU5GTygKKyAgICAgICAgIjwlZDolZD4gVHJhZmZpYyByZXN1bWUgJXMuIFRpbWUgc2luY2Ugc3RhcnQgb2Ygc3dpdGNoOiAlZCBtcy5cbiIsCisgICAgICAgIHBvbi0+ZGV2aWNlX2lkLAorICAgICAgICBwb24tPnBvbl9pZCwKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciwKKyAgICAgICAgdGltZV90YWtlbl91cyAvIDEwMDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfb251c19yYW5nZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgKmluZCkKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGJjbW9zX2Vycm5vIGxhc3RfZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIGFwcGx5IGFsbCBvZiB0aGUgbmV3IE9OVSBFUURzIHRvIHRoZSBzdGFuZGJ5IFBPTiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpbmQtPmRhdGEub251cy5sZW47IGkrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmRhdGEub251cy52YWxbaV0ub251X2lkIH07CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICAgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiJXM6IHVwZGF0aW5nIEVRRCA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAgICAgIGtleS5wb25fbmksCisgICAgICAgICAgICBrZXkub251X2lkLAorICAgICAgICAgICAgaW5kLT5kYXRhLm9udXMudmFsW2ldLmVxZCk7CisKKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgaW5kLT5kYXRhLm9udXMudmFsW2ldLmVxZCk7CisgICAgICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIFBTX0VSUigiRVFEIHVwZGF0ZSBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIGxhc3RfZXJyID0gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxhc3RfZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9yYW5naW5nX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworCisgICAgLyogb25seSByZWFjdCB0byBzdWNjZXNzIGluZGljYXRpb25zICovCisgICAgaWYgKGluZC0+ZGF0YS5zdGF0dXMgIT0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBFUUQgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuZXFkKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgaW5kLT5kYXRhLmVxZCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisKKyAgICBQU19JTkZPKCIlczogdXBkYXRpbmcgQUVTIGtleSA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSwgaW5kLT5kYXRhLm5ld19rZXkpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwb24tPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogb25seSByZWFjdCB0byBzdWNjZXNzIGluZGljYXRpb25zICovCisgICAgaWYgKGluZC0+ZGF0YS5zdGF0dXMgIT0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiBwcm92aXNpb25pbmcgcmVnaXN0cmF0aW9uIElEIC8ga2V5cyBmb3IgbmV3bHktYWN0aXZhdGVkIE9OVSA8JWQ6JWQ+IE9OVSAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkLCBpbmQtPmRhdGEucmVnaXN0cmF0aW9uX2lkKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cywgaW5kLT5kYXRhLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpOworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgPCVkOiVkPiBPTlUgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBvcGVyOworCisgICAgLyogTm90ZTogd2UgcmVhY3QgdG8gdGhpcyBpbmRpY2F0aW9uIHdoZXRoZXIgb3Igbm90IHRoZSBkZWFjdGl2YXRpb24gd2FzIHN1Y2Nlc3NmdWwuICBGYWlsdXJlIGluZGljYXRlcyB0aGF0IHRoZQorICAgICAqIE9OVSBkaWRuJ3QgcmVzcG9uZCB0byB0aGUgZGVhY3RpdmF0aW9uLCBidXQgd2Ugc3RpbGwgcmVtb3ZlIHRoZSBPTlUgZnJvbSBPTFQgaGFyZHdhcmUgc28gaXQgbXVzdCBiZSBtaXJyb3JlZC4gKi8KKworICAgIFBTX0lORk8oIiVzOiBkZWFjdGl2YXRpbmcgPCVkOiVkPiBPTlUgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZW5hYmxlX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBkb24ndCB0cnkgdG8gbWlycm9yIGJyb2FkY2FzdCBlbmFibGUvZGlzYWJsZSAqLworICAgIGlmIChrZXkub251X2lkID09IEJDTU9MVF9YR1BPTl9PTlVfSURfSU5WQUxJRCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oIiVzOiBlbmFibGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKworICAgIC8qIGRvbid0IHRyeSB0byBtaXJyb3IgYnJvYWRjYXN0IGVuYWJsZS9kaXNhYmxlICovCisgICAgaWYgKGtleS5vbnVfaWQgPT0gQkNNT0xUX1hHUE9OX09OVV9JRF9JTlZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiJXM6IGRpc2FibGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBzX2FsYXJtX3N0YXRlX2luaXQoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSAqYWxhcm1fc3RhdGUpCit7CisgICAgYWxhcm1fc3RhdGUtPmxvc2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+bG9iaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb3BjaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb3BjaV9taWNfZXJyb3IgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+bG9vY2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+dGl3aSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5kb3dpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPnN1ZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c2ZpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPnNkaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5kZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+ZGdpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPnBxc2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfYWxhcm0oY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm0gKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUubG9zaSA9IGluZC0+ZGF0YS5vbnVfYWxhcm0ubG9zaTsKKyAgICBhbGFybV9zdGF0ZS5sb2JpID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb2JpOworICAgIGFsYXJtX3N0YXRlLmxvcGNpID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb3BjaV9taXNzOworICAgIGFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciA9IGluZC0+ZGF0YS5vbnVfYWxhcm0ubG9wY2lfbWljX2Vycm9yOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBPTlUgYWxhcm1zIDwlZDolZD4gT05VICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZG93aShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X2Rvd2kgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIERPV2kgPCVkOiVkPiBPTlUgJWQgLT4gJWQgKEVRRCAlZClcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzLAorICAgICAgICBpbmQtPmRhdGEubmV3X2VxZCk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuZG93aSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworCisgICAgaWYgKGluZC0+ZGF0YS5hbGFybV9zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PTikKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsIGluZC0+ZGF0YS5uZXdfZXFkKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3NmaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X3NmaSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgU0ZJIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuc2ZpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9zZGkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X3hncG9uX29udV9zZGkgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIFNEaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnNkaSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGZpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGZpICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBERmkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5kZmkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3N1ZmkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X3hncG9uX29udV9zdWZpICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBTVUZpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuc3VmaSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfdGl3aShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2kgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIFRJV2kgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS50aXdpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9sb29jaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBMT09DaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLmxvb2NpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX2FsbG9jX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkuYWxsb2NfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBrZXkpOworCisgICAgaWYgKGluZC0+ZGF0YS5uZXdfc3RhdGUgPT0gQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRSkKKyAgICB7CisgICAgICAgIC8qIG9ubHkgcmVhY3QgdG8gc3VjY2VzcyBpbmRpY2F0aW9ucyAqLworICAgICAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisKKyAgICAgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgPCVkOiVkPiBhbGxvYyAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5hbGxvY19pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBzdGF0ZSwgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURSk7CisgICAgfQorICAgIGVsc2UgaWYgKGluZC0+ZGF0YS5uZXdfc3RhdGUgPT0gQkNNT0xUX0FMTE9DX1NUQVRFX0lOQUNUSVZFKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IGFsbG9jICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5LmFsbG9jX2lkKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0RFQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlIC8qIGluZC0+ZGF0YS5uZXdfc3RhdGUgaXMgc29tZXRoaW5nIGVsc2UgKGUuZy4gdW5wcm92aXNpb25lZCwgaWYgdGhlIGFsbG9jIHdhcyBjbGVhcmVkKSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX3hncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgY29uc3QgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3BzX3Bvbl9zdGF0ZSBzdGF0ZTsKKyAgICBiY21vbHRfcHNfcG9uIHBhcnRuZXI7CisgICAgYmNtb2x0X3BzX2dsb2JhbF9jZmcgZ2xvYmFsX2NmZzsKKworICAgIGVyciA9IGJjbW9sdF9wc19nbG9iYWxfY2ZnX2dldCgmZ2xvYmFsX2NmZyk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZ2xvYmFsX2NmZy5taXJyb3JfbW9kZSAhPSBCQ01PTFRfUFNfTUlSUk9SX01PREVfQVVUTyAmJgorICAgICAgICBpbmQtPmhkci5zdWJncm91cCAhPSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9MT1MpCisgICAgeworICAgICAgICAvKiBvbmx5IGhhbmRsZSBtb3N0IGluZGljYXRpb25zIHdoaWxlIGluIG1pcnJvciBtb2RlICdhdXRvJywgYnV0IHBlcmZvcm0gYSBzd2l0Y2hvdmVyIG9uIExvUyBpbiBhbnkgY2FzZSAgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X3BzX3Bvbl9zdGF0ZV9nZXQocG9uLCAmc3RhdGUsICZwYXJ0bmVyKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChzdGF0ZSAhPSBCQ01PTFRfUFNfUE9OX1NUQVRFX1dPUktJTkcpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogaWdub3JlIGluZGljYXRpb25zIGZyb20gUE9OcyB0aGF0IGFyZW4ndCBwcm90ZWN0ZWQgd29ya2luZyAqLworICAgIH0KKworICAgIHN3aXRjaCAoaW5kLT5oZHIub2JqX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9OSToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0xPUzoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbmlfbG9zKCZnbG9iYWxfY2ZnLCBwb24sICgoY29uc3QgYmNtb2x0X3hncG9uX25pX2xvcyAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX3N0YXRlX2NoYW5nZWQoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbmlfdHJhZmZpY19yZXN1bWUocG9uLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV9vbnVzX3JhbmdlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgKilpbmQpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiBzaWxlbnRseSBpZ25vcmUgYWxsIG90aGVyIE5JIGluZGljYXRpb25zICovCisgICAgICAgIH0KKworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9yYW5naW5nX2NvbXBsZXRlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkKAorICAgICAgICAgICAgICAgIHBvbiwKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICBwb24sCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZW5hYmxlX2NvbXBsZXRlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2Rpc2FibGVfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2FsYXJtKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RPV0k6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9kb3dpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZG93aSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zZmkoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZmkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0RJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfc2RpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2RpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2RmaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X2RmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVUZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfc3VmaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X3N1ZmkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3Rpd2koJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV90aXdpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0xPT0NJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfbG9vY2koJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9sb29jaSAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgT05VIGluZGljYXRpb25zICovCisgICAgICAgIH0KKworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9hbGxvY19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgYWxsb2MgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsgLyogc29tZW9uZSBlbHNlIG5lZWRzIHRvIGhhbmRsZSB0aGlzIGluZGljYXRpb24gKi8KKyAgICB9Cit9CisKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fc3RhbmRieV94Z3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsKKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgKGJjbW9sdF94Z3Bvbl9uaSlwb24tPnBvbl9pZCB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBvbi0+ZGV2aWNlX2lkLCAmc2V0X3Bvbl9zdGF0ZS5oZHIpOworfQorCitiY21vc19lcnJubyBwc19tb3ZlX3RvX3dvcmtpbmdfeGdwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIHNldF9wb25fc3RhdGU7CisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IChiY21vbHRfeGdwb25fbmkpcG9uLT5wb25faWQgfTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJnNldF9wb25fc3RhdGUsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZzZXRfcG9uX3N0YXRlLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfV09SS0lORyk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwb24tPmRldmljZV9pZCwgJnNldF9wb25fc3RhdGUuaGRyKTsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWU3ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMgVXNlciBhcHBsaWNhdGlvbiB0byBjb3B5IGxvZyBwcmludHMgZnJvbSB0aGUgZGV2aWNlIHRvIGEgbG9jYWwgZmlsZSBvbiB0aGUgaG9zdAorCitpZmVxICgiJChFTkFCTEVfTE9HKSIsICJ5IikKKyAgICBpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKwlNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlcgorCU1PRF9UWVBFID0gbGliCisJTU9EX0RFUFMgPSBob3N0X2FwaSBkZXZfbG9nCisJaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJICAgIE1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKwllbmRpZgorCXNyY3MgPSBiY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuYyBcCisJICAgICAgIGJjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlcl9jbGkuYworICAgIGVuZGlmCitlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNiZWRkZgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyLmgiCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICBGSUxFICpmaWxlX2hhbmRsZTsKKyAgICB1aW50NjRfdCBmaWxlX3NpemU7CisgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfY2ZnIGNmZzsKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgYmNtb3NfdGltZXIgdGltZXI7CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7Cit9IHJlbW90ZV9sb2dnZXJbQkNNVFJfTUFYX09MVFNdID0ge307CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyByZW1vdGVfbG9nZ2VyX3RpbWVyX2hhbmRsZXIoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpZGF0YTsKKyAgICBpbnQgd3JpdHRlbjsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgLmZpbGVfaWQgPSBCQ01PTFRfTE9HX0ZJTEVfSURfRERSIH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIpOworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZSwgJmNmZy5oZHIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJMb2dnZXIgZ2V0IEFQSSByZXR1cm5lZCAnJXMnICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RvcChkZXZpY2UpOworICAgICAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7CisgICAgfQorCisgICAgd3JpdHRlbiA9IGZwcmludGYoCisgICAgICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSwKKyAgICAgICAgIiUuKnMiLAorICAgICAgICAoaW50KXNpemVvZihjZmcuZGF0YS5idWZmZXIuYnVmZiksCisgICAgICAgIGNmZy5kYXRhLmJ1ZmZlci5idWZmKTsKKyAgICBpZiAod3JpdHRlbiA8IDApCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfbG9nZ2VyW2RldmljZV0ubG9nX2lkLCAiRmlsZSB3cml0ZSByZXR1cm5lZCAlZFxuIiwgd3JpdHRlbik7CisgICAgICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RvcChkZXZpY2UpOworICAgICAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7CisgICAgfQorCisgICAgZmZsdXNoKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSk7CisKKyAgICAvKiBDaGVjayB0byBzZWUgaWYgd2Ugd2lsbCBleGNlZWQgdGhlIG1heCBmaWxlIHNpemUgbmV4dCB0aW1lIHdlIHdyaXRlIGEgY2h1bmsuICovCisgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfc2l6ZSArPSB3cml0dGVuOworICAgIGlmIChyZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9zaXplICsgc2l6ZW9mKGNmZy5kYXRhLmJ1ZmZlci5idWZmKSA+IHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcubWF4X2ZpbGVfc2l6ZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5tYXhfZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfU1RPUDoKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJNYXggZmlsZSBzaXplIHJlYWNoZWQgLSByZW1vdGUgbG9nZ2VyIHN0b3BwZWRcbiIpOworICAgICAgICAgICAgICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RvcChkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfQ0xFQVI6CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCByZW1vdGVfbG9nZ2VyW2RldmljZV0ubG9nX2lkLCAiTWF4IGZpbGUgc2l6ZSByZWFjaGVkIC0gbG9nIGZpbGUgY2xlYXJlZFxuIik7CisgICAgICAgICAgICAgICAgLyogdGhlIGVhc2llc3Qgd2F5IHRvIGNsZWFyIHRoZSBmaWxlIGlzIHRvIGNsb3NlL3JlLW9wZW4gaXQgKi8KKyAgICAgICAgICAgICAgICBmY2xvc2UocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9oYW5kbGUgPSBmb3BlbihyZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnLmZpbGVuYW1lLCAidyIpOworICAgICAgICAgICAgICAgIEJVR19PTihyZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9oYW5kbGUgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNmZy5kYXRhLmJ1ZmZlci5tc2dfdG9fcmVhZCA9PSAwKQorICAgIHsKKyAgICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgbWVzc2FnZXMgdG8gcmVhZCByaWdodCBub3csIHdhaXQgZm9yIHRoZSBlbnRpcmUgcG9sbGluZyBpbnRlcnZhbC4gKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAmcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRpbWVyLAorICAgICAgICAgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5wb2xsaW5nX3BlcmlvZF9tcyAqIDEwMDApOyAvKiBtcyB0byB1cyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGVyZSBhcmUgbW9yZSBtZXNzYWdlcyB0byByZWFkIC0gd2FpdCBmb3Igb25seSB0aGUgJ3N1YnNlcXVlbnQgZGVsYXknIHRpbWUuICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KAorICAgICAgICAgICAgJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50aW1lciwKKyAgICAgICAgICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcuc3Vic2VxdWVudF9kZWxheV9tcyAqIDEwMDApOyAvKiBtcyB0byB1cyAqLworICAgIH0KKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKwordm9pZCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2luaXQoKQoreworICAgIHN0YXRpYyBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9VU0VSX0FQUExfUkVNT1RFX0xPR0dFUiwKKyAgICAgICAgLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisgICAgc3RhdGljIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAuc2l6ZSA9IDEgfSAvKiBqdXN0IHRoZSB0aW1lciBtZXNzYWdlICovCisgICAgfTsKKyAgICBzdGF0aWMgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnBlcmlvZGljID0gQkNNT1NfRkFMU0UsIC8qIHdlIHdpbGwgcmUtZW5hYmxlIHRoZSB0aW1lciBhZnRlciBlYWNoIHRpY2sgKi8KKyAgICAgICAgLmhhbmRsZXIgPSByZW1vdGVfbG9nZ2VyX3RpbWVyX2hhbmRsZXIKKyAgICB9OworCisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisKKyAgICBmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisgICAgICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX1JFTU9URV9MT0dHRVJfREVWMCArIGRldmljZTsKKyAgICAgICAgc25wcmludGYoCisgICAgICAgICAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzay5uYW1lLAorICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS50YXNrLm5hbWUpLAorICAgICAgICAgICAgInVzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyJXUiLAorICAgICAgICAgICAgZGV2aWNlKTsKKworICAgICAgICB0YXNrX3BhcmFtcy5uYW1lID0gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2submFtZTsKKyAgICAgICAgbW9kdWxlX3BhcmFtcy5xcGFybS5uYW1lID0gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2submFtZTsKKyAgICAgICAgdGltZXJfcGFyYW1zLm93bmVyID0gbW9kdWxlX2lkOworICAgICAgICB0aW1lcl9wYXJhbXMubmFtZSA9IHJlbW90ZV9sb2dnZXJbZGV2aWNlXS50YXNrLm5hbWU7CisgICAgICAgIHRpbWVyX3BhcmFtcy5kYXRhID0gKGxvbmcpZGV2aWNlOworCisgICAgICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzaywgJnRhc2tfcGFyYW1zKTsKKyAgICAgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKKworICAgICAgICBlcnIgPSBiY21vc19tb2R1bGVfY3JlYXRlKG1vZHVsZV9pZCwgJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50YXNrLCAmbW9kdWxlX3BhcmFtcyk7CisgICAgICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgZXJyID0gYmNtb3NfdGltZXJfY3JlYXRlKCZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGltZXIsICZ0aW1lcl9wYXJhbXMpOworICAgICAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQgPQorICAgICAgICAgICAgYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIocmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2submFtZSwgREVWX0xPR19MRVZFTF9XQVJOSU5HLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgfQorfQorCitiY21vc19lcnJubyBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dnZXJfY2ZnIGNmZzsKKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IC5maWxlX2lkID0gQkNNT0xUX0xPR19GSUxFX0lEX0REUiB9OworCisgICAgaWYgKGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaXNfcnVubmluZyhkZXZpY2UpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIlJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorCisgICAgLyogY29uZmlndXJlIEREUiBsb2cgZmlsZSB0byBjbGVhciBvbiByZWFkIHNvIHdlIGNhbiBhbHdheXMgc3RheSB1cC10by1kYXRlICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgZW5hYmxlX2xvZywgQkNNT1NfVFJVRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGNsZWFyX2FmdGVyX3JlYWQsIEJDTU9TX1RSVUUpOworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfbG9nZ2VyW2RldmljZV0ubG9nX2lkLCAiTG9nZ2VyIHNldCBBUEkgcmV0dXJuZWQgJyVzJyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9IGZvcGVuKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcuZmlsZW5hbWUsICJ3Iik7CisgICAgaWYgKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIkNvdWxkIG5vdCBvcGVuIGZpbGUgJyVzJ1xuIiwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5maWxlbmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lPOworICAgIH0KKyAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9zaXplID0gMDsKKworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGltZXIsIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcucG9sbGluZ19wZXJpb2RfbXMgKiAxMDAwKTsgLyogbXMgdG8gdXMgKi8KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgaWYgKCFiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2lzX3J1bm5pbmcoZGV2aWNlKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIGlzIG5vdCBydW5uaW5nLlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorCisgICAgYmNtb3NfdGltZXJfc3RvcCgmcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRpbWVyKTsKKyAgICBmY2xvc2UocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlKTsKKyAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9oYW5kbGUgPSBOVUxMOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaXNfcnVubmluZyhiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIHJldHVybiBiY21vc190aW1lcl9pc19ydW5uaW5nKCZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGltZXIpOworfQorCitiY21vc19lcnJubyBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X3JlbW90ZV9sb2dnZXJfY2ZnICpjZmcpCit7CisgICAgKmNmZyA9IHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmc7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2ZnX3VwZGF0ZShiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgKmNmZykKK3sKKyAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnID0gKmNmZzsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEyMmZkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9SRU1PVEVfTE9HR0VSX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX1JFTU9URV9MT0dHRVJfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKworI2RlZmluZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFTkFNRV9NQVhfTEVOIDEyOAorCisvKiogUG9zc2libGUgYWN0aW9ucyB0byB0YWtlIHdoZW4gdGhlIG1heCBsb2cgZmlsZSBzaXplIGlzIHJlYWNoZWQuICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFX1NJWkVfUkVBQ0hFRF9CRUhBVklPUl9TVE9QLCAgLyoqPCBTdG9wIHRoZSByZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uLiAqLworICAgIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVfU0laRV9SRUFDSEVEX0JFSEFWSU9SX0NMRUFSLCAvKio8IENsZWFyIGFsbCBjb250ZW50IGZyb20gdGhlIGZpbGUgYW5kIGNvbnRpbnVlLiAqLworfSBiY21vbHRfcmVtb3RlX2xvZ2dlcl9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcjsKKworLyoqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCBwb2xsaW5nX3BlcmlvZF9tczsgICAvKio8IFRpbWUgdG8gd2FpdCBpbiBiZXR3ZWVuIHBvbGxpbmcgQVBJIGNhbGxzLiAqLworICAgIHVpbnQzMl90IHN1YnNlcXVlbnRfZGVsYXlfbXM7IC8qKjwgTWludW11bSByZXF1aXJlZCB0aW1lIHRvIHdhaXQgaW4gYmV0d2VlbiBzdXNlcXVlbnQgQVBJIGNhbGxzLiAqLworICAgIHVpbnQzMl90IG1heF9maWxlX3NpemU7ICAgICAgIC8qKjwgTWF4aW11bSBzaXplIGZvciB0aGUgb3V0cHV0IGZpbGUgaW4gYnl0ZXMuICovCisKKyAgICAvKiogT3V0cHV0IGZpbGUgZnVsbCBwYXRoLiAqLworICAgIGNoYXIgZmlsZW5hbWVbQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRU5BTUVfTUFYX0xFTl07CisKKyAgICAvKiogQmVoYXZpb3Igd2hlbiB0aGUgbWF4IGZpbGUgc2l6ZSBpcyByZWFjaGVkLiAqLworICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2ZpbGVfc2l6ZV9yZWFjaGVkX2JlaGF2aW9yIG1heF9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcjsKK30gYmNtb2x0X3JlbW90ZV9sb2dnZXJfY2ZnOworCisvKiogSW5pdGlhbGl6ZSB0aGUgcmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiAodGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzIHBhcnQgb2YgYXBwbGljYXRpb24gc3RhcnR1cCkuICovCit2b2lkIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaW5pdCh2b2lkKTsKKworLyoqIFN0YXJ0IHRoZSByZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgYXBwbGljYXRpb24gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qKiBTdG9wIHRoZSByZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgYXBwbGljYXRpb24gd2FzIHN0b3BwZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RvcChiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyoqIFF1ZXJ5IHdoZXRoZXIgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHJ1bm5pbmcuCisgKiBccmV0dXJuICAgICAgICBCQ01PU19UUlVFIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLCBCQ01PU19GQUxTRSBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9pc19ydW5uaW5nKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCisvKiogR2V0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSByZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uLgorICogXHBhcmFtW291dF0gY2ZnIFJlbW90ZSBsb2dnZXIgY29uZmlndXJhdGlvbi4KKyAqIFxyZXR1cm4gICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBjb25maWd1cmF0aW9uIHdhcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgKmNmZyk7CisKKy8qKiBDaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uCisgKiBccGFyYW1baW5dIGNmZyBSZW1vdGUgbG9nZ2VyIGNvbmZpZ3VyYXRpb24uCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBjb25maWd1cmF0aW9uIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2NmZ191cGRhdGUoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X3JlbW90ZV9sb2dnZXJfY2ZnICpjZmcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzRmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oIgorI2luY2x1ZGUgImJjbW9sdF9jb252LmgiCisKKyNkZWZpbmUgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9QT0xMSU5HX1BFUklPRF9NUyAgICAgNTAwMAorI2RlZmluZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX1NVQlNFUVVFTlRfREVMQVlfTVMgICA1CisjZGVmaW5lIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0RFRkFVTFRfTUFYX0ZJTEVfU0laRSAgICAgICAgICgyMDAgKiAxMDAwMDAwKSAKKyNkZWZpbmUgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9GSUxFX1JFQUNIRURfQkVIQVZJT1IgInN0b3AiCisjZGVmaW5lIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0RFRkFVTFRfRklMRU5BTUUgICAgICAgICAgICAgICJyZW1vdGVfbG9nLnR4dCIKKworc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9sb2dnZXJfY29uZmlndXJlX2xvZygKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfa2V5ICprZXksCisgICAgYmNtb2x0X2xvZ19sZXZlbCBsb2dfbGV2ZWxfc2F2ZSkKK3sKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7CisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwgKmtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlLCBsb2dfbGV2ZWxfc2F2ZSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9wcmludCwgQkNNT0xUX0xPR19MRVZFTF9XQVJOSU5HKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoZGV2aWNlLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByZW1vdGVfbG9nZ2VyX2NvbmZpZ3VyZV9sb2dzKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0OworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnIG11bHRpX2NmZzsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBtdWx0aV9rZXkgPSB7IC5sb2dfaWQgPSAwIH07IC8qIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGxvZyBJRCAqLworICAgIHVpbnQxNl90IGk7CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgbXVsdGktZ2V0IHJldHVybiAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgNTAsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgdGhlIG11bHRpLWdldCBjb25maWcgc3RydWN0dXJlICovCisgICAgQkNNT0xUX0NGR19JTklUKCZtdWx0aV9jZmcsIGxvZ19lbnRyeSwgbXVsdGlfa2V5KTsKKyAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKTsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBjYWxsIG11bHRpLWdldCBBUEkgKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlLCAmbXVsdGlfY2ZnLmhkciwgQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZvciBlYWNoIGxvZyBlbnRyeSwgcmVjb25maWd1cmUgaXQgdG8gcHJpbnQgb25seSB3YXJuaW5nIGxldmVsIGFuZCBhYm92ZSB0byB0aGUgc2NyZWVuIChrZWVwaW5nIGN1cnJlbnQKKyAgICAgICAgICogYmVoYXZpb3IgZm9yIHByaW50aW5nIHRvIFJBTSBmaWxlcykgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgKmNmZyA9IChiY21vbHRfbG9nX2VudHJ5X2NmZyAqKW1zZ19zZXQtPm1zZ1tpXTsKKyAgICAgICAgICAgIGVyciA9IHJlbW90ZV9sb2dnZXJfY29uZmlndXJlX2xvZyhkZXZpY2UsICZjZmctPmtleSwgY2ZnLT5kYXRhLmxvZ19sZXZlbF9zYXZlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZSB0aGUga2V5IGZvciBuZXh0IGNhbGwgKi8KKyAgICAgICAgbXVsdGlfY2ZnLmtleSA9ICooKGJjbW9sdF9sb2dfZW50cnlfa2V5ICopbXNnX3NldC0+bmV4dF9rZXkpOworCisgICAgLyoga2VlcCBjYWxsaW5nIHRoZSBmdW5jdGlvbiB1bnRpbCB3ZSBoYXZlIHJldHJpZXZlZCBhbGwgZW50cmllcyAqLworICAgIH0gd2hpbGUgKG1zZ19zZXQtPm1vcmUpOworCisgICAgYmNtb2x0X21zZ19zZXRfZnJlZShtc2dfc2V0KTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2xvZ2dlcl9jbWRfc3RhcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIC8qIHRoZXNlIHBhcmFtZXRlcnMgd2lsbCBhbHdheXMgYmUgbm9uLU5VTEwgc2luY2UgdGhleSBoYXZlIGRlZmF1bHQgdmFsdWVzICovCisgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfY2ZnIGNmZyA9IAorICAgIHsKKyAgICAgICAgLm1heF9maWxlX3NpemUgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfZmlsZV9zaXplIiktPnZhbHVlLnVudW1iZXIsCisgICAgICAgIC5tYXhfZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3IgPSAoYmNtb2x0X3JlbW90ZV9sb2dnZXJfZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3IpCisgICAgICAgICAgICBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX3NpemVfcmVhY2hlZCIpLT52YWx1ZS5udW1iZXIsCisgICAgICAgIC5wb2xsaW5nX3BlcmlvZF9tcyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbGxpbmdfcGVyaW9kIiktPnZhbHVlLnVudW1iZXIsCisgICAgICAgIC5zdWJzZXF1ZW50X2RlbGF5X21zID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3Vic2VxdWVudF9kZWxheSIpLT52YWx1ZS51bnVtYmVyLAorICAgIH07CisgICAgc3RybmNweSgKKyAgICAgICAgY2ZnLmZpbGVuYW1lLAorICAgICAgICBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlbmFtZSIpLT52YWx1ZS5zdHJpbmcsCisgICAgICAgIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVOQU1FX01BWF9MRU4gLSAxKTsgLyogbGVhdmUgcm9vbSBmb3IgdGVybWluYXRvciAqLworCisgICAgLyogaWYgdGhlIHVzZXIgcmVxdWVzdGVkLCBzZXQgYWxsIGxvZ3Mgb24gdGhlIGRldmljZSB0byBwcmludCB3YXJuaW5ncy9lcnJvcnMgb25seSAqLworICAgIGlmICgoYmNtb3NfYm9vbCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmVfbG9ncyIpLT52YWx1ZS5udW1iZXIpCisgICAgeworICAgICAgICBlcnIgPSByZW1vdGVfbG9nZ2VyX2NvbmZpZ3VyZV9sb2dzKGN1cnJlbnRfZGV2aWNlKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSZWNvbmZpZ3VyZWQgYWxsIGxvZyBlbnRyaWVzIHRvIHByaW50IHdhcm5pbmcvZXJyb3IgbWVzc2FnZXMgb25seVxuIik7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jZmdfdXBkYXRlKGN1cnJlbnRfZGV2aWNlLCAmY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RhcnQoY3VycmVudF9kZXZpY2UpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIHN0YXJ0ZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2xvZ2dlcl9jbWRfc3RvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGN1cnJlbnRfZGV2aWNlKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBzdG9wcGVkXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9sb2dnZXJfY21kX3N0YXR1cyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgc3RhdGljIGludDJzdHJfdCBmaWxlX3NpemVfcmVhY2hlZDJzdHJbXSA9CisgICAgeworICAgICAgICB7IEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVfU0laRV9SRUFDSEVEX0JFSEFWSU9SX1NUT1AsICJzdG9wIiB9LAorICAgICAgICB7IEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVfU0laRV9SRUFDSEVEX0JFSEFWSU9SX0NMRUFSLCAiY2xlYXIiIH0sCisgICAgICAgIHsgLTEgfQorICAgIH07CisKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfY2ZnIGNmZzsKKworICAgIGlmIChiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2lzX3J1bm5pbmcoY3VycmVudF9kZXZpY2UpKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24gaXMgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2ZnX2dldChjdXJyZW50X2RldmljZSwgJmNmZyk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJmaWxlbmFtZT0lc1xuIiwgY2ZnLmZpbGVuYW1lKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIm1heF9maWxlX3NpemU9JXVcbiIsIGNmZy5tYXhfZmlsZV9zaXplKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgImZpbGVfc2l6ZV9yZWFjaGVkPSVzXG4iLAorICAgICAgICAgICAgaW50MnN0cihmaWxlX3NpemVfcmVhY2hlZDJzdHIsIGNmZy5tYXhfZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3IpKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgInBvbGxpbmdfcGVyaW9kPSV1XG4iLCBjZmcucG9sbGluZ19wZXJpb2RfbXMpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAic3Vic2VxdWVudF9kZWxheT0ldVxuIiwgY2ZnLnN1YnNlcXVlbnRfZGVsYXlfbXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBpcyBub3QgcnVubmluZ1xuIik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3JfdGFibGVbXSA9CisgICAgeworICAgICAgICB7ICJzdG9wIiwgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfU1RPUCB9LAorICAgICAgICB7ICJjbGVhciIsIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVfU0laRV9SRUFDSEVEX0JFSEFWSU9SX0NMRUFSIH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgYmNtY2xpX2VudHJ5ICpkaXIgPSBiY21jbGlfZGlyX2FkZCgKKyAgICAgICAgdG9wX2RpciwKKyAgICAgICAgInJlbW90ZV9sb2dnZXIiLAorICAgICAgICAiUGVyaW9kaWNhbGx5IGNvcHkgZGV2aWNlIGxvZyB0byBsb2NhbCBmaWxlIiwKKyAgICAgICAgQkNNQ0xJX0FDQ0VTU19BRE1JTiwKKyAgICAgICAgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFkaXIsIEJDTV9FUlJfTk9NRU0pOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInN0YXJ0IiwgIlN0YXJ0IHBlcmlvZGljYWxseSBjb3B5aW5nIGRldmljZSBsb2cgdG8gaG9zdCIsIHJlbW90ZV9sb2dnZXJfY21kX3N0YXJ0LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgKKyAgICAgICAgICAgICJmaWxlbmFtZSIsCisgICAgICAgICAgICAiT3V0cHV0IGZpbGUgcGF0aCIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9TVFJJTkcsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgKGxvbmcpQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9GSUxFTkFNRSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fREVGVkFMKAorICAgICAgICAgICAgIm1heF9maWxlX3NpemUiLAorICAgICAgICAgICAgIk1heGltdW0gb3V0cHV0IGZpbGUgc2l6ZSBpbiBieXRlcyIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCwKKyAgICAgICAgICAgIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0RFRkFVTFRfTUFYX0ZJTEVfU0laRSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTV9ERUZWQUwoCisgICAgICAgICAgICAiZmlsZV9zaXplX3JlYWNoZWQiLAorICAgICAgICAgICAgIkJlaGF2aW9yIHdoZW4gbWF4IGZpbGUgc2l6ZSBpcyByZWFjaGVkIiwKKyAgICAgICAgICAgIGZpbGVfc2l6ZV9yZWFjaGVkX2JlaGF2aW9yX3RhYmxlLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCwKKyAgICAgICAgICAgIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0RFRkFVTFRfRklMRV9SRUFDSEVEX0JFSEFWSU9SKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoCisgICAgICAgICAgICAicG9sbGluZ19wZXJpb2QiLAorICAgICAgICAgICAgIlBvbGxpbmcgcGVyaW9kIGluIG1zIiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9QT0xMSU5HX1BFUklPRF9NUyksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fREVGVkFMKAorICAgICAgICAgICAgInN1YnNlcXVlbnRfZGVsYXkiLAorICAgICAgICAgICAgIkRlbGF5IGJldHdlZW4gcmVwZWF0ZWQgQVBJIGNhbGxzIGluIG1zIiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9TVUJTRVFVRU5UX0RFTEFZX01TKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNX0RFRlZBTCgKKyAgICAgICAgICAgICJjb25maWd1cmVfbG9ncyIsCisgICAgICAgICAgICAiQ29uZmlndXJlIGFsbCBkZXZpY2UgbG9ncyB0byBwcmludCBlcnJvci93YXJuaW5nIG9ubHkiLAorICAgICAgICAgICAgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAieWVzIikpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdG9wIiwgIlN0b3AgcGVyaW9kaWNhbGx5IGNvcHlpbmcgZGV2aWNlIGxvZyB0byBob3N0IiwgcmVtb3RlX2xvZ2dlcl9jbWRfc3RvcCk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgInN0YXR1cyIsICJTaG93IHN0YXR1cyAvIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIsIHJlbW90ZV9sb2dnZXJfY21kX3N0YXR1cyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWVmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9SRU1PVEVfTEVBUk5JTkdfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX1JFTU9URV9MRUFSTklOR19DTElfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCitiY21vc19lcnJubyBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9zd191cGdyYWRlL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9zd191cGdyYWRlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDFhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIyBTVyB1cGdyYWRlIGFwcGxpY2F0aW9uCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9OQU1FID0gYmNtX3N3X3VwZ3JhZGUKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gaG9zdF9hcGkKKyAgICBzcmNzID0gYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmMKKyAgICAKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICAgICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorICAgIGVuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9zd191cGdyYWRlL2JjbW9sdF9zd191cGdyYWRlX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9zd191cGdyYWRlL2JjbW9sdF9zd191cGdyYWRlX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjAzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmMKQEAgLTAsMCArMSw3MCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpX2hlbHBlcnMuaD4KKyNpbmNsdWRlICJiY21vbHRfc3dfdXBncmFkZV9jbGkuaCIKKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N3X3VwZ3JhZGVfYWN0aXZhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSBvcGVyX3N3X3VwZ3JhZGVfYWN0aXZhdGU7CisgICAgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0IG9wZXJfZGlzY29ubmVjdDsKKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Qgb3Blcl9jb25uZWN0OworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXJfc3dfdXBncmFkZV9hY3RpdmF0ZSwgZGV2aWNlLCBzd191cGdyYWRlX2FjdGl2YXRlLCBrZXkpOworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blcl9zd191cGdyYWRlX2FjdGl2YXRlLmhkcik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXJfZGlzY29ubmVjdCwgZGV2aWNlLCBkaXNjb25uZWN0LCBrZXkpOworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blcl9kaXNjb25uZWN0Lmhkcik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXJfY29ubmVjdCwgZGV2aWNlLCBjb25uZWN0LCBrZXkpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoMCwgJm9wZXJfY29ubmVjdC5oZHIpOworfQorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9zd191cGdyYWRlX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgInN3X3VwZ3JhZGUiLAorICAgICAgICAiU29mdHdhcmUgdXBncmFkZSB1c2VyIGFwcGxpY2F0aW9uIiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFkaXIsIEJDTV9FUlJfTk9NRU0pOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJhY3RpdmF0ZSIsICJTVyB1cGdyYWRlIGltYWdlIGFjdGl2YXRpb24iLCBiY21vbHRfdXNlcl9hcHBsX2NsaV9zd191cGdyYWRlX2FjdGl2YXRlKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxNWE5NQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9iY21vbHRfc3dfdXBncmFkZV9jbGkuaApAQCAtMCwwICsxLDM4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX1NXX1VQR1JBREVfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfU1dfVVBHUkFERV9DTElfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9zd191cGdyYWRlX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCg==